hotspot/src/share/vm/c1/c1_Instruction.hpp
changeset 1 489c9b5090e2
child 5046 27e801a857cb
equal deleted inserted replaced
0:fd16c54261b3 1:489c9b5090e2
       
     1 /*
       
     2  * Copyright 1999-2006 Sun Microsystems, Inc.  All Rights Reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.
       
     8  *
       
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    12  * version 2 for more details (a copy is included in the LICENSE file that
       
    13  * accompanied this code).
       
    14  *
       
    15  * You should have received a copy of the GNU General Public License version
       
    16  * 2 along with this work; if not, write to the Free Software Foundation,
       
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    18  *
       
    19  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
       
    20  * CA 95054 USA or visit www.sun.com if you need additional information or
       
    21  * have any questions.
       
    22  *
       
    23  */
       
    24 
       
    25 // Predefined classes
       
    26 class ciField;
       
    27 class ValueStack;
       
    28 class InstructionPrinter;
       
    29 class IRScope;
       
    30 class LIR_OprDesc;
       
    31 typedef LIR_OprDesc* LIR_Opr;
       
    32 
       
    33 
       
    34 // Instruction class hierarchy
       
    35 //
       
    36 // All leaf classes in the class hierarchy are concrete classes
       
    37 // (i.e., are instantiated). All other classes are abstract and
       
    38 // serve factoring.
       
    39 
       
    40 class Instruction;
       
    41 class   HiWord;
       
    42 class   Phi;
       
    43 class   Local;
       
    44 class   Constant;
       
    45 class   AccessField;
       
    46 class     LoadField;
       
    47 class     StoreField;
       
    48 class   AccessArray;
       
    49 class     ArrayLength;
       
    50 class     AccessIndexed;
       
    51 class       LoadIndexed;
       
    52 class       StoreIndexed;
       
    53 class   NegateOp;
       
    54 class   Op2;
       
    55 class     ArithmeticOp;
       
    56 class     ShiftOp;
       
    57 class     LogicOp;
       
    58 class     CompareOp;
       
    59 class     IfOp;
       
    60 class   Convert;
       
    61 class   NullCheck;
       
    62 class   OsrEntry;
       
    63 class   ExceptionObject;
       
    64 class   StateSplit;
       
    65 class     Invoke;
       
    66 class     NewInstance;
       
    67 class     NewArray;
       
    68 class       NewTypeArray;
       
    69 class       NewObjectArray;
       
    70 class       NewMultiArray;
       
    71 class     TypeCheck;
       
    72 class       CheckCast;
       
    73 class       InstanceOf;
       
    74 class     AccessMonitor;
       
    75 class       MonitorEnter;
       
    76 class       MonitorExit;
       
    77 class     Intrinsic;
       
    78 class     BlockBegin;
       
    79 class     BlockEnd;
       
    80 class       Goto;
       
    81 class       If;
       
    82 class       IfInstanceOf;
       
    83 class       Switch;
       
    84 class         TableSwitch;
       
    85 class         LookupSwitch;
       
    86 class       Return;
       
    87 class       Throw;
       
    88 class       Base;
       
    89 class   RoundFP;
       
    90 class   UnsafeOp;
       
    91 class     UnsafeRawOp;
       
    92 class       UnsafeGetRaw;
       
    93 class       UnsafePutRaw;
       
    94 class     UnsafeObjectOp;
       
    95 class       UnsafeGetObject;
       
    96 class       UnsafePutObject;
       
    97 class       UnsafePrefetch;
       
    98 class         UnsafePrefetchRead;
       
    99 class         UnsafePrefetchWrite;
       
   100 class   ProfileCall;
       
   101 class   ProfileCounter;
       
   102 
       
   103 // A Value is a reference to the instruction creating the value
       
   104 typedef Instruction* Value;
       
   105 define_array(ValueArray, Value)
       
   106 define_stack(Values, ValueArray)
       
   107 
       
   108 define_array(ValueStackArray, ValueStack*)
       
   109 define_stack(ValueStackStack, ValueStackArray)
       
   110 
       
   111 // BlockClosure is the base class for block traversal/iteration.
       
   112 
       
   113 class BlockClosure: public CompilationResourceObj {
       
   114  public:
       
   115   virtual void block_do(BlockBegin* block)       = 0;
       
   116 };
       
   117 
       
   118 
       
   119 // Some array and list classes
       
   120 define_array(BlockBeginArray, BlockBegin*)
       
   121 define_stack(_BlockList, BlockBeginArray)
       
   122 
       
   123 class BlockList: public _BlockList {
       
   124  public:
       
   125   BlockList(): _BlockList() {}
       
   126   BlockList(const int size): _BlockList(size) {}
       
   127   BlockList(const int size, BlockBegin* init): _BlockList(size, init) {}
       
   128 
       
   129   void iterate_forward(BlockClosure* closure);
       
   130   void iterate_backward(BlockClosure* closure);
       
   131   void blocks_do(void f(BlockBegin*));
       
   132   void values_do(void f(Value*));
       
   133   void print(bool cfg_only = false, bool live_only = false) PRODUCT_RETURN;
       
   134 };
       
   135 
       
   136 
       
   137 // InstructionVisitors provide type-based dispatch for instructions.
       
   138 // For each concrete Instruction class X, a virtual function do_X is
       
   139 // provided. Functionality that needs to be implemented for all classes
       
   140 // (e.g., printing, code generation) is factored out into a specialised
       
   141 // visitor instead of added to the Instruction classes itself.
       
   142 
       
   143 class InstructionVisitor: public StackObj {
       
   144  public:
       
   145           void do_HiWord         (HiWord*          x) { ShouldNotReachHere(); }
       
   146   virtual void do_Phi            (Phi*             x) = 0;
       
   147   virtual void do_Local          (Local*           x) = 0;
       
   148   virtual void do_Constant       (Constant*        x) = 0;
       
   149   virtual void do_LoadField      (LoadField*       x) = 0;
       
   150   virtual void do_StoreField     (StoreField*      x) = 0;
       
   151   virtual void do_ArrayLength    (ArrayLength*     x) = 0;
       
   152   virtual void do_LoadIndexed    (LoadIndexed*     x) = 0;
       
   153   virtual void do_StoreIndexed   (StoreIndexed*    x) = 0;
       
   154   virtual void do_NegateOp       (NegateOp*        x) = 0;
       
   155   virtual void do_ArithmeticOp   (ArithmeticOp*    x) = 0;
       
   156   virtual void do_ShiftOp        (ShiftOp*         x) = 0;
       
   157   virtual void do_LogicOp        (LogicOp*         x) = 0;
       
   158   virtual void do_CompareOp      (CompareOp*       x) = 0;
       
   159   virtual void do_IfOp           (IfOp*            x) = 0;
       
   160   virtual void do_Convert        (Convert*         x) = 0;
       
   161   virtual void do_NullCheck      (NullCheck*       x) = 0;
       
   162   virtual void do_Invoke         (Invoke*          x) = 0;
       
   163   virtual void do_NewInstance    (NewInstance*     x) = 0;
       
   164   virtual void do_NewTypeArray   (NewTypeArray*    x) = 0;
       
   165   virtual void do_NewObjectArray (NewObjectArray*  x) = 0;
       
   166   virtual void do_NewMultiArray  (NewMultiArray*   x) = 0;
       
   167   virtual void do_CheckCast      (CheckCast*       x) = 0;
       
   168   virtual void do_InstanceOf     (InstanceOf*      x) = 0;
       
   169   virtual void do_MonitorEnter   (MonitorEnter*    x) = 0;
       
   170   virtual void do_MonitorExit    (MonitorExit*     x) = 0;
       
   171   virtual void do_Intrinsic      (Intrinsic*       x) = 0;
       
   172   virtual void do_BlockBegin     (BlockBegin*      x) = 0;
       
   173   virtual void do_Goto           (Goto*            x) = 0;
       
   174   virtual void do_If             (If*              x) = 0;
       
   175   virtual void do_IfInstanceOf   (IfInstanceOf*    x) = 0;
       
   176   virtual void do_TableSwitch    (TableSwitch*     x) = 0;
       
   177   virtual void do_LookupSwitch   (LookupSwitch*    x) = 0;
       
   178   virtual void do_Return         (Return*          x) = 0;
       
   179   virtual void do_Throw          (Throw*           x) = 0;
       
   180   virtual void do_Base           (Base*            x) = 0;
       
   181   virtual void do_OsrEntry       (OsrEntry*        x) = 0;
       
   182   virtual void do_ExceptionObject(ExceptionObject* x) = 0;
       
   183   virtual void do_RoundFP        (RoundFP*         x) = 0;
       
   184   virtual void do_UnsafeGetRaw   (UnsafeGetRaw*    x) = 0;
       
   185   virtual void do_UnsafePutRaw   (UnsafePutRaw*    x) = 0;
       
   186   virtual void do_UnsafeGetObject(UnsafeGetObject* x) = 0;
       
   187   virtual void do_UnsafePutObject(UnsafePutObject* x) = 0;
       
   188   virtual void do_UnsafePrefetchRead (UnsafePrefetchRead*  x) = 0;
       
   189   virtual void do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) = 0;
       
   190   virtual void do_ProfileCall    (ProfileCall*     x) = 0;
       
   191   virtual void do_ProfileCounter (ProfileCounter*  x) = 0;
       
   192 };
       
   193 
       
   194 
       
   195 // Hashing support
       
   196 //
       
   197 // Note: This hash functions affect the performance
       
   198 //       of ValueMap - make changes carefully!
       
   199 
       
   200 #define HASH1(x1            )                    ((intx)(x1))
       
   201 #define HASH2(x1, x2        )                    ((HASH1(x1        ) << 7) ^ HASH1(x2))
       
   202 #define HASH3(x1, x2, x3    )                    ((HASH2(x1, x2    ) << 7) ^ HASH1(x3))
       
   203 #define HASH4(x1, x2, x3, x4)                    ((HASH3(x1, x2, x3) << 7) ^ HASH1(x4))
       
   204 
       
   205 
       
   206 // The following macros are used to implement instruction-specific hashing.
       
   207 // By default, each instruction implements hash() and is_equal(Value), used
       
   208 // for value numbering/common subexpression elimination. The default imple-
       
   209 // mentation disables value numbering. Each instruction which can be value-
       
   210 // numbered, should define corresponding hash() and is_equal(Value) functions
       
   211 // via the macros below. The f arguments specify all the values/op codes, etc.
       
   212 // that need to be identical for two instructions to be identical.
       
   213 //
       
   214 // Note: The default implementation of hash() returns 0 in order to indicate
       
   215 //       that the instruction should not be considered for value numbering.
       
   216 //       The currently used hash functions do not guarantee that never a 0
       
   217 //       is produced. While this is still correct, it may be a performance
       
   218 //       bug (no value numbering for that node). However, this situation is
       
   219 //       so unlikely, that we are not going to handle it specially.
       
   220 
       
   221 #define HASHING1(class_name, enabled, f1)             \
       
   222   virtual intx hash() const {                         \
       
   223     return (enabled) ? HASH2(name(), f1) : 0;         \
       
   224   }                                                   \
       
   225   virtual bool is_equal(Value v) const {              \
       
   226     if (!(enabled)  ) return false;                   \
       
   227     class_name* _v = v->as_##class_name();            \
       
   228     if (_v == NULL  ) return false;                   \
       
   229     if (f1 != _v->f1) return false;                   \
       
   230     return true;                                      \
       
   231   }                                                   \
       
   232 
       
   233 
       
   234 #define HASHING2(class_name, enabled, f1, f2)         \
       
   235   virtual intx hash() const {                         \
       
   236     return (enabled) ? HASH3(name(), f1, f2) : 0;     \
       
   237   }                                                   \
       
   238   virtual bool is_equal(Value v) const {              \
       
   239     if (!(enabled)  ) return false;                   \
       
   240     class_name* _v = v->as_##class_name();            \
       
   241     if (_v == NULL  ) return false;                   \
       
   242     if (f1 != _v->f1) return false;                   \
       
   243     if (f2 != _v->f2) return false;                   \
       
   244     return true;                                      \
       
   245   }                                                   \
       
   246 
       
   247 
       
   248 #define HASHING3(class_name, enabled, f1, f2, f3)     \
       
   249   virtual intx hash() const {                          \
       
   250     return (enabled) ? HASH4(name(), f1, f2, f3) : 0; \
       
   251   }                                                   \
       
   252   virtual bool is_equal(Value v) const {              \
       
   253     if (!(enabled)  ) return false;                   \
       
   254     class_name* _v = v->as_##class_name();            \
       
   255     if (_v == NULL  ) return false;                   \
       
   256     if (f1 != _v->f1) return false;                   \
       
   257     if (f2 != _v->f2) return false;                   \
       
   258     if (f3 != _v->f3) return false;                   \
       
   259     return true;                                      \
       
   260   }                                                   \
       
   261 
       
   262 
       
   263 // The mother of all instructions...
       
   264 
       
   265 class Instruction: public CompilationResourceObj {
       
   266  private:
       
   267   static int   _next_id;                         // the node counter
       
   268 
       
   269   int          _id;                              // the unique instruction id
       
   270   int          _bci;                             // the instruction bci
       
   271   int          _use_count;                       // the number of instructions refering to this value (w/o prev/next); only roots can have use count = 0 or > 1
       
   272   int          _pin_state;                       // set of PinReason describing the reason for pinning
       
   273   ValueType*   _type;                            // the instruction value type
       
   274   Instruction* _next;                            // the next instruction if any (NULL for BlockEnd instructions)
       
   275   Instruction* _subst;                           // the substitution instruction if any
       
   276   LIR_Opr      _operand;                         // LIR specific information
       
   277   unsigned int _flags;                           // Flag bits
       
   278 
       
   279   XHandlers*   _exception_handlers;              // Flat list of exception handlers covering this instruction
       
   280 
       
   281 #ifdef ASSERT
       
   282   HiWord*      _hi_word;
       
   283 #endif
       
   284 
       
   285   friend class UseCountComputer;
       
   286 
       
   287  protected:
       
   288   void set_bci(int bci)                          { assert(bci == SynchronizationEntryBCI || bci >= 0, "illegal bci"); _bci = bci; }
       
   289   void set_type(ValueType* type) {
       
   290     assert(type != NULL, "type must exist");
       
   291     _type = type;
       
   292   }
       
   293 
       
   294  public:
       
   295   enum InstructionFlag {
       
   296     NeedsNullCheckFlag = 0,
       
   297     CanTrapFlag,
       
   298     DirectCompareFlag,
       
   299     IsEliminatedFlag,
       
   300     IsInitializedFlag,
       
   301     IsLoadedFlag,
       
   302     IsSafepointFlag,
       
   303     IsStaticFlag,
       
   304     IsStrictfpFlag,
       
   305     NeedsStoreCheckFlag,
       
   306     NeedsWriteBarrierFlag,
       
   307     PreservesStateFlag,
       
   308     TargetIsFinalFlag,
       
   309     TargetIsLoadedFlag,
       
   310     TargetIsStrictfpFlag,
       
   311     UnorderedIsTrueFlag,
       
   312     NeedsPatchingFlag,
       
   313     ThrowIncompatibleClassChangeErrorFlag,
       
   314     ProfileMDOFlag,
       
   315     InstructionLastFlag
       
   316   };
       
   317 
       
   318  public:
       
   319   bool check_flag(InstructionFlag id) const      { return (_flags & (1 << id)) != 0;    }
       
   320   void set_flag(InstructionFlag id, bool f)      { _flags = f ? (_flags | (1 << id)) : (_flags & ~(1 << id)); };
       
   321 
       
   322   // 'globally' used condition values
       
   323   enum Condition {
       
   324     eql, neq, lss, leq, gtr, geq
       
   325   };
       
   326 
       
   327   // Instructions may be pinned for many reasons and under certain conditions
       
   328   // with enough knowledge it's possible to safely unpin them.
       
   329   enum PinReason {
       
   330       PinUnknown           = 1 << 0
       
   331     , PinExplicitNullCheck = 1 << 3
       
   332     , PinStackForStateSplit= 1 << 12
       
   333     , PinStateSplitConstructor= 1 << 13
       
   334     , PinGlobalValueNumbering= 1 << 14
       
   335   };
       
   336 
       
   337   static Condition mirror(Condition cond);
       
   338   static Condition negate(Condition cond);
       
   339 
       
   340   // initialization
       
   341   static void initialize()                       { _next_id = 0; }
       
   342   static int number_of_instructions()            { return _next_id; }
       
   343 
       
   344   // creation
       
   345   Instruction(ValueType* type, bool type_is_constant = false, bool create_hi = true)
       
   346   : _id(_next_id++)
       
   347   , _bci(-99)
       
   348   , _use_count(0)
       
   349   , _pin_state(0)
       
   350   , _type(type)
       
   351   , _next(NULL)
       
   352   , _subst(NULL)
       
   353   , _flags(0)
       
   354   , _operand(LIR_OprFact::illegalOpr)
       
   355   , _exception_handlers(NULL)
       
   356 #ifdef ASSERT
       
   357   , _hi_word(NULL)
       
   358 #endif
       
   359   {
       
   360     assert(type != NULL && (!type->is_constant() || type_is_constant), "type must exist");
       
   361 #ifdef ASSERT
       
   362     if (create_hi && type->is_double_word()) {
       
   363       create_hi_word();
       
   364     }
       
   365 #endif
       
   366   }
       
   367 
       
   368   // accessors
       
   369   int id() const                                 { return _id; }
       
   370   int bci() const                                { return _bci; }
       
   371   int use_count() const                          { return _use_count; }
       
   372   int pin_state() const                          { return _pin_state; }
       
   373   bool is_pinned() const                         { return _pin_state != 0 || PinAllInstructions; }
       
   374   ValueType* type() const                        { return _type; }
       
   375   Instruction* prev(BlockBegin* block);          // use carefully, expensive operation
       
   376   Instruction* next() const                      { return _next; }
       
   377   bool has_subst() const                         { return _subst != NULL; }
       
   378   Instruction* subst()                           { return _subst == NULL ? this : _subst->subst(); }
       
   379   LIR_Opr operand() const                        { return _operand; }
       
   380 
       
   381   void set_needs_null_check(bool f)              { set_flag(NeedsNullCheckFlag, f); }
       
   382   bool needs_null_check() const                  { return check_flag(NeedsNullCheckFlag); }
       
   383 
       
   384   bool has_uses() const                          { return use_count() > 0; }
       
   385   bool is_root() const                           { return is_pinned() || use_count() > 1; }
       
   386   XHandlers* exception_handlers() const          { return _exception_handlers; }
       
   387 
       
   388   // manipulation
       
   389   void pin(PinReason reason)                     { _pin_state |= reason; }
       
   390   void pin()                                     { _pin_state |= PinUnknown; }
       
   391   // DANGEROUS: only used by EliminateStores
       
   392   void unpin(PinReason reason)                   { assert((reason & PinUnknown) == 0, "can't unpin unknown state"); _pin_state &= ~reason; }
       
   393   virtual void set_lock_stack(ValueStack* l)     { /* do nothing*/ }
       
   394   virtual ValueStack* lock_stack() const         { return NULL; }
       
   395 
       
   396   Instruction* set_next(Instruction* next, int bci) {
       
   397     if (next != NULL) {
       
   398       assert(as_BlockEnd() == NULL, "BlockEnd instructions must have no next");
       
   399       assert(next->as_Phi() == NULL && next->as_Local() == NULL, "shouldn't link these instructions into list");
       
   400       next->set_bci(bci);
       
   401     }
       
   402     _next = next;
       
   403     return next;
       
   404   }
       
   405 
       
   406   void set_subst(Instruction* subst)             {
       
   407     assert(subst == NULL ||
       
   408            type()->base() == subst->type()->base() ||
       
   409            subst->type()->base() == illegalType, "type can't change");
       
   410     _subst = subst;
       
   411   }
       
   412   void set_exception_handlers(XHandlers *xhandlers) { _exception_handlers = xhandlers; }
       
   413 
       
   414 #ifdef ASSERT
       
   415   // HiWord is used for debugging and is allocated early to avoid
       
   416   // allocation at inconvenient points
       
   417   HiWord* hi_word() { return _hi_word; }
       
   418   void create_hi_word();
       
   419 #endif
       
   420 
       
   421 
       
   422   // machine-specifics
       
   423   void set_operand(LIR_Opr operand)              { assert(operand != LIR_OprFact::illegalOpr, "operand must exist"); _operand = operand; }
       
   424   void clear_operand()                           { _operand = LIR_OprFact::illegalOpr; }
       
   425 
       
   426   // generic
       
   427   virtual Instruction*      as_Instruction()     { return this; } // to satisfy HASHING1 macro
       
   428   virtual HiWord*           as_HiWord()          { return NULL; }
       
   429   virtual Phi*           as_Phi()          { return NULL; }
       
   430   virtual Local*            as_Local()           { return NULL; }
       
   431   virtual Constant*         as_Constant()        { return NULL; }
       
   432   virtual AccessField*      as_AccessField()     { return NULL; }
       
   433   virtual LoadField*        as_LoadField()       { return NULL; }
       
   434   virtual StoreField*       as_StoreField()      { return NULL; }
       
   435   virtual AccessArray*      as_AccessArray()     { return NULL; }
       
   436   virtual ArrayLength*      as_ArrayLength()     { return NULL; }
       
   437   virtual AccessIndexed*    as_AccessIndexed()   { return NULL; }
       
   438   virtual LoadIndexed*      as_LoadIndexed()     { return NULL; }
       
   439   virtual StoreIndexed*     as_StoreIndexed()    { return NULL; }
       
   440   virtual NegateOp*         as_NegateOp()        { return NULL; }
       
   441   virtual Op2*              as_Op2()             { return NULL; }
       
   442   virtual ArithmeticOp*     as_ArithmeticOp()    { return NULL; }
       
   443   virtual ShiftOp*          as_ShiftOp()         { return NULL; }
       
   444   virtual LogicOp*          as_LogicOp()         { return NULL; }
       
   445   virtual CompareOp*        as_CompareOp()       { return NULL; }
       
   446   virtual IfOp*             as_IfOp()            { return NULL; }
       
   447   virtual Convert*          as_Convert()         { return NULL; }
       
   448   virtual NullCheck*        as_NullCheck()       { return NULL; }
       
   449   virtual OsrEntry*         as_OsrEntry()        { return NULL; }
       
   450   virtual StateSplit*       as_StateSplit()      { return NULL; }
       
   451   virtual Invoke*           as_Invoke()          { return NULL; }
       
   452   virtual NewInstance*      as_NewInstance()     { return NULL; }
       
   453   virtual NewArray*         as_NewArray()        { return NULL; }
       
   454   virtual NewTypeArray*     as_NewTypeArray()    { return NULL; }
       
   455   virtual NewObjectArray*   as_NewObjectArray()  { return NULL; }
       
   456   virtual NewMultiArray*    as_NewMultiArray()   { return NULL; }
       
   457   virtual TypeCheck*        as_TypeCheck()       { return NULL; }
       
   458   virtual CheckCast*        as_CheckCast()       { return NULL; }
       
   459   virtual InstanceOf*       as_InstanceOf()      { return NULL; }
       
   460   virtual AccessMonitor*    as_AccessMonitor()   { return NULL; }
       
   461   virtual MonitorEnter*     as_MonitorEnter()    { return NULL; }
       
   462   virtual MonitorExit*      as_MonitorExit()     { return NULL; }
       
   463   virtual Intrinsic*        as_Intrinsic()       { return NULL; }
       
   464   virtual BlockBegin*       as_BlockBegin()      { return NULL; }
       
   465   virtual BlockEnd*         as_BlockEnd()        { return NULL; }
       
   466   virtual Goto*             as_Goto()            { return NULL; }
       
   467   virtual If*               as_If()              { return NULL; }
       
   468   virtual IfInstanceOf*     as_IfInstanceOf()    { return NULL; }
       
   469   virtual TableSwitch*      as_TableSwitch()     { return NULL; }
       
   470   virtual LookupSwitch*     as_LookupSwitch()    { return NULL; }
       
   471   virtual Return*           as_Return()          { return NULL; }
       
   472   virtual Throw*            as_Throw()           { return NULL; }
       
   473   virtual Base*             as_Base()            { return NULL; }
       
   474   virtual RoundFP*          as_RoundFP()         { return NULL; }
       
   475   virtual ExceptionObject*  as_ExceptionObject() { return NULL; }
       
   476   virtual UnsafeOp*         as_UnsafeOp()        { return NULL; }
       
   477 
       
   478   virtual void visit(InstructionVisitor* v)      = 0;
       
   479 
       
   480   virtual bool can_trap() const                  { return false; }
       
   481 
       
   482   virtual void input_values_do(void f(Value*))   = 0;
       
   483   virtual void state_values_do(void f(Value*))   { /* usually no state - override on demand */ }
       
   484   virtual void other_values_do(void f(Value*))   { /* usually no other - override on demand */ }
       
   485           void       values_do(void f(Value*))   { input_values_do(f); state_values_do(f); other_values_do(f); }
       
   486 
       
   487   virtual ciType* exact_type() const             { return NULL; }
       
   488   virtual ciType* declared_type() const          { return NULL; }
       
   489 
       
   490   // hashing
       
   491   virtual const char* name() const               = 0;
       
   492   HASHING1(Instruction, false, id())             // hashing disabled by default
       
   493 
       
   494   // debugging
       
   495   void print()                                   PRODUCT_RETURN;
       
   496   void print_line()                              PRODUCT_RETURN;
       
   497   void print(InstructionPrinter& ip)             PRODUCT_RETURN;
       
   498 };
       
   499 
       
   500 
       
   501 // The following macros are used to define base (i.e., non-leaf)
       
   502 // and leaf instruction classes. They define class-name related
       
   503 // generic functionality in one place.
       
   504 
       
   505 #define BASE(class_name, super_class_name)       \
       
   506   class class_name: public super_class_name {    \
       
   507    public:                                       \
       
   508     virtual class_name* as_##class_name()        { return this; }              \
       
   509 
       
   510 
       
   511 #define LEAF(class_name, super_class_name)       \
       
   512   BASE(class_name, super_class_name)             \
       
   513    public:                                       \
       
   514     virtual const char* name() const             { return #class_name; }       \
       
   515     virtual void visit(InstructionVisitor* v)    { v->do_##class_name(this); } \
       
   516 
       
   517 
       
   518 // Debugging support
       
   519 
       
   520 #ifdef ASSERT
       
   521   static void assert_value(Value* x)             { assert((*x) != NULL, "value must exist"); }
       
   522   #define ASSERT_VALUES                          values_do(assert_value);
       
   523 #else
       
   524   #define ASSERT_VALUES
       
   525 #endif // ASSERT
       
   526 
       
   527 
       
   528 // A HiWord occupies the 'high word' of a 2-word
       
   529 // expression stack entry. Hi & lo words must be
       
   530 // paired on the expression stack (otherwise the
       
   531 // bytecode sequence is illegal). Note that 'hi'
       
   532 // refers to the IR expression stack format and
       
   533 // does *not* imply a machine word ordering. No
       
   534 // HiWords are used in optimized mode for speed,
       
   535 // but NULL pointers are used instead.
       
   536 
       
   537 LEAF(HiWord, Instruction)
       
   538  private:
       
   539   Value _lo_word;
       
   540 
       
   541  public:
       
   542   // creation
       
   543   HiWord(Value lo_word)
       
   544     : Instruction(illegalType, false, false),
       
   545       _lo_word(lo_word) {
       
   546     // hi-words are also allowed for illegal lo-words
       
   547     assert(lo_word->type()->is_double_word() || lo_word->type()->is_illegal(),
       
   548            "HiWord must be used for 2-word values only");
       
   549   }
       
   550 
       
   551   // accessors
       
   552   Value lo_word() const                          { return _lo_word->subst(); }
       
   553 
       
   554   // for invalidating of HiWords
       
   555   void make_illegal()                            { set_type(illegalType); }
       
   556 
       
   557   // generic
       
   558   virtual void input_values_do(void f(Value*))   { ShouldNotReachHere(); }
       
   559 };
       
   560 
       
   561 
       
   562 // A Phi is a phi function in the sense of SSA form. It stands for
       
   563 // the value of a local variable at the beginning of a join block.
       
   564 // A Phi consists of n operands, one for every incoming branch.
       
   565 
       
   566 LEAF(Phi, Instruction)
       
   567  private:
       
   568   BlockBegin* _block;    // the block to which the phi function belongs
       
   569   int         _pf_flags; // the flags of the phi function
       
   570   int         _index;    // to value on operand stack (index < 0) or to local
       
   571  public:
       
   572   // creation
       
   573   Phi(ValueType* type, BlockBegin* b, int index)
       
   574   : Instruction(type->base())
       
   575   , _pf_flags(0)
       
   576   , _block(b)
       
   577   , _index(index)
       
   578   {
       
   579     if (type->is_illegal()) {
       
   580       make_illegal();
       
   581     }
       
   582   }
       
   583 
       
   584   // flags
       
   585   enum Flag {
       
   586     no_flag         = 0,
       
   587     visited         = 1 << 0,
       
   588     cannot_simplify = 1 << 1
       
   589   };
       
   590 
       
   591   // accessors
       
   592   bool  is_local() const          { return _index >= 0; }
       
   593   bool  is_on_stack() const       { return !is_local(); }
       
   594   int   local_index() const       { assert(is_local(), ""); return _index; }
       
   595   int   stack_index() const       { assert(is_on_stack(), ""); return -(_index+1); }
       
   596 
       
   597   Value operand_at(int i) const;
       
   598   int   operand_count() const;
       
   599 
       
   600   BlockBegin* block() const       { return _block; }
       
   601 
       
   602   void   set(Flag f)              { _pf_flags |=  f; }
       
   603   void   clear(Flag f)            { _pf_flags &= ~f; }
       
   604   bool   is_set(Flag f) const     { return (_pf_flags & f) != 0; }
       
   605 
       
   606   // Invalidates phis corresponding to merges of locals of two different types
       
   607   // (these should never be referenced, otherwise the bytecodes are illegal)
       
   608   void   make_illegal() {
       
   609     set(cannot_simplify);
       
   610     set_type(illegalType);
       
   611   }
       
   612 
       
   613   bool is_illegal() const {
       
   614     return type()->is_illegal();
       
   615   }
       
   616 
       
   617   // generic
       
   618   virtual void input_values_do(void f(Value*)) {
       
   619   }
       
   620 };
       
   621 
       
   622 
       
   623 // A local is a placeholder for an incoming argument to a function call.
       
   624 LEAF(Local, Instruction)
       
   625  private:
       
   626   int      _java_index;                          // the local index within the method to which the local belongs
       
   627  public:
       
   628   // creation
       
   629   Local(ValueType* type, int index)
       
   630     : Instruction(type)
       
   631     , _java_index(index)
       
   632   {}
       
   633 
       
   634   // accessors
       
   635   int java_index() const                         { return _java_index; }
       
   636 
       
   637   // generic
       
   638   virtual void input_values_do(void f(Value*))   { /* no values */ }
       
   639 };
       
   640 
       
   641 
       
   642 LEAF(Constant, Instruction)
       
   643   ValueStack* _state;
       
   644 
       
   645  public:
       
   646   // creation
       
   647   Constant(ValueType* type):
       
   648       Instruction(type, true)
       
   649   , _state(NULL) {
       
   650     assert(type->is_constant(), "must be a constant");
       
   651   }
       
   652 
       
   653   Constant(ValueType* type, ValueStack* state):
       
   654     Instruction(type, true)
       
   655   , _state(state) {
       
   656     assert(state != NULL, "only used for constants which need patching");
       
   657     assert(type->is_constant(), "must be a constant");
       
   658     // since it's patching it needs to be pinned
       
   659     pin();
       
   660   }
       
   661 
       
   662   ValueStack* state() const               { return _state; }
       
   663 
       
   664   // generic
       
   665   virtual bool can_trap() const                  { return state() != NULL; }
       
   666   virtual void input_values_do(void f(Value*))   { /* no values */ }
       
   667   virtual void other_values_do(void f(Value*));
       
   668 
       
   669   virtual intx hash() const;
       
   670   virtual bool is_equal(Value v) const;
       
   671 
       
   672   virtual BlockBegin* compare(Instruction::Condition condition, Value right,
       
   673                               BlockBegin* true_sux, BlockBegin* false_sux);
       
   674 };
       
   675 
       
   676 
       
   677 BASE(AccessField, Instruction)
       
   678  private:
       
   679   Value       _obj;
       
   680   int         _offset;
       
   681   ciField*    _field;
       
   682   ValueStack* _state_before;                     // state is set only for unloaded or uninitialized fields
       
   683   ValueStack* _lock_stack;                       // contains lock and scope information
       
   684   NullCheck*  _explicit_null_check;              // For explicit null check elimination
       
   685 
       
   686  public:
       
   687   // creation
       
   688   AccessField(Value obj, int offset, ciField* field, bool is_static, ValueStack* lock_stack,
       
   689               ValueStack* state_before, bool is_loaded, bool is_initialized)
       
   690   : Instruction(as_ValueType(field->type()->basic_type()))
       
   691   , _obj(obj)
       
   692   , _offset(offset)
       
   693   , _field(field)
       
   694   , _lock_stack(lock_stack)
       
   695   , _state_before(state_before)
       
   696   , _explicit_null_check(NULL)
       
   697   {
       
   698     set_needs_null_check(!is_static);
       
   699     set_flag(IsLoadedFlag, is_loaded);
       
   700     set_flag(IsInitializedFlag, is_initialized);
       
   701     set_flag(IsStaticFlag, is_static);
       
   702     ASSERT_VALUES
       
   703       if (!is_loaded || (PatchALot && !field->is_volatile())) {
       
   704       // need to patch if the holder wasn't loaded or we're testing
       
   705       // using PatchALot.  Don't allow PatchALot for fields which are
       
   706       // known to be volatile they aren't patchable.
       
   707       set_flag(NeedsPatchingFlag, true);
       
   708     }
       
   709     // pin of all instructions with memory access
       
   710     pin();
       
   711   }
       
   712 
       
   713   // accessors
       
   714   Value obj() const                              { return _obj; }
       
   715   int offset() const                             { return _offset; }
       
   716   ciField* field() const                         { return _field; }
       
   717   BasicType field_type() const                   { return _field->type()->basic_type(); }
       
   718   bool is_static() const                         { return check_flag(IsStaticFlag); }
       
   719   bool is_loaded() const                         { return check_flag(IsLoadedFlag); }
       
   720   bool is_initialized() const                    { return check_flag(IsInitializedFlag); }
       
   721   ValueStack* state_before() const               { return _state_before; }
       
   722   ValueStack* lock_stack() const                 { return _lock_stack; }
       
   723   NullCheck* explicit_null_check() const         { return _explicit_null_check; }
       
   724   bool needs_patching() const                    { return check_flag(NeedsPatchingFlag); }
       
   725 
       
   726   // manipulation
       
   727   void set_lock_stack(ValueStack* l)             { _lock_stack = l; }
       
   728   // Under certain circumstances, if a previous NullCheck instruction
       
   729   // proved the target object non-null, we can eliminate the explicit
       
   730   // null check and do an implicit one, simply specifying the debug
       
   731   // information from the NullCheck. This field should only be consulted
       
   732   // if needs_null_check() is true.
       
   733   void set_explicit_null_check(NullCheck* check) { _explicit_null_check = check; }
       
   734 
       
   735   // generic
       
   736   virtual bool can_trap() const                  { return needs_null_check() || needs_patching(); }
       
   737   virtual void input_values_do(void f(Value*))   { f(&_obj); }
       
   738   virtual void other_values_do(void f(Value*));
       
   739 };
       
   740 
       
   741 
       
   742 LEAF(LoadField, AccessField)
       
   743  public:
       
   744   // creation
       
   745   LoadField(Value obj, int offset, ciField* field, bool is_static, ValueStack* lock_stack,
       
   746             ValueStack* state_before, bool is_loaded, bool is_initialized)
       
   747   : AccessField(obj, offset, field, is_static, lock_stack, state_before, is_loaded, is_initialized)
       
   748   {}
       
   749 
       
   750   ciType* declared_type() const;
       
   751   ciType* exact_type() const;
       
   752 
       
   753   // generic
       
   754   HASHING2(LoadField, is_loaded() && !field()->is_volatile(), obj()->subst(), offset())  // cannot be eliminated if not yet loaded or if volatile
       
   755 };
       
   756 
       
   757 
       
   758 LEAF(StoreField, AccessField)
       
   759  private:
       
   760   Value _value;
       
   761 
       
   762  public:
       
   763   // creation
       
   764   StoreField(Value obj, int offset, ciField* field, Value value, bool is_static, ValueStack* lock_stack,
       
   765              ValueStack* state_before, bool is_loaded, bool is_initialized)
       
   766   : AccessField(obj, offset, field, is_static, lock_stack, state_before, is_loaded, is_initialized)
       
   767   , _value(value)
       
   768   {
       
   769     set_flag(NeedsWriteBarrierFlag, as_ValueType(field_type())->is_object());
       
   770     ASSERT_VALUES
       
   771     pin();
       
   772   }
       
   773 
       
   774   // accessors
       
   775   Value value() const                            { return _value; }
       
   776   bool needs_write_barrier() const               { return check_flag(NeedsWriteBarrierFlag); }
       
   777 
       
   778   // generic
       
   779   virtual void input_values_do(void f(Value*))   { AccessField::input_values_do(f); f(&_value); }
       
   780 };
       
   781 
       
   782 
       
   783 BASE(AccessArray, Instruction)
       
   784  private:
       
   785   Value       _array;
       
   786   ValueStack* _lock_stack;
       
   787 
       
   788  public:
       
   789   // creation
       
   790   AccessArray(ValueType* type, Value array, ValueStack* lock_stack)
       
   791   : Instruction(type)
       
   792   , _array(array)
       
   793   , _lock_stack(lock_stack) {
       
   794     set_needs_null_check(true);
       
   795     ASSERT_VALUES
       
   796     pin(); // instruction with side effect (null exception or range check throwing)
       
   797   }
       
   798 
       
   799   Value array() const                            { return _array; }
       
   800   ValueStack* lock_stack() const                 { return _lock_stack; }
       
   801 
       
   802   // setters
       
   803   void set_lock_stack(ValueStack* l)             { _lock_stack = l; }
       
   804 
       
   805   // generic
       
   806   virtual bool can_trap() const                  { return needs_null_check(); }
       
   807   virtual void input_values_do(void f(Value*))   { f(&_array); }
       
   808   virtual void other_values_do(void f(Value*));
       
   809 };
       
   810 
       
   811 
       
   812 LEAF(ArrayLength, AccessArray)
       
   813  private:
       
   814   NullCheck*  _explicit_null_check;              // For explicit null check elimination
       
   815 
       
   816  public:
       
   817   // creation
       
   818   ArrayLength(Value array, ValueStack* lock_stack)
       
   819   : AccessArray(intType, array, lock_stack)
       
   820   , _explicit_null_check(NULL) {}
       
   821 
       
   822   // accessors
       
   823   NullCheck* explicit_null_check() const         { return _explicit_null_check; }
       
   824 
       
   825   // setters
       
   826   // See LoadField::set_explicit_null_check for documentation
       
   827   void set_explicit_null_check(NullCheck* check) { _explicit_null_check = check; }
       
   828 
       
   829   // generic
       
   830   HASHING1(ArrayLength, true, array()->subst())
       
   831 };
       
   832 
       
   833 
       
   834 BASE(AccessIndexed, AccessArray)
       
   835  private:
       
   836   Value     _index;
       
   837   Value     _length;
       
   838   BasicType _elt_type;
       
   839 
       
   840  public:
       
   841   // creation
       
   842   AccessIndexed(Value array, Value index, Value length, BasicType elt_type, ValueStack* lock_stack)
       
   843   : AccessArray(as_ValueType(elt_type), array, lock_stack)
       
   844   , _index(index)
       
   845   , _length(length)
       
   846   , _elt_type(elt_type)
       
   847   {
       
   848     ASSERT_VALUES
       
   849   }
       
   850 
       
   851   // accessors
       
   852   Value index() const                            { return _index; }
       
   853   Value length() const                           { return _length; }
       
   854   BasicType elt_type() const                     { return _elt_type; }
       
   855 
       
   856   // perform elimination of range checks involving constants
       
   857   bool compute_needs_range_check();
       
   858 
       
   859   // generic
       
   860   virtual void input_values_do(void f(Value*))   { AccessArray::input_values_do(f); f(&_index); if (_length != NULL) f(&_length); }
       
   861 };
       
   862 
       
   863 
       
   864 LEAF(LoadIndexed, AccessIndexed)
       
   865  private:
       
   866   NullCheck*  _explicit_null_check;              // For explicit null check elimination
       
   867 
       
   868  public:
       
   869   // creation
       
   870   LoadIndexed(Value array, Value index, Value length, BasicType elt_type, ValueStack* lock_stack)
       
   871   : AccessIndexed(array, index, length, elt_type, lock_stack)
       
   872   , _explicit_null_check(NULL) {}
       
   873 
       
   874   // accessors
       
   875   NullCheck* explicit_null_check() const         { return _explicit_null_check; }
       
   876 
       
   877   // setters
       
   878   // See LoadField::set_explicit_null_check for documentation
       
   879   void set_explicit_null_check(NullCheck* check) { _explicit_null_check = check; }
       
   880 
       
   881   ciType* exact_type() const;
       
   882   ciType* declared_type() const;
       
   883 
       
   884   // generic
       
   885   HASHING2(LoadIndexed, true, array()->subst(), index()->subst())
       
   886 };
       
   887 
       
   888 
       
   889 LEAF(StoreIndexed, AccessIndexed)
       
   890  private:
       
   891   Value       _value;
       
   892 
       
   893  public:
       
   894   // creation
       
   895   StoreIndexed(Value array, Value index, Value length, BasicType elt_type, Value value, ValueStack* lock_stack)
       
   896   : AccessIndexed(array, index, length, elt_type, lock_stack)
       
   897   , _value(value)
       
   898   {
       
   899     set_flag(NeedsWriteBarrierFlag, (as_ValueType(elt_type)->is_object()));
       
   900     set_flag(NeedsStoreCheckFlag, (as_ValueType(elt_type)->is_object()));
       
   901     ASSERT_VALUES
       
   902     pin();
       
   903   }
       
   904 
       
   905   // accessors
       
   906   Value value() const                            { return _value; }
       
   907   IRScope* scope() const;                        // the state's scope
       
   908   bool needs_write_barrier() const               { return check_flag(NeedsWriteBarrierFlag); }
       
   909   bool needs_store_check() const                 { return check_flag(NeedsStoreCheckFlag); }
       
   910 
       
   911   // generic
       
   912   virtual void input_values_do(void f(Value*))   { AccessIndexed::input_values_do(f); f(&_value); }
       
   913 };
       
   914 
       
   915 
       
   916 LEAF(NegateOp, Instruction)
       
   917  private:
       
   918   Value _x;
       
   919 
       
   920  public:
       
   921   // creation
       
   922   NegateOp(Value x) : Instruction(x->type()->base()), _x(x) {
       
   923     ASSERT_VALUES
       
   924   }
       
   925 
       
   926   // accessors
       
   927   Value x() const                                { return _x; }
       
   928 
       
   929   // generic
       
   930   virtual void input_values_do(void f(Value*))   { f(&_x); }
       
   931 };
       
   932 
       
   933 
       
   934 BASE(Op2, Instruction)
       
   935  private:
       
   936   Bytecodes::Code _op;
       
   937   Value           _x;
       
   938   Value           _y;
       
   939 
       
   940  public:
       
   941   // creation
       
   942   Op2(ValueType* type, Bytecodes::Code op, Value x, Value y) : Instruction(type), _op(op), _x(x), _y(y) {
       
   943     ASSERT_VALUES
       
   944   }
       
   945 
       
   946   // accessors
       
   947   Bytecodes::Code op() const                     { return _op; }
       
   948   Value x() const                                { return _x; }
       
   949   Value y() const                                { return _y; }
       
   950 
       
   951   // manipulators
       
   952   void swap_operands() {
       
   953     assert(is_commutative(), "operation must be commutative");
       
   954     Value t = _x; _x = _y; _y = t;
       
   955   }
       
   956 
       
   957   // generic
       
   958   virtual bool is_commutative() const            { return false; }
       
   959   virtual void input_values_do(void f(Value*))   { f(&_x); f(&_y); }
       
   960 };
       
   961 
       
   962 
       
   963 LEAF(ArithmeticOp, Op2)
       
   964  private:
       
   965   ValueStack* _lock_stack;                       // used only for division operations
       
   966  public:
       
   967   // creation
       
   968   ArithmeticOp(Bytecodes::Code op, Value x, Value y, bool is_strictfp, ValueStack* lock_stack)
       
   969   : Op2(x->type()->meet(y->type()), op, x, y)
       
   970   ,  _lock_stack(lock_stack) {
       
   971     set_flag(IsStrictfpFlag, is_strictfp);
       
   972     if (can_trap()) pin();
       
   973   }
       
   974 
       
   975   // accessors
       
   976   ValueStack* lock_stack() const                 { return _lock_stack; }
       
   977   bool        is_strictfp() const                { return check_flag(IsStrictfpFlag); }
       
   978 
       
   979   // setters
       
   980   void set_lock_stack(ValueStack* l)             { _lock_stack = l; }
       
   981 
       
   982   // generic
       
   983   virtual bool is_commutative() const;
       
   984   virtual bool can_trap() const;
       
   985   virtual void other_values_do(void f(Value*));
       
   986   HASHING3(Op2, true, op(), x()->subst(), y()->subst())
       
   987 };
       
   988 
       
   989 
       
   990 LEAF(ShiftOp, Op2)
       
   991  public:
       
   992   // creation
       
   993   ShiftOp(Bytecodes::Code op, Value x, Value s) : Op2(x->type()->base(), op, x, s) {}
       
   994 
       
   995   // generic
       
   996   HASHING3(Op2, true, op(), x()->subst(), y()->subst())
       
   997 };
       
   998 
       
   999 
       
  1000 LEAF(LogicOp, Op2)
       
  1001  public:
       
  1002   // creation
       
  1003   LogicOp(Bytecodes::Code op, Value x, Value y) : Op2(x->type()->meet(y->type()), op, x, y) {}
       
  1004 
       
  1005   // generic
       
  1006   virtual bool is_commutative() const;
       
  1007   HASHING3(Op2, true, op(), x()->subst(), y()->subst())
       
  1008 };
       
  1009 
       
  1010 
       
  1011 LEAF(CompareOp, Op2)
       
  1012  private:
       
  1013   ValueStack* _state_before;                     // for deoptimization, when canonicalizing
       
  1014  public:
       
  1015   // creation
       
  1016   CompareOp(Bytecodes::Code op, Value x, Value y, ValueStack* state_before)
       
  1017   : Op2(intType, op, x, y)
       
  1018   , _state_before(state_before)
       
  1019   {}
       
  1020 
       
  1021   // accessors
       
  1022   ValueStack* state_before() const               { return _state_before; }
       
  1023 
       
  1024   // generic
       
  1025   HASHING3(Op2, true, op(), x()->subst(), y()->subst())
       
  1026   virtual void other_values_do(void f(Value*));
       
  1027 };
       
  1028 
       
  1029 
       
  1030 LEAF(IfOp, Op2)
       
  1031  private:
       
  1032   Value _tval;
       
  1033   Value _fval;
       
  1034 
       
  1035  public:
       
  1036   // creation
       
  1037   IfOp(Value x, Condition cond, Value y, Value tval, Value fval)
       
  1038   : Op2(tval->type()->meet(fval->type()), (Bytecodes::Code)cond, x, y)
       
  1039   , _tval(tval)
       
  1040   , _fval(fval)
       
  1041   {
       
  1042     ASSERT_VALUES
       
  1043     assert(tval->type()->tag() == fval->type()->tag(), "types must match");
       
  1044   }
       
  1045 
       
  1046   // accessors
       
  1047   virtual bool is_commutative() const;
       
  1048   Bytecodes::Code op() const                     { ShouldNotCallThis(); return Bytecodes::_illegal; }
       
  1049   Condition cond() const                         { return (Condition)Op2::op(); }
       
  1050   Value tval() const                             { return _tval; }
       
  1051   Value fval() const                             { return _fval; }
       
  1052 
       
  1053   // generic
       
  1054   virtual void input_values_do(void f(Value*))   { Op2::input_values_do(f); f(&_tval); f(&_fval); }
       
  1055 };
       
  1056 
       
  1057 
       
  1058 LEAF(Convert, Instruction)
       
  1059  private:
       
  1060   Bytecodes::Code _op;
       
  1061   Value           _value;
       
  1062 
       
  1063  public:
       
  1064   // creation
       
  1065   Convert(Bytecodes::Code op, Value value, ValueType* to_type) : Instruction(to_type), _op(op), _value(value) {
       
  1066     ASSERT_VALUES
       
  1067   }
       
  1068 
       
  1069   // accessors
       
  1070   Bytecodes::Code op() const                     { return _op; }
       
  1071   Value value() const                            { return _value; }
       
  1072 
       
  1073   // generic
       
  1074   virtual void input_values_do(void f(Value*))   { f(&_value); }
       
  1075   HASHING2(Convert, true, op(), value()->subst())
       
  1076 };
       
  1077 
       
  1078 
       
  1079 LEAF(NullCheck, Instruction)
       
  1080  private:
       
  1081   Value       _obj;
       
  1082   ValueStack* _lock_stack;
       
  1083 
       
  1084  public:
       
  1085   // creation
       
  1086   NullCheck(Value obj, ValueStack* lock_stack) : Instruction(obj->type()->base()), _obj(obj), _lock_stack(lock_stack) {
       
  1087     ASSERT_VALUES
       
  1088     set_can_trap(true);
       
  1089     assert(_obj->type()->is_object(), "null check must be applied to objects only");
       
  1090     pin(Instruction::PinExplicitNullCheck);
       
  1091   }
       
  1092 
       
  1093   // accessors
       
  1094   Value obj() const                              { return _obj; }
       
  1095   ValueStack* lock_stack() const                 { return _lock_stack; }
       
  1096 
       
  1097   // setters
       
  1098   void set_lock_stack(ValueStack* l)             { _lock_stack = l; }
       
  1099   void set_can_trap(bool can_trap)               { set_flag(CanTrapFlag, can_trap); }
       
  1100 
       
  1101   // generic
       
  1102   virtual bool can_trap() const                  { return check_flag(CanTrapFlag); /* null-check elimination sets to false */ }
       
  1103   virtual void input_values_do(void f(Value*))   { f(&_obj); }
       
  1104   virtual void other_values_do(void f(Value*));
       
  1105   HASHING1(NullCheck, true, obj()->subst())
       
  1106 };
       
  1107 
       
  1108 
       
  1109 BASE(StateSplit, Instruction)
       
  1110  private:
       
  1111   ValueStack* _state;
       
  1112 
       
  1113  protected:
       
  1114   static void substitute(BlockList& list, BlockBegin* old_block, BlockBegin* new_block);
       
  1115 
       
  1116  public:
       
  1117   // creation
       
  1118   StateSplit(ValueType* type) : Instruction(type), _state(NULL) {
       
  1119     pin(PinStateSplitConstructor);
       
  1120   }
       
  1121 
       
  1122   // accessors
       
  1123   ValueStack* state() const                      { return _state; }
       
  1124   IRScope* scope() const;                        // the state's scope
       
  1125 
       
  1126   // manipulation
       
  1127   void set_state(ValueStack* state)              { _state = state; }
       
  1128 
       
  1129   // generic
       
  1130   virtual void input_values_do(void f(Value*))   { /* no values */ }
       
  1131   virtual void state_values_do(void f(Value*));
       
  1132 };
       
  1133 
       
  1134 
       
  1135 LEAF(Invoke, StateSplit)
       
  1136  private:
       
  1137   Bytecodes::Code           _code;
       
  1138   Value                     _recv;
       
  1139   Values*                   _args;
       
  1140   BasicTypeList*            _signature;
       
  1141   int                       _vtable_index;
       
  1142   ciMethod*                 _target;
       
  1143 
       
  1144  public:
       
  1145   // creation
       
  1146   Invoke(Bytecodes::Code code, ValueType* result_type, Value recv, Values* args,
       
  1147          int vtable_index, ciMethod* target);
       
  1148 
       
  1149   // accessors
       
  1150   Bytecodes::Code code() const                   { return _code; }
       
  1151   Value receiver() const                         { return _recv; }
       
  1152   bool has_receiver() const                      { return receiver() != NULL; }
       
  1153   int number_of_arguments() const                { return _args->length(); }
       
  1154   Value argument_at(int i) const                 { return _args->at(i); }
       
  1155   int vtable_index() const                       { return _vtable_index; }
       
  1156   BasicTypeList* signature() const               { return _signature; }
       
  1157   ciMethod* target() const                       { return _target; }
       
  1158 
       
  1159   // Returns false if target is not loaded
       
  1160   bool target_is_final() const                   { return check_flag(TargetIsFinalFlag); }
       
  1161   bool target_is_loaded() const                  { return check_flag(TargetIsLoadedFlag); }
       
  1162   // Returns false if target is not loaded
       
  1163   bool target_is_strictfp() const                { return check_flag(TargetIsStrictfpFlag); }
       
  1164 
       
  1165   // generic
       
  1166   virtual bool can_trap() const                  { return true; }
       
  1167   virtual void input_values_do(void f(Value*)) {
       
  1168     StateSplit::input_values_do(f);
       
  1169     if (has_receiver()) f(&_recv);
       
  1170     for (int i = 0; i < _args->length(); i++) f(_args->adr_at(i));
       
  1171   }
       
  1172 };
       
  1173 
       
  1174 
       
  1175 LEAF(NewInstance, StateSplit)
       
  1176  private:
       
  1177   ciInstanceKlass* _klass;
       
  1178 
       
  1179  public:
       
  1180   // creation
       
  1181   NewInstance(ciInstanceKlass* klass) : StateSplit(instanceType), _klass(klass) {}
       
  1182 
       
  1183   // accessors
       
  1184   ciInstanceKlass* klass() const                 { return _klass; }
       
  1185 
       
  1186   // generic
       
  1187   virtual bool can_trap() const                  { return true; }
       
  1188   ciType* exact_type() const;
       
  1189 };
       
  1190 
       
  1191 
       
  1192 BASE(NewArray, StateSplit)
       
  1193  private:
       
  1194   Value       _length;
       
  1195   ValueStack* _state_before;
       
  1196 
       
  1197  public:
       
  1198   // creation
       
  1199   NewArray(Value length, ValueStack* state_before) : StateSplit(objectType), _length(length), _state_before(state_before) {
       
  1200     // Do not ASSERT_VALUES since length is NULL for NewMultiArray
       
  1201   }
       
  1202 
       
  1203   // accessors
       
  1204   ValueStack* state_before() const               { return _state_before; }
       
  1205   Value length() const                           { return _length; }
       
  1206 
       
  1207   // generic
       
  1208   virtual bool can_trap() const                  { return true; }
       
  1209   virtual void input_values_do(void f(Value*))   { StateSplit::input_values_do(f); f(&_length); }
       
  1210   virtual void other_values_do(void f(Value*));
       
  1211 };
       
  1212 
       
  1213 
       
  1214 LEAF(NewTypeArray, NewArray)
       
  1215  private:
       
  1216   BasicType _elt_type;
       
  1217 
       
  1218  public:
       
  1219   // creation
       
  1220   NewTypeArray(Value length, BasicType elt_type) : NewArray(length, NULL), _elt_type(elt_type) {}
       
  1221 
       
  1222   // accessors
       
  1223   BasicType elt_type() const                     { return _elt_type; }
       
  1224   ciType* exact_type() const;
       
  1225 };
       
  1226 
       
  1227 
       
  1228 LEAF(NewObjectArray, NewArray)
       
  1229  private:
       
  1230   ciKlass* _klass;
       
  1231 
       
  1232  public:
       
  1233   // creation
       
  1234   NewObjectArray(ciKlass* klass, Value length, ValueStack* state_before) : NewArray(length, state_before), _klass(klass) {}
       
  1235 
       
  1236   // accessors
       
  1237   ciKlass* klass() const                         { return _klass; }
       
  1238   ciType* exact_type() const;
       
  1239 };
       
  1240 
       
  1241 
       
  1242 LEAF(NewMultiArray, NewArray)
       
  1243  private:
       
  1244   ciKlass* _klass;
       
  1245   Values*  _dims;
       
  1246 
       
  1247  public:
       
  1248   // creation
       
  1249   NewMultiArray(ciKlass* klass, Values* dims, ValueStack* state_before) : NewArray(NULL, state_before), _klass(klass), _dims(dims) {
       
  1250     ASSERT_VALUES
       
  1251   }
       
  1252 
       
  1253   // accessors
       
  1254   ciKlass* klass() const                         { return _klass; }
       
  1255   Values* dims() const                           { return _dims; }
       
  1256   int rank() const                               { return dims()->length(); }
       
  1257 
       
  1258   // generic
       
  1259   virtual void input_values_do(void f(Value*)) {
       
  1260     // NOTE: we do not call NewArray::input_values_do since "length"
       
  1261     // is meaningless for a multi-dimensional array; passing the
       
  1262     // zeroth element down to NewArray as its length is a bad idea
       
  1263     // since there will be a copy in the "dims" array which doesn't
       
  1264     // get updated, and the value must not be traversed twice. Was bug
       
  1265     // - kbr 4/10/2001
       
  1266     StateSplit::input_values_do(f);
       
  1267     for (int i = 0; i < _dims->length(); i++) f(_dims->adr_at(i));
       
  1268   }
       
  1269 };
       
  1270 
       
  1271 
       
  1272 BASE(TypeCheck, StateSplit)
       
  1273  private:
       
  1274   ciKlass*    _klass;
       
  1275   Value       _obj;
       
  1276   ValueStack* _state_before;
       
  1277 
       
  1278  public:
       
  1279   // creation
       
  1280   TypeCheck(ciKlass* klass, Value obj, ValueType* type, ValueStack* state_before) : StateSplit(type), _klass(klass), _obj(obj), _state_before(state_before) {
       
  1281     ASSERT_VALUES
       
  1282     set_direct_compare(false);
       
  1283   }
       
  1284 
       
  1285   // accessors
       
  1286   ValueStack* state_before() const               { return _state_before; }
       
  1287   ciKlass* klass() const                         { return _klass; }
       
  1288   Value obj() const                              { return _obj; }
       
  1289   bool is_loaded() const                         { return klass() != NULL; }
       
  1290   bool direct_compare() const                    { return check_flag(DirectCompareFlag); }
       
  1291 
       
  1292   // manipulation
       
  1293   void set_direct_compare(bool flag)             { set_flag(DirectCompareFlag, flag); }
       
  1294 
       
  1295   // generic
       
  1296   virtual bool can_trap() const                  { return true; }
       
  1297   virtual void input_values_do(void f(Value*))   { StateSplit::input_values_do(f); f(&_obj); }
       
  1298   virtual void other_values_do(void f(Value*));
       
  1299 };
       
  1300 
       
  1301 
       
  1302 LEAF(CheckCast, TypeCheck)
       
  1303  private:
       
  1304   ciMethod* _profiled_method;
       
  1305   int       _profiled_bci;
       
  1306 
       
  1307  public:
       
  1308   // creation
       
  1309   CheckCast(ciKlass* klass, Value obj, ValueStack* state_before)
       
  1310   : TypeCheck(klass, obj, objectType, state_before)
       
  1311   , _profiled_method(NULL)
       
  1312   , _profiled_bci(0) {}
       
  1313 
       
  1314   void set_incompatible_class_change_check() {
       
  1315     set_flag(ThrowIncompatibleClassChangeErrorFlag, true);
       
  1316   }
       
  1317   bool is_incompatible_class_change_check() const {
       
  1318     return check_flag(ThrowIncompatibleClassChangeErrorFlag);
       
  1319   }
       
  1320 
       
  1321   // Helpers for methodDataOop profiling
       
  1322   void set_should_profile(bool value)                { set_flag(ProfileMDOFlag, value); }
       
  1323   void set_profiled_method(ciMethod* method)         { _profiled_method = method;   }
       
  1324   void set_profiled_bci(int bci)                     { _profiled_bci = bci;         }
       
  1325   bool      should_profile() const                   { return check_flag(ProfileMDOFlag); }
       
  1326   ciMethod* profiled_method() const                  { return _profiled_method;     }
       
  1327   int       profiled_bci() const                     { return _profiled_bci;        }
       
  1328 
       
  1329   ciType* declared_type() const;
       
  1330   ciType* exact_type() const;
       
  1331 
       
  1332 };
       
  1333 
       
  1334 
       
  1335 LEAF(InstanceOf, TypeCheck)
       
  1336  public:
       
  1337   // creation
       
  1338   InstanceOf(ciKlass* klass, Value obj, ValueStack* state_before) : TypeCheck(klass, obj, intType, state_before) {}
       
  1339 };
       
  1340 
       
  1341 
       
  1342 BASE(AccessMonitor, StateSplit)
       
  1343  private:
       
  1344   Value       _obj;
       
  1345   int         _monitor_no;
       
  1346 
       
  1347  public:
       
  1348   // creation
       
  1349   AccessMonitor(Value obj, int monitor_no)
       
  1350   : StateSplit(illegalType)
       
  1351   , _obj(obj)
       
  1352   , _monitor_no(monitor_no)
       
  1353   {
       
  1354     set_needs_null_check(true);
       
  1355     ASSERT_VALUES
       
  1356   }
       
  1357 
       
  1358   // accessors
       
  1359   Value obj() const                              { return _obj; }
       
  1360   int monitor_no() const                         { return _monitor_no; }
       
  1361 
       
  1362   // generic
       
  1363   virtual void input_values_do(void f(Value*))   { StateSplit::input_values_do(f); f(&_obj); }
       
  1364 };
       
  1365 
       
  1366 
       
  1367 LEAF(MonitorEnter, AccessMonitor)
       
  1368  private:
       
  1369   ValueStack* _lock_stack_before;
       
  1370 
       
  1371  public:
       
  1372   // creation
       
  1373   MonitorEnter(Value obj, int monitor_no, ValueStack* lock_stack_before)
       
  1374   : AccessMonitor(obj, monitor_no)
       
  1375   , _lock_stack_before(lock_stack_before)
       
  1376   {
       
  1377     ASSERT_VALUES
       
  1378   }
       
  1379 
       
  1380   // accessors
       
  1381   ValueStack* lock_stack_before() const          { return _lock_stack_before; }
       
  1382   virtual void state_values_do(void f(Value*));
       
  1383 
       
  1384   // generic
       
  1385   virtual bool can_trap() const                  { return true; }
       
  1386 };
       
  1387 
       
  1388 
       
  1389 LEAF(MonitorExit, AccessMonitor)
       
  1390  public:
       
  1391   // creation
       
  1392   MonitorExit(Value obj, int monitor_no) : AccessMonitor(obj, monitor_no) {}
       
  1393 };
       
  1394 
       
  1395 
       
  1396 LEAF(Intrinsic, StateSplit)
       
  1397  private:
       
  1398   vmIntrinsics::ID _id;
       
  1399   Values*          _args;
       
  1400   ValueStack*      _lock_stack;
       
  1401   Value            _recv;
       
  1402 
       
  1403  public:
       
  1404   // preserves_state can be set to true for Intrinsics
       
  1405   // which are guaranteed to preserve register state across any slow
       
  1406   // cases; setting it to true does not mean that the Intrinsic can
       
  1407   // not trap, only that if we continue execution in the same basic
       
  1408   // block after the Intrinsic, all of the registers are intact. This
       
  1409   // allows load elimination and common expression elimination to be
       
  1410   // performed across the Intrinsic.  The default value is false.
       
  1411   Intrinsic(ValueType* type,
       
  1412             vmIntrinsics::ID id,
       
  1413             Values* args,
       
  1414             bool has_receiver,
       
  1415             ValueStack* lock_stack,
       
  1416             bool preserves_state,
       
  1417             bool cantrap = true)
       
  1418   : StateSplit(type)
       
  1419   , _id(id)
       
  1420   , _args(args)
       
  1421   , _lock_stack(lock_stack)
       
  1422   , _recv(NULL)
       
  1423   {
       
  1424     assert(args != NULL, "args must exist");
       
  1425     ASSERT_VALUES
       
  1426     set_flag(PreservesStateFlag, preserves_state);
       
  1427     set_flag(CanTrapFlag,        cantrap);
       
  1428     if (has_receiver) {
       
  1429       _recv = argument_at(0);
       
  1430     }
       
  1431     set_needs_null_check(has_receiver);
       
  1432 
       
  1433     // some intrinsics can't trap, so don't force them to be pinned
       
  1434     if (!can_trap()) {
       
  1435       unpin(PinStateSplitConstructor);
       
  1436     }
       
  1437   }
       
  1438 
       
  1439   // accessors
       
  1440   vmIntrinsics::ID id() const                    { return _id; }
       
  1441   int number_of_arguments() const                { return _args->length(); }
       
  1442   Value argument_at(int i) const                 { return _args->at(i); }
       
  1443   ValueStack* lock_stack() const                 { return _lock_stack; }
       
  1444 
       
  1445   bool has_receiver() const                      { return (_recv != NULL); }
       
  1446   Value receiver() const                         { assert(has_receiver(), "must have receiver"); return _recv; }
       
  1447   bool preserves_state() const                   { return check_flag(PreservesStateFlag); }
       
  1448 
       
  1449   // generic
       
  1450   virtual bool can_trap() const                  { return check_flag(CanTrapFlag); }
       
  1451   virtual void input_values_do(void f(Value*)) {
       
  1452     StateSplit::input_values_do(f);
       
  1453     for (int i = 0; i < _args->length(); i++) f(_args->adr_at(i));
       
  1454   }
       
  1455   virtual void state_values_do(void f(Value*));
       
  1456 
       
  1457 };
       
  1458 
       
  1459 
       
  1460 class LIR_List;
       
  1461 
       
  1462 LEAF(BlockBegin, StateSplit)
       
  1463  private:
       
  1464   static int _next_block_id;                     // the block counter
       
  1465 
       
  1466   int        _block_id;                          // the unique block id
       
  1467   int        _depth_first_number;                // number of this block in a depth-first ordering
       
  1468   int        _linear_scan_number;                // number of this block in linear-scan ordering
       
  1469   int        _loop_depth;                        // the loop nesting level of this block
       
  1470   int        _loop_index;                        // number of the innermost loop of this block
       
  1471   int        _flags;                             // the flags associated with this block
       
  1472 
       
  1473   // fields used by BlockListBuilder
       
  1474   int        _total_preds;                       // number of predecessors found by BlockListBuilder
       
  1475   BitMap     _stores_to_locals;                  // bit is set when a local variable is stored in the block
       
  1476 
       
  1477   // SSA specific fields: (factor out later)
       
  1478   BlockList   _successors;                       // the successors of this block
       
  1479   BlockList   _predecessors;                     // the predecessors of this block
       
  1480   BlockBegin* _dominator;                        // the dominator of this block
       
  1481   // SSA specific ends
       
  1482   BlockEnd*  _end;                               // the last instruction of this block
       
  1483   BlockList  _exception_handlers;                // the exception handlers potentially invoked by this block
       
  1484   ValueStackStack* _exception_states;            // only for xhandler entries: states of all instructions that have an edge to this xhandler
       
  1485   int        _exception_handler_pco;             // if this block is the start of an exception handler,
       
  1486                                                  // this records the PC offset in the assembly code of the
       
  1487                                                  // first instruction in this block
       
  1488   Label      _label;                             // the label associated with this block
       
  1489   LIR_List*  _lir;                               // the low level intermediate representation for this block
       
  1490 
       
  1491   BitMap      _live_in;                          // set of live LIR_Opr registers at entry to this block
       
  1492   BitMap      _live_out;                         // set of live LIR_Opr registers at exit from this block
       
  1493   BitMap      _live_gen;                         // set of registers used before any redefinition in this block
       
  1494   BitMap      _live_kill;                        // set of registers defined in this block
       
  1495 
       
  1496   BitMap      _fpu_register_usage;
       
  1497   intArray*   _fpu_stack_state;                  // For x86 FPU code generation with UseLinearScan
       
  1498   int         _first_lir_instruction_id;         // ID of first LIR instruction in this block
       
  1499   int         _last_lir_instruction_id;          // ID of last LIR instruction in this block
       
  1500 
       
  1501   void iterate_preorder (boolArray& mark, BlockClosure* closure);
       
  1502   void iterate_postorder(boolArray& mark, BlockClosure* closure);
       
  1503 
       
  1504   friend class SuxAndWeightAdjuster;
       
  1505 
       
  1506  public:
       
  1507   // initialization/counting
       
  1508   static void initialize()                       { _next_block_id = 0; }
       
  1509   static int  number_of_blocks()                 { return _next_block_id; }
       
  1510 
       
  1511   // creation
       
  1512   BlockBegin(int bci)
       
  1513   : StateSplit(illegalType)
       
  1514   , _block_id(_next_block_id++)
       
  1515   , _depth_first_number(-1)
       
  1516   , _linear_scan_number(-1)
       
  1517   , _loop_depth(0)
       
  1518   , _flags(0)
       
  1519   , _dominator(NULL)
       
  1520   , _end(NULL)
       
  1521   , _predecessors(2)
       
  1522   , _successors(2)
       
  1523   , _exception_handlers(1)
       
  1524   , _exception_states(NULL)
       
  1525   , _exception_handler_pco(-1)
       
  1526   , _lir(NULL)
       
  1527   , _loop_index(-1)
       
  1528   , _live_in()
       
  1529   , _live_out()
       
  1530   , _live_gen()
       
  1531   , _live_kill()
       
  1532   , _fpu_register_usage()
       
  1533   , _fpu_stack_state(NULL)
       
  1534   , _first_lir_instruction_id(-1)
       
  1535   , _last_lir_instruction_id(-1)
       
  1536   , _total_preds(0)
       
  1537   , _stores_to_locals()
       
  1538   {
       
  1539     set_bci(bci);
       
  1540   }
       
  1541 
       
  1542   // accessors
       
  1543   int block_id() const                           { return _block_id; }
       
  1544   BlockList* successors()                        { return &_successors; }
       
  1545   BlockBegin* dominator() const                  { return _dominator; }
       
  1546   int loop_depth() const                         { return _loop_depth; }
       
  1547   int depth_first_number() const                 { return _depth_first_number; }
       
  1548   int linear_scan_number() const                 { return _linear_scan_number; }
       
  1549   BlockEnd* end() const                          { return _end; }
       
  1550   Label* label()                                 { return &_label; }
       
  1551   LIR_List* lir() const                          { return _lir; }
       
  1552   int exception_handler_pco() const              { return _exception_handler_pco; }
       
  1553   BitMap& live_in()                              { return _live_in;        }
       
  1554   BitMap& live_out()                             { return _live_out;       }
       
  1555   BitMap& live_gen()                             { return _live_gen;       }
       
  1556   BitMap& live_kill()                            { return _live_kill;      }
       
  1557   BitMap& fpu_register_usage()                   { return _fpu_register_usage; }
       
  1558   intArray* fpu_stack_state() const              { return _fpu_stack_state;    }
       
  1559   int first_lir_instruction_id() const           { return _first_lir_instruction_id; }
       
  1560   int last_lir_instruction_id() const            { return _last_lir_instruction_id; }
       
  1561   int total_preds() const                        { return _total_preds; }
       
  1562   BitMap& stores_to_locals()                     { return _stores_to_locals; }
       
  1563 
       
  1564   // manipulation
       
  1565   void set_bci(int bci)                          { Instruction::set_bci(bci); }
       
  1566   void set_dominator(BlockBegin* dom)            { _dominator = dom; }
       
  1567   void set_loop_depth(int d)                     { _loop_depth = d; }
       
  1568   void set_depth_first_number(int dfn)           { _depth_first_number = dfn; }
       
  1569   void set_linear_scan_number(int lsn)           { _linear_scan_number = lsn; }
       
  1570   void set_end(BlockEnd* end);
       
  1571   void disconnect_from_graph();
       
  1572   static void disconnect_edge(BlockBegin* from, BlockBegin* to);
       
  1573   BlockBegin* insert_block_between(BlockBegin* sux);
       
  1574   void substitute_sux(BlockBegin* old_sux, BlockBegin* new_sux);
       
  1575   void set_lir(LIR_List* lir)                    { _lir = lir; }
       
  1576   void set_exception_handler_pco(int pco)        { _exception_handler_pco = pco; }
       
  1577   void set_live_in       (BitMap map)            { _live_in = map;        }
       
  1578   void set_live_out      (BitMap map)            { _live_out = map;       }
       
  1579   void set_live_gen      (BitMap map)            { _live_gen = map;       }
       
  1580   void set_live_kill     (BitMap map)            { _live_kill = map;      }
       
  1581   void set_fpu_register_usage(BitMap map)        { _fpu_register_usage = map; }
       
  1582   void set_fpu_stack_state(intArray* state)      { _fpu_stack_state = state;  }
       
  1583   void set_first_lir_instruction_id(int id)      { _first_lir_instruction_id = id;  }
       
  1584   void set_last_lir_instruction_id(int id)       { _last_lir_instruction_id = id;  }
       
  1585   void increment_total_preds(int n = 1)          { _total_preds += n; }
       
  1586   void init_stores_to_locals(int locals_count)   { _stores_to_locals = BitMap(locals_count); _stores_to_locals.clear(); }
       
  1587 
       
  1588   // generic
       
  1589   virtual void state_values_do(void f(Value*));
       
  1590 
       
  1591   // successors and predecessors
       
  1592   int number_of_sux() const;
       
  1593   BlockBegin* sux_at(int i) const;
       
  1594   void add_successor(BlockBegin* sux);
       
  1595   void remove_successor(BlockBegin* pred);
       
  1596   bool is_successor(BlockBegin* sux) const       { return _successors.contains(sux); }
       
  1597 
       
  1598   void add_predecessor(BlockBegin* pred);
       
  1599   void remove_predecessor(BlockBegin* pred);
       
  1600   bool is_predecessor(BlockBegin* pred) const    { return _predecessors.contains(pred); }
       
  1601   int number_of_preds() const                    { return _predecessors.length(); }
       
  1602   BlockBegin* pred_at(int i) const               { return _predecessors[i]; }
       
  1603 
       
  1604   // exception handlers potentially invoked by this block
       
  1605   void add_exception_handler(BlockBegin* b);
       
  1606   bool is_exception_handler(BlockBegin* b) const { return _exception_handlers.contains(b); }
       
  1607   int  number_of_exception_handlers() const      { return _exception_handlers.length(); }
       
  1608   BlockBegin* exception_handler_at(int i) const  { return _exception_handlers.at(i); }
       
  1609 
       
  1610   // states of the instructions that have an edge to this exception handler
       
  1611   int number_of_exception_states()               { assert(is_set(exception_entry_flag), "only for xhandlers"); return _exception_states == NULL ? 0 : _exception_states->length(); }
       
  1612   ValueStack* exception_state_at(int idx) const  { assert(is_set(exception_entry_flag), "only for xhandlers"); return _exception_states->at(idx); }
       
  1613   int add_exception_state(ValueStack* state);
       
  1614 
       
  1615   // flags
       
  1616   enum Flag {
       
  1617     no_flag                       = 0,
       
  1618     std_entry_flag                = 1 << 0,
       
  1619     osr_entry_flag                = 1 << 1,
       
  1620     exception_entry_flag          = 1 << 2,
       
  1621     subroutine_entry_flag         = 1 << 3,
       
  1622     backward_branch_target_flag   = 1 << 4,
       
  1623     is_on_work_list_flag          = 1 << 5,
       
  1624     was_visited_flag              = 1 << 6,
       
  1625     default_exception_handler_flag = 1 << 8, // identify block which represents the default exception handler
       
  1626     parser_loop_header_flag       = 1 << 9,  // set by parser to identify blocks where phi functions can not be created on demand
       
  1627     critical_edge_split_flag      = 1 << 10, // set for all blocks that are introduced when critical edges are split
       
  1628     linear_scan_loop_header_flag  = 1 << 11, // set during loop-detection for LinearScan
       
  1629     linear_scan_loop_end_flag     = 1 << 12  // set during loop-detection for LinearScan
       
  1630   };
       
  1631 
       
  1632   void set(Flag f)                               { _flags |= f; }
       
  1633   void clear(Flag f)                             { _flags &= ~f; }
       
  1634   bool is_set(Flag f) const                      { return (_flags & f) != 0; }
       
  1635   bool is_entry_block() const {
       
  1636     const int entry_mask = std_entry_flag | osr_entry_flag | exception_entry_flag;
       
  1637     return (_flags & entry_mask) != 0;
       
  1638   }
       
  1639 
       
  1640   // iteration
       
  1641   void iterate_preorder   (BlockClosure* closure);
       
  1642   void iterate_postorder  (BlockClosure* closure);
       
  1643 
       
  1644   void block_values_do(void f(Value*));
       
  1645 
       
  1646   // loops
       
  1647   void set_loop_index(int ix)                    { _loop_index = ix;        }
       
  1648   int  loop_index() const                        { return _loop_index;      }
       
  1649 
       
  1650   // merging
       
  1651   bool try_merge(ValueStack* state);             // try to merge states at block begin
       
  1652   void merge(ValueStack* state)                  { bool b = try_merge(state); assert(b, "merge failed"); }
       
  1653 
       
  1654   // debugging
       
  1655   void print_block()                             PRODUCT_RETURN;
       
  1656   void print_block(InstructionPrinter& ip, bool live_only = false) PRODUCT_RETURN;
       
  1657 };
       
  1658 
       
  1659 
       
  1660 BASE(BlockEnd, StateSplit)
       
  1661  private:
       
  1662   BlockBegin* _begin;
       
  1663   BlockList*  _sux;
       
  1664   ValueStack* _state_before;
       
  1665 
       
  1666  protected:
       
  1667   BlockList* sux() const                         { return _sux; }
       
  1668 
       
  1669   void set_sux(BlockList* sux) {
       
  1670 #ifdef ASSERT
       
  1671     assert(sux != NULL, "sux must exist");
       
  1672     for (int i = sux->length() - 1; i >= 0; i--) assert(sux->at(i) != NULL, "sux must exist");
       
  1673 #endif
       
  1674     _sux = sux;
       
  1675   }
       
  1676 
       
  1677  public:
       
  1678   // creation
       
  1679   BlockEnd(ValueType* type, ValueStack* state_before, bool is_safepoint)
       
  1680   : StateSplit(type)
       
  1681   , _begin(NULL)
       
  1682   , _sux(NULL)
       
  1683   , _state_before(state_before) {
       
  1684     set_flag(IsSafepointFlag, is_safepoint);
       
  1685   }
       
  1686 
       
  1687   // accessors
       
  1688   ValueStack* state_before() const               { return _state_before; }
       
  1689   bool is_safepoint() const                      { return check_flag(IsSafepointFlag); }
       
  1690   BlockBegin* begin() const                      { return _begin; }
       
  1691 
       
  1692   // manipulation
       
  1693   void set_begin(BlockBegin* begin);
       
  1694 
       
  1695   // generic
       
  1696   virtual void other_values_do(void f(Value*));
       
  1697 
       
  1698   // successors
       
  1699   int number_of_sux() const                      { return _sux != NULL ? _sux->length() : 0; }
       
  1700   BlockBegin* sux_at(int i) const                { return _sux->at(i); }
       
  1701   BlockBegin* default_sux() const                { return sux_at(number_of_sux() - 1); }
       
  1702   BlockBegin** addr_sux_at(int i) const          { return _sux->adr_at(i); }
       
  1703   int sux_index(BlockBegin* sux) const           { return _sux->find(sux); }
       
  1704   void substitute_sux(BlockBegin* old_sux, BlockBegin* new_sux);
       
  1705 };
       
  1706 
       
  1707 
       
  1708 LEAF(Goto, BlockEnd)
       
  1709  public:
       
  1710   // creation
       
  1711   Goto(BlockBegin* sux, ValueStack* state_before, bool is_safepoint = false) : BlockEnd(illegalType, state_before, is_safepoint) {
       
  1712     BlockList* s = new BlockList(1);
       
  1713     s->append(sux);
       
  1714     set_sux(s);
       
  1715   }
       
  1716 
       
  1717   Goto(BlockBegin* sux, bool is_safepoint) : BlockEnd(illegalType, NULL, is_safepoint) {
       
  1718     BlockList* s = new BlockList(1);
       
  1719     s->append(sux);
       
  1720     set_sux(s);
       
  1721   }
       
  1722 
       
  1723 };
       
  1724 
       
  1725 
       
  1726 LEAF(If, BlockEnd)
       
  1727  private:
       
  1728   Value       _x;
       
  1729   Condition   _cond;
       
  1730   Value       _y;
       
  1731   ciMethod*   _profiled_method;
       
  1732   int         _profiled_bci; // Canonicalizer may alter bci of If node
       
  1733  public:
       
  1734   // creation
       
  1735   // unordered_is_true is valid for float/double compares only
       
  1736   If(Value x, Condition cond, bool unordered_is_true, Value y, BlockBegin* tsux, BlockBegin* fsux, ValueStack* state_before, bool is_safepoint)
       
  1737     : BlockEnd(illegalType, state_before, is_safepoint)
       
  1738   , _x(x)
       
  1739   , _cond(cond)
       
  1740   , _y(y)
       
  1741   , _profiled_method(NULL)
       
  1742   , _profiled_bci(0)
       
  1743   {
       
  1744     ASSERT_VALUES
       
  1745     set_flag(UnorderedIsTrueFlag, unordered_is_true);
       
  1746     assert(x->type()->tag() == y->type()->tag(), "types must match");
       
  1747     BlockList* s = new BlockList(2);
       
  1748     s->append(tsux);
       
  1749     s->append(fsux);
       
  1750     set_sux(s);
       
  1751   }
       
  1752 
       
  1753   // accessors
       
  1754   Value x() const                                { return _x; }
       
  1755   Condition cond() const                         { return _cond; }
       
  1756   bool unordered_is_true() const                 { return check_flag(UnorderedIsTrueFlag); }
       
  1757   Value y() const                                { return _y; }
       
  1758   BlockBegin* sux_for(bool is_true) const        { return sux_at(is_true ? 0 : 1); }
       
  1759   BlockBegin* tsux() const                       { return sux_for(true); }
       
  1760   BlockBegin* fsux() const                       { return sux_for(false); }
       
  1761   BlockBegin* usux() const                       { return sux_for(unordered_is_true()); }
       
  1762   bool should_profile() const                    { return check_flag(ProfileMDOFlag); }
       
  1763   ciMethod* profiled_method() const              { return _profiled_method; } // set only for profiled branches
       
  1764   int profiled_bci() const                       { return _profiled_bci; }    // set only for profiled branches
       
  1765 
       
  1766   // manipulation
       
  1767   void swap_operands() {
       
  1768     Value t = _x; _x = _y; _y = t;
       
  1769     _cond = mirror(_cond);
       
  1770   }
       
  1771 
       
  1772   void swap_sux() {
       
  1773     assert(number_of_sux() == 2, "wrong number of successors");
       
  1774     BlockList* s = sux();
       
  1775     BlockBegin* t = s->at(0); s->at_put(0, s->at(1)); s->at_put(1, t);
       
  1776     _cond = negate(_cond);
       
  1777     set_flag(UnorderedIsTrueFlag, !check_flag(UnorderedIsTrueFlag));
       
  1778   }
       
  1779 
       
  1780   void set_should_profile(bool value)             { set_flag(ProfileMDOFlag, value); }
       
  1781   void set_profiled_method(ciMethod* method)      { _profiled_method = method; }
       
  1782   void set_profiled_bci(int bci)                  { _profiled_bci = bci;       }
       
  1783 
       
  1784   // generic
       
  1785   virtual void input_values_do(void f(Value*))   { BlockEnd::input_values_do(f); f(&_x); f(&_y); }
       
  1786 };
       
  1787 
       
  1788 
       
  1789 LEAF(IfInstanceOf, BlockEnd)
       
  1790  private:
       
  1791   ciKlass* _klass;
       
  1792   Value    _obj;
       
  1793   bool     _test_is_instance;                    // jump if instance
       
  1794   int      _instanceof_bci;
       
  1795 
       
  1796  public:
       
  1797   IfInstanceOf(ciKlass* klass, Value obj, bool test_is_instance, int instanceof_bci, BlockBegin* tsux, BlockBegin* fsux)
       
  1798   : BlockEnd(illegalType, NULL, false) // temporary set to false
       
  1799   , _klass(klass)
       
  1800   , _obj(obj)
       
  1801   , _test_is_instance(test_is_instance)
       
  1802   , _instanceof_bci(instanceof_bci)
       
  1803   {
       
  1804     ASSERT_VALUES
       
  1805     assert(instanceof_bci >= 0, "illegal bci");
       
  1806     BlockList* s = new BlockList(2);
       
  1807     s->append(tsux);
       
  1808     s->append(fsux);
       
  1809     set_sux(s);
       
  1810   }
       
  1811 
       
  1812   // accessors
       
  1813   //
       
  1814   // Note 1: If test_is_instance() is true, IfInstanceOf tests if obj *is* an
       
  1815   //         instance of klass; otherwise it tests if it is *not* and instance
       
  1816   //         of klass.
       
  1817   //
       
  1818   // Note 2: IfInstanceOf instructions are created by combining an InstanceOf
       
  1819   //         and an If instruction. The IfInstanceOf bci() corresponds to the
       
  1820   //         bci that the If would have had; the (this->) instanceof_bci() is
       
  1821   //         the bci of the original InstanceOf instruction.
       
  1822   ciKlass* klass() const                         { return _klass; }
       
  1823   Value obj() const                              { return _obj; }
       
  1824   int instanceof_bci() const                     { return _instanceof_bci; }
       
  1825   bool test_is_instance() const                  { return _test_is_instance; }
       
  1826   BlockBegin* sux_for(bool is_true) const        { return sux_at(is_true ? 0 : 1); }
       
  1827   BlockBegin* tsux() const                       { return sux_for(true); }
       
  1828   BlockBegin* fsux() const                       { return sux_for(false); }
       
  1829 
       
  1830   // manipulation
       
  1831   void swap_sux() {
       
  1832     assert(number_of_sux() == 2, "wrong number of successors");
       
  1833     BlockList* s = sux();
       
  1834     BlockBegin* t = s->at(0); s->at_put(0, s->at(1)); s->at_put(1, t);
       
  1835     _test_is_instance = !_test_is_instance;
       
  1836   }
       
  1837 
       
  1838   // generic
       
  1839   virtual void input_values_do(void f(Value*))   { BlockEnd::input_values_do(f); f(&_obj); }
       
  1840 };
       
  1841 
       
  1842 
       
  1843 BASE(Switch, BlockEnd)
       
  1844  private:
       
  1845   Value       _tag;
       
  1846 
       
  1847  public:
       
  1848   // creation
       
  1849   Switch(Value tag, BlockList* sux, ValueStack* state_before, bool is_safepoint)
       
  1850   : BlockEnd(illegalType, state_before, is_safepoint)
       
  1851   , _tag(tag) {
       
  1852     ASSERT_VALUES
       
  1853     set_sux(sux);
       
  1854   }
       
  1855 
       
  1856   // accessors
       
  1857   Value tag() const                              { return _tag; }
       
  1858   int length() const                             { return number_of_sux() - 1; }
       
  1859 
       
  1860   // generic
       
  1861   virtual void input_values_do(void f(Value*))   { BlockEnd::input_values_do(f); f(&_tag); }
       
  1862 };
       
  1863 
       
  1864 
       
  1865 LEAF(TableSwitch, Switch)
       
  1866  private:
       
  1867   int _lo_key;
       
  1868 
       
  1869  public:
       
  1870   // creation
       
  1871   TableSwitch(Value tag, BlockList* sux, int lo_key, ValueStack* state_before, bool is_safepoint)
       
  1872     : Switch(tag, sux, state_before, is_safepoint)
       
  1873   , _lo_key(lo_key) {}
       
  1874 
       
  1875   // accessors
       
  1876   int lo_key() const                             { return _lo_key; }
       
  1877   int hi_key() const                             { return _lo_key + length() - 1; }
       
  1878 };
       
  1879 
       
  1880 
       
  1881 LEAF(LookupSwitch, Switch)
       
  1882  private:
       
  1883   intArray* _keys;
       
  1884 
       
  1885  public:
       
  1886   // creation
       
  1887   LookupSwitch(Value tag, BlockList* sux, intArray* keys, ValueStack* state_before, bool is_safepoint)
       
  1888   : Switch(tag, sux, state_before, is_safepoint)
       
  1889   , _keys(keys) {
       
  1890     assert(keys != NULL, "keys must exist");
       
  1891     assert(keys->length() == length(), "sux & keys have incompatible lengths");
       
  1892   }
       
  1893 
       
  1894   // accessors
       
  1895   int key_at(int i) const                        { return _keys->at(i); }
       
  1896 };
       
  1897 
       
  1898 
       
  1899 LEAF(Return, BlockEnd)
       
  1900  private:
       
  1901   Value _result;
       
  1902 
       
  1903  public:
       
  1904   // creation
       
  1905   Return(Value result) :
       
  1906     BlockEnd(result == NULL ? voidType : result->type()->base(), NULL, true),
       
  1907     _result(result) {}
       
  1908 
       
  1909   // accessors
       
  1910   Value result() const                           { return _result; }
       
  1911   bool has_result() const                        { return result() != NULL; }
       
  1912 
       
  1913   // generic
       
  1914   virtual void input_values_do(void f(Value*)) {
       
  1915     BlockEnd::input_values_do(f);
       
  1916     if (has_result()) f(&_result);
       
  1917   }
       
  1918 };
       
  1919 
       
  1920 
       
  1921 LEAF(Throw, BlockEnd)
       
  1922  private:
       
  1923   Value _exception;
       
  1924 
       
  1925  public:
       
  1926   // creation
       
  1927   Throw(Value exception, ValueStack* state_before) : BlockEnd(illegalType, state_before, true), _exception(exception) {
       
  1928     ASSERT_VALUES
       
  1929   }
       
  1930 
       
  1931   // accessors
       
  1932   Value exception() const                        { return _exception; }
       
  1933 
       
  1934   // generic
       
  1935   virtual bool can_trap() const                  { return true; }
       
  1936   virtual void input_values_do(void f(Value*))   { BlockEnd::input_values_do(f); f(&_exception); }
       
  1937   virtual void state_values_do(void f(Value*));
       
  1938 };
       
  1939 
       
  1940 
       
  1941 LEAF(Base, BlockEnd)
       
  1942  public:
       
  1943   // creation
       
  1944   Base(BlockBegin* std_entry, BlockBegin* osr_entry) : BlockEnd(illegalType, NULL, false) {
       
  1945     assert(std_entry->is_set(BlockBegin::std_entry_flag), "std entry must be flagged");
       
  1946     assert(osr_entry == NULL || osr_entry->is_set(BlockBegin::osr_entry_flag), "osr entry must be flagged");
       
  1947     BlockList* s = new BlockList(2);
       
  1948     if (osr_entry != NULL) s->append(osr_entry);
       
  1949     s->append(std_entry); // must be default sux!
       
  1950     set_sux(s);
       
  1951   }
       
  1952 
       
  1953   // accessors
       
  1954   BlockBegin* std_entry() const                  { return default_sux(); }
       
  1955   BlockBegin* osr_entry() const                  { return number_of_sux() < 2 ? NULL : sux_at(0); }
       
  1956 };
       
  1957 
       
  1958 
       
  1959 LEAF(OsrEntry, Instruction)
       
  1960  public:
       
  1961   // creation
       
  1962 #ifdef _LP64
       
  1963   OsrEntry() : Instruction(longType, false) { pin(); }
       
  1964 #else
       
  1965   OsrEntry() : Instruction(intType,  false) { pin(); }
       
  1966 #endif
       
  1967 
       
  1968   // generic
       
  1969   virtual void input_values_do(void f(Value*))   { }
       
  1970 };
       
  1971 
       
  1972 
       
  1973 // Models the incoming exception at a catch site
       
  1974 LEAF(ExceptionObject, Instruction)
       
  1975  public:
       
  1976   // creation
       
  1977   ExceptionObject() : Instruction(objectType, false) {
       
  1978     pin();
       
  1979   }
       
  1980 
       
  1981   // generic
       
  1982   virtual void input_values_do(void f(Value*))   { }
       
  1983 };
       
  1984 
       
  1985 
       
  1986 // Models needed rounding for floating-point values on Intel.
       
  1987 // Currently only used to represent rounding of double-precision
       
  1988 // values stored into local variables, but could be used to model
       
  1989 // intermediate rounding of single-precision values as well.
       
  1990 LEAF(RoundFP, Instruction)
       
  1991  private:
       
  1992   Value _input;             // floating-point value to be rounded
       
  1993 
       
  1994  public:
       
  1995   RoundFP(Value input)
       
  1996   : Instruction(input->type()) // Note: should not be used for constants
       
  1997   , _input(input)
       
  1998   {
       
  1999     ASSERT_VALUES
       
  2000   }
       
  2001 
       
  2002   // accessors
       
  2003   Value input() const                            { return _input; }
       
  2004 
       
  2005   // generic
       
  2006   virtual void input_values_do(void f(Value*))   { f(&_input); }
       
  2007 };
       
  2008 
       
  2009 
       
  2010 BASE(UnsafeOp, Instruction)
       
  2011  private:
       
  2012   BasicType _basic_type;    // ValueType can not express byte-sized integers
       
  2013 
       
  2014  protected:
       
  2015   // creation
       
  2016   UnsafeOp(BasicType basic_type, bool is_put)
       
  2017   : Instruction(is_put ? voidType : as_ValueType(basic_type))
       
  2018   , _basic_type(basic_type)
       
  2019   {
       
  2020     //Note:  Unsafe ops are not not guaranteed to throw NPE.
       
  2021     // Convservatively, Unsafe operations must be pinned though we could be
       
  2022     // looser about this if we wanted to..
       
  2023     pin();
       
  2024   }
       
  2025 
       
  2026  public:
       
  2027   // accessors
       
  2028   BasicType basic_type()                         { return _basic_type; }
       
  2029 
       
  2030   // generic
       
  2031   virtual void input_values_do(void f(Value*))   { }
       
  2032   virtual void other_values_do(void f(Value*))   { }
       
  2033 };
       
  2034 
       
  2035 
       
  2036 BASE(UnsafeRawOp, UnsafeOp)
       
  2037  private:
       
  2038   Value _base;                                   // Base address (a Java long)
       
  2039   Value _index;                                  // Index if computed by optimizer; initialized to NULL
       
  2040   int   _log2_scale;                             // Scale factor: 0, 1, 2, or 3.
       
  2041                                                  // Indicates log2 of number of bytes (1, 2, 4, or 8)
       
  2042                                                  // to scale index by.
       
  2043 
       
  2044  protected:
       
  2045   UnsafeRawOp(BasicType basic_type, Value addr, bool is_put)
       
  2046   : UnsafeOp(basic_type, is_put)
       
  2047   , _base(addr)
       
  2048   , _index(NULL)
       
  2049   , _log2_scale(0)
       
  2050   {
       
  2051     // Can not use ASSERT_VALUES because index may be NULL
       
  2052     assert(addr != NULL && addr->type()->is_long(), "just checking");
       
  2053   }
       
  2054 
       
  2055   UnsafeRawOp(BasicType basic_type, Value base, Value index, int log2_scale, bool is_put)
       
  2056   : UnsafeOp(basic_type, is_put)
       
  2057   , _base(base)
       
  2058   , _index(index)
       
  2059   , _log2_scale(log2_scale)
       
  2060   {
       
  2061   }
       
  2062 
       
  2063  public:
       
  2064   // accessors
       
  2065   Value base()                                   { return _base; }
       
  2066   Value index()                                  { return _index; }
       
  2067   bool  has_index()                              { return (_index != NULL); }
       
  2068   int   log2_scale()                             { return _log2_scale; }
       
  2069 
       
  2070   // setters
       
  2071   void set_base (Value base)                     { _base  = base; }
       
  2072   void set_index(Value index)                    { _index = index; }
       
  2073   void set_log2_scale(int log2_scale)            { _log2_scale = log2_scale; }
       
  2074 
       
  2075   // generic
       
  2076   virtual void input_values_do(void f(Value*))   { UnsafeOp::input_values_do(f);
       
  2077                                                    f(&_base);
       
  2078                                                    if (has_index()) f(&_index); }
       
  2079 };
       
  2080 
       
  2081 
       
  2082 LEAF(UnsafeGetRaw, UnsafeRawOp)
       
  2083  private:
       
  2084   bool _may_be_unaligned;  // For OSREntry
       
  2085 
       
  2086  public:
       
  2087   UnsafeGetRaw(BasicType basic_type, Value addr, bool may_be_unaligned)
       
  2088   : UnsafeRawOp(basic_type, addr, false) {
       
  2089     _may_be_unaligned = may_be_unaligned;
       
  2090   }
       
  2091 
       
  2092   UnsafeGetRaw(BasicType basic_type, Value base, Value index, int log2_scale, bool may_be_unaligned)
       
  2093   : UnsafeRawOp(basic_type, base, index, log2_scale, false) {
       
  2094     _may_be_unaligned = may_be_unaligned;
       
  2095   }
       
  2096 
       
  2097   bool may_be_unaligned()                               { return _may_be_unaligned; }
       
  2098 };
       
  2099 
       
  2100 
       
  2101 LEAF(UnsafePutRaw, UnsafeRawOp)
       
  2102  private:
       
  2103   Value _value;                                  // Value to be stored
       
  2104 
       
  2105  public:
       
  2106   UnsafePutRaw(BasicType basic_type, Value addr, Value value)
       
  2107   : UnsafeRawOp(basic_type, addr, true)
       
  2108   , _value(value)
       
  2109   {
       
  2110     assert(value != NULL, "just checking");
       
  2111     ASSERT_VALUES
       
  2112   }
       
  2113 
       
  2114   UnsafePutRaw(BasicType basic_type, Value base, Value index, int log2_scale, Value value)
       
  2115   : UnsafeRawOp(basic_type, base, index, log2_scale, true)
       
  2116   , _value(value)
       
  2117   {
       
  2118     assert(value != NULL, "just checking");
       
  2119     ASSERT_VALUES
       
  2120   }
       
  2121 
       
  2122   // accessors
       
  2123   Value value()                                  { return _value; }
       
  2124 
       
  2125   // generic
       
  2126   virtual void input_values_do(void f(Value*))   { UnsafeRawOp::input_values_do(f);
       
  2127                                                    f(&_value); }
       
  2128 };
       
  2129 
       
  2130 
       
  2131 BASE(UnsafeObjectOp, UnsafeOp)
       
  2132  private:
       
  2133   Value _object;                                 // Object to be fetched from or mutated
       
  2134   Value _offset;                                 // Offset within object
       
  2135   bool  _is_volatile;                            // true if volatile - dl/JSR166
       
  2136  public:
       
  2137   UnsafeObjectOp(BasicType basic_type, Value object, Value offset, bool is_put, bool is_volatile)
       
  2138     : UnsafeOp(basic_type, is_put), _object(object), _offset(offset), _is_volatile(is_volatile)
       
  2139   {
       
  2140   }
       
  2141 
       
  2142   // accessors
       
  2143   Value object()                                 { return _object; }
       
  2144   Value offset()                                 { return _offset; }
       
  2145   bool  is_volatile()                            { return _is_volatile; }
       
  2146   // generic
       
  2147   virtual void input_values_do(void f(Value*))   { UnsafeOp::input_values_do(f);
       
  2148                                                    f(&_object);
       
  2149                                                    f(&_offset); }
       
  2150 };
       
  2151 
       
  2152 
       
  2153 LEAF(UnsafeGetObject, UnsafeObjectOp)
       
  2154  public:
       
  2155   UnsafeGetObject(BasicType basic_type, Value object, Value offset, bool is_volatile)
       
  2156   : UnsafeObjectOp(basic_type, object, offset, false, is_volatile)
       
  2157   {
       
  2158     ASSERT_VALUES
       
  2159   }
       
  2160 };
       
  2161 
       
  2162 
       
  2163 LEAF(UnsafePutObject, UnsafeObjectOp)
       
  2164  private:
       
  2165   Value _value;                                  // Value to be stored
       
  2166  public:
       
  2167   UnsafePutObject(BasicType basic_type, Value object, Value offset, Value value, bool is_volatile)
       
  2168   : UnsafeObjectOp(basic_type, object, offset, true, is_volatile)
       
  2169     , _value(value)
       
  2170   {
       
  2171     ASSERT_VALUES
       
  2172   }
       
  2173 
       
  2174   // accessors
       
  2175   Value value()                                  { return _value; }
       
  2176 
       
  2177   // generic
       
  2178   virtual void input_values_do(void f(Value*))   { UnsafeObjectOp::input_values_do(f);
       
  2179                                                    f(&_value); }
       
  2180 };
       
  2181 
       
  2182 
       
  2183 BASE(UnsafePrefetch, UnsafeObjectOp)
       
  2184  public:
       
  2185   UnsafePrefetch(Value object, Value offset)
       
  2186   : UnsafeObjectOp(T_VOID, object, offset, false, false)
       
  2187   {
       
  2188   }
       
  2189 };
       
  2190 
       
  2191 
       
  2192 LEAF(UnsafePrefetchRead, UnsafePrefetch)
       
  2193  public:
       
  2194   UnsafePrefetchRead(Value object, Value offset)
       
  2195   : UnsafePrefetch(object, offset)
       
  2196   {
       
  2197     ASSERT_VALUES
       
  2198   }
       
  2199 };
       
  2200 
       
  2201 
       
  2202 LEAF(UnsafePrefetchWrite, UnsafePrefetch)
       
  2203  public:
       
  2204   UnsafePrefetchWrite(Value object, Value offset)
       
  2205   : UnsafePrefetch(object, offset)
       
  2206   {
       
  2207     ASSERT_VALUES
       
  2208   }
       
  2209 };
       
  2210 
       
  2211 
       
  2212 LEAF(ProfileCall, Instruction)
       
  2213  private:
       
  2214   ciMethod* _method;
       
  2215   int       _bci_of_invoke;
       
  2216   Value     _recv;
       
  2217   ciKlass*  _known_holder;
       
  2218 
       
  2219  public:
       
  2220   ProfileCall(ciMethod* method, int bci, Value recv, ciKlass* known_holder)
       
  2221     : Instruction(voidType)
       
  2222     , _method(method)
       
  2223     , _bci_of_invoke(bci)
       
  2224     , _recv(recv)
       
  2225     , _known_holder(known_holder)
       
  2226   {
       
  2227     // The ProfileCall has side-effects and must occur precisely where located
       
  2228     pin();
       
  2229   }
       
  2230 
       
  2231   ciMethod* method()      { return _method; }
       
  2232   int bci_of_invoke()     { return _bci_of_invoke; }
       
  2233   Value recv()            { return _recv; }
       
  2234   ciKlass* known_holder() { return _known_holder; }
       
  2235 
       
  2236   virtual void input_values_do(void f(Value*))   { if (_recv != NULL) f(&_recv); }
       
  2237 };
       
  2238 
       
  2239 
       
  2240 //
       
  2241 // Simple node representing a counter update generally used for updating MDOs
       
  2242 //
       
  2243 LEAF(ProfileCounter, Instruction)
       
  2244  private:
       
  2245   Value     _mdo;
       
  2246   int       _offset;
       
  2247   int       _increment;
       
  2248 
       
  2249  public:
       
  2250   ProfileCounter(Value mdo, int offset, int increment = 1)
       
  2251     : Instruction(voidType)
       
  2252     , _mdo(mdo)
       
  2253     , _offset(offset)
       
  2254     , _increment(increment)
       
  2255   {
       
  2256     // The ProfileCounter has side-effects and must occur precisely where located
       
  2257     pin();
       
  2258   }
       
  2259 
       
  2260   Value mdo()      { return _mdo; }
       
  2261   int offset()     { return _offset; }
       
  2262   int increment()  { return _increment; }
       
  2263 
       
  2264   virtual void input_values_do(void f(Value*))   { f(&_mdo); }
       
  2265 };
       
  2266 
       
  2267 
       
  2268 class BlockPair: public CompilationResourceObj {
       
  2269  private:
       
  2270   BlockBegin* _from;
       
  2271   BlockBegin* _to;
       
  2272  public:
       
  2273   BlockPair(BlockBegin* from, BlockBegin* to): _from(from), _to(to) {}
       
  2274   BlockBegin* from() const { return _from; }
       
  2275   BlockBegin* to() const   { return _to;   }
       
  2276   bool is_same(BlockBegin* from, BlockBegin* to) const { return  _from == from && _to == to; }
       
  2277   bool is_same(BlockPair* p) const { return  _from == p->from() && _to == p->to(); }
       
  2278   void set_to(BlockBegin* b)   { _to = b; }
       
  2279   void set_from(BlockBegin* b) { _from = b; }
       
  2280 };
       
  2281 
       
  2282 
       
  2283 define_array(BlockPairArray, BlockPair*)
       
  2284 define_stack(BlockPairList, BlockPairArray)
       
  2285 
       
  2286 
       
  2287 inline int         BlockBegin::number_of_sux() const            { assert(_end == NULL || _end->number_of_sux() == _successors.length(), "mismatch"); return _successors.length(); }
       
  2288 inline BlockBegin* BlockBegin::sux_at(int i) const              { assert(_end == NULL || _end->sux_at(i) == _successors.at(i), "mismatch");          return _successors.at(i); }
       
  2289 inline void        BlockBegin::add_successor(BlockBegin* sux)   { assert(_end == NULL, "Would create mismatch with successors of BlockEnd");         _successors.append(sux); }
       
  2290 
       
  2291 #undef ASSERT_VALUES