hotspot/src/share/vm/c1/c1_GraphBuilder.hpp
author iveresov
Thu, 02 Dec 2010 17:21:12 -0800
changeset 7432 f06f1253c317
parent 7397 5b173b4ca846
child 10509 43d670e5701e
permissions -rw-r--r--
7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer Summary: C1 with profiling doesn't check whether the MDO has been really allocated, which can silently fail if the perm gen is full. The solution is to check if the allocation failed and bailout out of inlining or compilation. Reviewed-by: kvn, never
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
     2
 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1623
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1623
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1623
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6751
diff changeset
    25
#ifndef SHARE_VM_C1_C1_GRAPHBUILDER_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6751
diff changeset
    26
#define SHARE_VM_C1_C1_GRAPHBUILDER_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6751
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6751
diff changeset
    28
#include "c1/c1_IR.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6751
diff changeset
    29
#include "c1/c1_Instruction.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6751
diff changeset
    30
#include "c1/c1_ValueMap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6751
diff changeset
    31
#include "c1/c1_ValueStack.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6751
diff changeset
    32
#include "ci/ciMethodData.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6751
diff changeset
    33
#include "ci/ciStreams.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6751
diff changeset
    34
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
class MemoryBuffer;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
class GraphBuilder VALUE_OBJ_CLASS_SPEC {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
  // Per-scope data. These are pushed and popped as we descend into
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
  // inlined methods. Currently in order to generate good code in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
  // inliner we have to attempt to inline methods directly into the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
  // basic block we are parsing; this adds complexity.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
  class ScopeData: public CompilationResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
   private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
    ScopeData*  _parent;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
    // bci-to-block mapping
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
    BlockList*   _bci2block;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
    // Scope
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
    IRScope*     _scope;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
    // Whether this scope or any parent scope has exception handlers
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
    bool         _has_handler;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
    // The bytecodes
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
    ciBytecodeStream* _stream;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
    // Work list
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
    BlockList*   _work_list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
    // Maximum inline size for this scope
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
    intx         _max_inline_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
    // Expression stack depth at point where inline occurred
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
    int          _caller_stack_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
    // The continuation point for the inline. Currently only used in
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
    // multi-block inlines, but eventually would like to use this for
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
    // all inlines for uniformity and simplicity; in this case would
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
    // get the continuation point from the BlockList instead of
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
    // fabricating it anew because Invokes would be considered to be
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
    // BlockEnds.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
    BlockBegin*  _continuation;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
    // Was this ScopeData created only for the parsing and inlining of
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
    // a jsr?
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
    bool         _parsing_jsr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
    // We track the destination bci of the jsr only to determine
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
    // bailout conditions, since we only handle a subset of all of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
    // possible jsr-ret control structures. Recursive invocations of a
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
    // jsr are disallowed by the verifier.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
    int          _jsr_entry_bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
    // We need to track the local variable in which the return address
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
    // was stored to ensure we can handle inlining the jsr, because we
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
    // don't handle arbitrary jsr/ret constructs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
    int          _jsr_ret_addr_local;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
    // If we are parsing a jsr, the continuation point for rets
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
    BlockBegin*  _jsr_continuation;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
    // Cloned XHandlers for jsr-related ScopeDatas
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
    XHandlers*   _jsr_xhandlers;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
    // Number of returns seen in this scope
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
    int          _num_returns;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
    // In order to generate profitable code for inlining, we currently
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
    // have to perform an optimization for single-block inlined
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
    // methods where we continue parsing into the same block. This
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
    // allows us to perform CSE across inlined scopes and to avoid
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
    // storing parameters to the stack. Having a global register
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
    // allocator and being able to perform global CSE would allow this
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
    // code to be removed and thereby simplify the inliner.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
    BlockBegin*  _cleanup_block;       // The block to which the return was added
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
    Instruction* _cleanup_return_prev; // Instruction before return instruction
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
    ValueStack*  _cleanup_state;       // State of that block (not yet pinned)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
   public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
    ScopeData(ScopeData* parent);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
    ScopeData* parent() const                      { return _parent;            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
    BlockList* bci2block() const                   { return _bci2block;         }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
    void       set_bci2block(BlockList* bci2block) { _bci2block = bci2block;    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
    // NOTE: this has a different effect when parsing jsrs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
    BlockBegin* block_at(int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
    IRScope* scope() const                         { return _scope;             }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
    // Has side-effect of setting has_handler flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
    void set_scope(IRScope* scope);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
    // Whether this or any parent scope has exception handlers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
    bool has_handler() const                       { return _has_handler;       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
    void set_has_handler()                         { _has_handler = true;       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
    // Exception handlers list to be used for this scope
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
    XHandlers* xhandlers() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
    // How to get a block to be parsed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
    void add_to_work_list(BlockBegin* block);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
    // How to remove the next block to be parsed; returns NULL if none left
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
    BlockBegin* remove_from_work_list();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
    // Indicates parse is over
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
    bool is_work_list_empty() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
    ciBytecodeStream* stream()                     { return _stream;            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
    void set_stream(ciBytecodeStream* stream)      { _stream = stream;          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
    intx max_inline_size() const                   { return _max_inline_size;   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
    BlockBegin* continuation() const               { return _continuation;      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
    void set_continuation(BlockBegin* cont)        { _continuation = cont;      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
    // Indicates whether this ScopeData was pushed only for the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
    // parsing and inlining of a jsr
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
    bool parsing_jsr() const                       { return _parsing_jsr;       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
    void set_parsing_jsr()                         { _parsing_jsr = true;       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
    int  jsr_entry_bci() const                     { return _jsr_entry_bci;     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
    void set_jsr_entry_bci(int bci)                { _jsr_entry_bci = bci;      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
    void set_jsr_return_address_local(int local_no){ _jsr_ret_addr_local = local_no; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
    int  jsr_return_address_local() const          { return _jsr_ret_addr_local; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
    // Must be called after scope is set up for jsr ScopeData
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
    void setup_jsr_xhandlers();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
    // The jsr continuation is only used when parsing_jsr is true, and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
    // is different from the "normal" continuation since we can end up
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
    // doing a return (rather than a ret) from within a subroutine
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
    BlockBegin* jsr_continuation() const           { return _jsr_continuation;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
    void set_jsr_continuation(BlockBegin* cont)    { _jsr_continuation = cont;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
    int num_returns();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
    void incr_num_returns();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
    void set_inline_cleanup_info(BlockBegin* block,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
                                 Instruction* return_prev,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
                                 ValueStack* return_state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
    BlockBegin*  inline_cleanup_block() const      { return _cleanup_block; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
    Instruction* inline_cleanup_return_prev() const{ return _cleanup_return_prev; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
    ValueStack*  inline_cleanup_state() const      { return _cleanup_state; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  // for all GraphBuilders
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  static bool       _can_trap[Bytecodes::number_of_java_codes];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  // for each instance of GraphBuilder
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  ScopeData*        _scope_data;                 // Per-scope data; used for inlining
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  Compilation*      _compilation;                // the current compilation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  ValueMap*         _vmap;                       // the map of values encountered (for CSE)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  MemoryBuffer*     _memory;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  const char*       _inline_bailout_msg;         // non-null if most recent inline attempt failed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  int               _instruction_count;          // for bailing out in pathological jsr/ret cases
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  BlockBegin*       _start;                      // the start block
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  BlockBegin*       _osr_entry;                  // the osr entry block block
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  ValueStack*       _initial_state;              // The state for the start block
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  // for each call to connect_to_end; can also be set by inliner
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  BlockBegin*       _block;                      // the current block
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  ValueStack*       _state;                      // the current execution state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  Instruction*      _last;                       // the last instruction added
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  bool              _skip_block;                 // skip processing of the rest of this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  ScopeData*        scope_data() const           { return _scope_data; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  Compilation*      compilation() const          { return _compilation; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  BlockList*        bci2block() const            { return scope_data()->bci2block(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  ValueMap*         vmap() const                 { assert(UseLocalValueNumbering, "should not access otherwise"); return _vmap; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  bool              has_handler() const          { return scope_data()->has_handler(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  BlockBegin*       block() const                { return _block; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  ValueStack*       state() const                { return _state; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  void              set_state(ValueStack* state) { _state = state; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  IRScope*          scope() const                { return scope_data()->scope(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  ciMethod*         method() const               { return scope()->method(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  ciBytecodeStream* stream() const               { return scope_data()->stream(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  Instruction*      last() const                 { return _last; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  Bytecodes::Code   code() const                 { return stream()->cur_bc(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  int               bci() const                  { return stream()->cur_bci(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  int               next_bci() const             { return stream()->next_bci(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  // unified bailout support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  void bailout(const char* msg) const            { compilation()->bailout(msg); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  bool bailed_out() const                        { return compilation()->bailed_out(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  // stack manipulation helpers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  void ipush(Value t) const                      { state()->ipush(t); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  void lpush(Value t) const                      { state()->lpush(t); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  void fpush(Value t) const                      { state()->fpush(t); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  void dpush(Value t) const                      { state()->dpush(t); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  void apush(Value t) const                      { state()->apush(t); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  void  push(ValueType* type, Value t) const     { state()-> push(type, t); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  Value ipop()                                   { return state()->ipop(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  Value lpop()                                   { return state()->lpop(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  Value fpop()                                   { return state()->fpop(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  Value dpop()                                   { return state()->dpop(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  Value apop()                                   { return state()->apop(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  Value  pop(ValueType* type)                    { return state()-> pop(type); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  // instruction helpers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  void load_constant();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  void load_local(ValueType* type, int index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  void store_local(ValueType* type, int index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  void store_local(ValueStack* state, Value value, ValueType* type, int index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  void load_indexed (BasicType type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  void store_indexed(BasicType type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  void stack_op(Bytecodes::Code code);
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   232
  void arithmetic_op(ValueType* type, Bytecodes::Code code, ValueStack* state_before = NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  void negate_op(ValueType* type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  void shift_op(ValueType* type, Bytecodes::Code code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  void logic_op(ValueType* type, Bytecodes::Code code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  void compare_op(ValueType* type, Bytecodes::Code code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  void convert(Bytecodes::Code op, BasicType from, BasicType to);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  void increment();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  void _goto(int from_bci, int to_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  void if_node(Value x, If::Condition cond, Value y, ValueStack* stack_before);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  void if_zero(ValueType* type, If::Condition cond);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  void if_null(ValueType* type, If::Condition cond);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  void if_same(ValueType* type, If::Condition cond);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  void jsr(int dest);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  void ret(int local_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  void table_switch();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  void lookup_switch();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  void method_return(Value x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  void call_register_finalizer();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  void access_field(Bytecodes::Code code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  void invoke(Bytecodes::Code code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  void new_instance(int klass_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  void new_type_array();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  void new_object_array();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  void check_cast(int klass_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  void instance_of(int klass_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  void monitorenter(Value x, int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  void monitorexit(Value x, int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  void new_multi_array(int dimensions);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  void throw_op(int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  Value round_fp(Value fp_value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  // stack/code manipulation helpers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  Instruction* append_with_bci(Instruction* instr, int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  Instruction* append(Instruction* instr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  Instruction* append_split(StateSplit* instr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  // other helpers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  BlockBegin* block_at(int bci)                  { return scope_data()->block_at(bci); }
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   270
  XHandlers* handle_exception(Instruction* instruction);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  void connect_to_end(BlockBegin* beg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  void null_check(Value value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  void eliminate_redundant_phis(BlockBegin* start);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  BlockEnd* iterate_bytecodes_for_block(int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  void iterate_all_blocks(bool start_in_current_block_for_inlining = false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  Dependencies* dependency_recorder() const; // = compilation()->dependencies()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  bool direct_compare(ciKlass* k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  void kill_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   281
  // use of state copy routines (try to minimize unnecessary state
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   282
  // object allocations):
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   283
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   284
  // - if the instruction unconditionally needs a full copy of the
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   285
  // state (for patching for example), then use copy_state_before*
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   286
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   287
  // - if the instruction needs a full copy of the state only for
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   288
  // handler generation (Instruction::needs_exception_state() returns
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   289
  // false) then use copy_state_exhandling*
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   290
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   291
  // - if the instruction needs either a full copy of the state for
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   292
  // handler generation and a least a minimal copy of the state (as
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   293
  // returned by Instruction::exception_state()) for debug info
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   294
  // generation (that is when Instruction::needs_exception_state()
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   295
  // returns true) then use copy_state_for_exception*
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   296
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   297
  ValueStack* copy_state_before_with_bci(int bci);
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   298
  ValueStack* copy_state_before();
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   299
  ValueStack* copy_state_exhandling_with_bci(int bci);
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   300
  ValueStack* copy_state_exhandling();
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   301
  ValueStack* copy_state_for_exception_with_bci(int bci);
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6453
diff changeset
   302
  ValueStack* copy_state_for_exception();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  // Inlining support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  bool parsing_jsr() const                               { return scope_data()->parsing_jsr();           }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  BlockBegin* continuation() const                       { return scope_data()->continuation();          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  BlockBegin* jsr_continuation() const                   { return scope_data()->jsr_continuation();      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  void set_continuation(BlockBegin* continuation)        { scope_data()->set_continuation(continuation); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  void set_inline_cleanup_info(BlockBegin* block,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
                               Instruction* return_prev,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
                               ValueStack* return_state) { scope_data()->set_inline_cleanup_info(block,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
                                                                                                  return_prev,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
                                                                                                  return_state); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  BlockBegin*  inline_cleanup_block() const              { return scope_data()->inline_cleanup_block();  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  Instruction* inline_cleanup_return_prev() const        { return scope_data()->inline_cleanup_return_prev(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  ValueStack*  inline_cleanup_state() const              { return scope_data()->inline_cleanup_state();  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  void incr_num_returns()                                { scope_data()->incr_num_returns();             }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  int  num_returns() const                               { return scope_data()->num_returns();           }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  intx max_inline_size() const                           { return scope_data()->max_inline_size();       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  int  inline_level() const                              { return scope()->level();                      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  int  recursive_inline_level(ciMethod* callee) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  // inlining of synchronized methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  void inline_sync_entry(Value lock, BlockBegin* sync_handler);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  void fill_sync_handler(Value lock, BlockBegin* sync_handler, bool default_handler = false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  // inliners
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  bool try_inline(ciMethod* callee, bool holder_known);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  bool try_inline_intrinsics(ciMethod* callee);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  bool try_inline_full      (ciMethod* callee, bool holder_known);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  bool try_inline_jsr(int jsr_dest_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  // helpers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  void inline_bailout(const char* msg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  BlockBegin* header_block(BlockBegin* entry, BlockBegin::Flag f, ValueStack* state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  BlockBegin* setup_start_block(int osr_bci, BlockBegin* std_entry, BlockBegin* osr_entry, ValueStack* init_state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  void setup_osr_entry_block();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  void clear_inline_bailout();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  ValueStack* state_at_entry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  void push_root_scope(IRScope* scope, BlockList* bci2block, BlockBegin* start);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  void push_scope(ciMethod* callee, BlockBegin* continuation);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  void push_scope_for_jsr(BlockBegin* jsr_continuation, int jsr_dest_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  void pop_scope();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  void pop_scope_for_jsr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  bool append_unsafe_get_obj(ciMethod* callee, BasicType t, bool is_volatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  bool append_unsafe_put_obj(ciMethod* callee, BasicType t, bool is_volatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  bool append_unsafe_get_raw(ciMethod* callee, BasicType t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  bool append_unsafe_put_raw(ciMethod* callee, BasicType t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  bool append_unsafe_prefetch(ciMethod* callee, bool is_store, bool is_static);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  void append_unsafe_CAS(ciMethod* callee);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  NOT_PRODUCT(void print_inline_result(ciMethod* callee, bool res);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  void profile_call(Value recv, ciKlass* predicted_holder);
6751
b399fd234e47 6988346: 6986046 breaks tiered
iveresov
parents: 6745
diff changeset
   360
  void profile_invocation(ciMethod* inlinee, ValueStack* state);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
   362
  // Shortcuts to profiling control.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
   363
  bool is_profiling()          { return _compilation->is_profiling();          }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
   364
  bool count_invocations()     { return _compilation->count_invocations();     }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
   365
  bool count_backedges()       { return _compilation->count_backedges();       }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
   366
  bool profile_branches()      { return _compilation->profile_branches();      }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
   367
  bool profile_calls()         { return _compilation->profile_calls();         }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
   368
  bool profile_inlined_calls() { return _compilation->profile_inlined_calls(); }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
   369
  bool profile_checkcasts()    { return _compilation->profile_checkcasts();    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  NOT_PRODUCT(void print_stats();)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
  // initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  static void initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  // public
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  static bool can_trap(ciMethod* method, Bytecodes::Code code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
    assert(0 <= code && code < Bytecodes::number_of_java_codes, "illegal bytecode");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
    if (_can_trap[code]) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
    // special handling for finalizer registration
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
    return code == Bytecodes::_return && method->intrinsic_id() == vmIntrinsics::_Object_init;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  GraphBuilder(Compilation* compilation, IRScope* scope);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  static void sort_top_into_worklist(BlockList* worklist, BlockBegin* top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  BlockBegin* start() const                      { return _start; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6751
diff changeset
   391
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6751
diff changeset
   392
#endif // SHARE_VM_C1_C1_GRAPHBUILDER_HPP