c1_Instruction.hpp revision 0:a61af66fc99e
1233294Sstas/*
2178825Sdfr * Copyright 1999-2006 Sun Microsystems, Inc.  All Rights Reserved.
3233294Sstas * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4178825Sdfr *
5233294Sstas * This code is free software; you can redistribute it and/or modify it
6233294Sstas * under the terms of the GNU General Public License version 2 only, as
7233294Sstas * published by the Free Software Foundation.
8233294Sstas *
9233294Sstas * This code is distributed in the hope that it will be useful, but WITHOUT
10233294Sstas * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11233294Sstas * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12233294Sstas * version 2 for more details (a copy is included in the LICENSE file that
13233294Sstas * accompanied this code).
14233294Sstas *
15233294Sstas * You should have received a copy of the GNU General Public License version
16233294Sstas * 2 along with this work; if not, write to the Free Software Foundation,
17233294Sstas * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18233294Sstas *
19178825Sdfr * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20233294Sstas * CA 95054 USA or visit www.sun.com if you need additional information or
21233294Sstas * have any questions.
22233294Sstas *
23233294Sstas */
24233294Sstas
25233294Sstas// Predefined classes
26233294Sstasclass ciField;
27233294Sstasclass ValueStack;
28233294Sstasclass InstructionPrinter;
29233294Sstasclass IRScope;
30233294Sstasclass LIR_OprDesc;
31233294Sstastypedef LIR_OprDesc* LIR_Opr;
32233294Sstas
33233294Sstas
34178825Sdfr// Instruction class hierarchy
35233294Sstas//
36233294Sstas// All leaf classes in the class hierarchy are concrete classes
37233294Sstas// (i.e., are instantiated). All other classes are abstract and
38233294Sstas// serve factoring.
39233294Sstas
40233294Sstasclass Instruction;
41233294Sstasclass   HiWord;
42233294Sstasclass   Phi;
43233294Sstasclass   Local;
44233294Sstasclass   Constant;
45178825Sdfrclass   AccessField;
46233294Sstasclass     LoadField;
47233294Sstasclass     StoreField;
48233294Sstasclass   AccessArray;
49233294Sstasclass     ArrayLength;
50178825Sdfrclass     AccessIndexed;
51233294Sstasclass       LoadIndexed;
52233294Sstasclass       StoreIndexed;
53178825Sdfrclass   NegateOp;
54178825Sdfrclass   Op2;
55233294Sstasclass     ArithmeticOp;
56233294Sstasclass     ShiftOp;
57233294Sstasclass     LogicOp;
58178825Sdfrclass     CompareOp;
59178825Sdfrclass     IfOp;
60233294Sstasclass   Convert;
61233294Sstasclass   NullCheck;
62233294Sstasclass   OsrEntry;
63233294Sstasclass   ExceptionObject;
64233294Sstasclass   StateSplit;
65233294Sstasclass     Invoke;
66233294Sstasclass     NewInstance;
67233294Sstasclass     NewArray;
68233294Sstasclass       NewTypeArray;
69178825Sdfrclass       NewObjectArray;
70233294Sstasclass       NewMultiArray;
71233294Sstasclass     TypeCheck;
72233294Sstasclass       CheckCast;
73233294Sstasclass       InstanceOf;
74233294Sstasclass     AccessMonitor;
75178825Sdfrclass       MonitorEnter;
76233294Sstasclass       MonitorExit;
77233294Sstasclass     Intrinsic;
78233294Sstasclass     BlockBegin;
79233294Sstasclass     BlockEnd;
80233294Sstasclass       Goto;
81233294Sstasclass       If;
82233294Sstasclass       IfInstanceOf;
83233294Sstasclass       Switch;
84233294Sstasclass         TableSwitch;
85178825Sdfrclass         LookupSwitch;
86233294Sstasclass       Return;
87233294Sstasclass       Throw;
88233294Sstasclass       Base;
89233294Sstasclass   RoundFP;
90233294Sstasclass   UnsafeOp;
91233294Sstasclass     UnsafeRawOp;
92178825Sdfrclass       UnsafeGetRaw;
93233294Sstasclass       UnsafePutRaw;
94233294Sstasclass     UnsafeObjectOp;
95233294Sstasclass       UnsafeGetObject;
96233294Sstasclass       UnsafePutObject;
97233294Sstasclass       UnsafePrefetch;
98233294Sstasclass         UnsafePrefetchRead;
99178825Sdfrclass         UnsafePrefetchWrite;
100178825Sdfrclass   ProfileCall;
101178825Sdfrclass   ProfileCounter;
102178825Sdfr
103233294Sstas// A Value is a reference to the instruction creating the value
104233294Sstastypedef Instruction* Value;
105233294Sstasdefine_array(ValueArray, Value)
106233294Sstasdefine_stack(Values, ValueArray)
107233294Sstas
108233294Sstasdefine_array(ValueStackArray, ValueStack*)
109233294Sstasdefine_stack(ValueStackStack, ValueStackArray)
110233294Sstas
111233294Sstas// BlockClosure is the base class for block traversal/iteration.
112233294Sstas
113233294Sstasclass BlockClosure: public CompilationResourceObj {
114233294Sstas public:
115233294Sstas  virtual void block_do(BlockBegin* block)       = 0;
116233294Sstas};
117233294Sstas
118233294Sstas
119233294Sstas// Some array and list classes
120233294Sstasdefine_array(BlockBeginArray, BlockBegin*)
121178825Sdfrdefine_stack(_BlockList, BlockBeginArray)
122178825Sdfr
123178825Sdfrclass BlockList: public _BlockList {
124178825Sdfr public:
125233294Sstas  BlockList(): _BlockList() {}
126178825Sdfr  BlockList(const int size): _BlockList(size) {}
127233294Sstas  BlockList(const int size, BlockBegin* init): _BlockList(size, init) {}
128233294Sstas
129233294Sstas  void iterate_forward(BlockClosure* closure);
130233294Sstas  void iterate_backward(BlockClosure* closure);
131233294Sstas  void blocks_do(void f(BlockBegin*));
132233294Sstas  void values_do(void f(Value*));
133233294Sstas  void print(bool cfg_only = false, bool live_only = false) PRODUCT_RETURN;
134233294Sstas};
135233294Sstas
136233294Sstas
137233294Sstas// InstructionVisitors provide type-based dispatch for instructions.
138233294Sstas// For each concrete Instruction class X, a virtual function do_X is
139233294Sstas// provided. Functionality that needs to be implemented for all classes
140233294Sstas// (e.g., printing, code generation) is factored out into a specialised
141233294Sstas// visitor instead of added to the Instruction classes itself.
142233294Sstas
143233294Sstasclass InstructionVisitor: public StackObj {
144233294Sstas public:
145233294Sstas          void do_HiWord         (HiWord*          x) { ShouldNotReachHere(); }
146233294Sstas  virtual void do_Phi            (Phi*             x) = 0;
147233294Sstas  virtual void do_Local          (Local*           x) = 0;
148233294Sstas  virtual void do_Constant       (Constant*        x) = 0;
149233294Sstas  virtual void do_LoadField      (LoadField*       x) = 0;
150233294Sstas  virtual void do_StoreField     (StoreField*      x) = 0;
151233294Sstas  virtual void do_ArrayLength    (ArrayLength*     x) = 0;
152233294Sstas  virtual void do_LoadIndexed    (LoadIndexed*     x) = 0;
153233294Sstas  virtual void do_StoreIndexed   (StoreIndexed*    x) = 0;
154233294Sstas  virtual void do_NegateOp       (NegateOp*        x) = 0;
155233294Sstas  virtual void do_ArithmeticOp   (ArithmeticOp*    x) = 0;
156233294Sstas  virtual void do_ShiftOp        (ShiftOp*         x) = 0;
157233294Sstas  virtual void do_LogicOp        (LogicOp*         x) = 0;
158233294Sstas  virtual void do_CompareOp      (CompareOp*       x) = 0;
159233294Sstas  virtual void do_IfOp           (IfOp*            x) = 0;
160233294Sstas  virtual void do_Convert        (Convert*         x) = 0;
161233294Sstas  virtual void do_NullCheck      (NullCheck*       x) = 0;
162233294Sstas  virtual void do_Invoke         (Invoke*          x) = 0;
163233294Sstas  virtual void do_NewInstance    (NewInstance*     x) = 0;
164233294Sstas  virtual void do_NewTypeArray   (NewTypeArray*    x) = 0;
165233294Sstas  virtual void do_NewObjectArray (NewObjectArray*  x) = 0;
166233294Sstas  virtual void do_NewMultiArray  (NewMultiArray*   x) = 0;
167233294Sstas  virtual void do_CheckCast      (CheckCast*       x) = 0;
168233294Sstas  virtual void do_InstanceOf     (InstanceOf*      x) = 0;
169233294Sstas  virtual void do_MonitorEnter   (MonitorEnter*    x) = 0;
170233294Sstas  virtual void do_MonitorExit    (MonitorExit*     x) = 0;
171233294Sstas  virtual void do_Intrinsic      (Intrinsic*       x) = 0;
172233294Sstas  virtual void do_BlockBegin     (BlockBegin*      x) = 0;
173233294Sstas  virtual void do_Goto           (Goto*            x) = 0;
174233294Sstas  virtual void do_If             (If*              x) = 0;
175233294Sstas  virtual void do_IfInstanceOf   (IfInstanceOf*    x) = 0;
176233294Sstas  virtual void do_TableSwitch    (TableSwitch*     x) = 0;
177233294Sstas  virtual void do_LookupSwitch   (LookupSwitch*    x) = 0;
178233294Sstas  virtual void do_Return         (Return*          x) = 0;
179233294Sstas  virtual void do_Throw          (Throw*           x) = 0;
180233294Sstas  virtual void do_Base           (Base*            x) = 0;
181233294Sstas  virtual void do_OsrEntry       (OsrEntry*        x) = 0;
182233294Sstas  virtual void do_ExceptionObject(ExceptionObject* x) = 0;
183233294Sstas  virtual void do_RoundFP        (RoundFP*         x) = 0;
184233294Sstas  virtual void do_UnsafeGetRaw   (UnsafeGetRaw*    x) = 0;
185233294Sstas  virtual void do_UnsafePutRaw   (UnsafePutRaw*    x) = 0;
186233294Sstas  virtual void do_UnsafeGetObject(UnsafeGetObject* x) = 0;
187233294Sstas  virtual void do_UnsafePutObject(UnsafePutObject* x) = 0;
188233294Sstas  virtual void do_UnsafePrefetchRead (UnsafePrefetchRead*  x) = 0;
189233294Sstas  virtual void do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) = 0;
190233294Sstas  virtual void do_ProfileCall    (ProfileCall*     x) = 0;
191233294Sstas  virtual void do_ProfileCounter (ProfileCounter*  x) = 0;
192233294Sstas};
193233294Sstas
194178825Sdfr
195178825Sdfr// Hashing support
196178825Sdfr//
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
265class 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
537LEAF(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
566LEAF(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.
624LEAF(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
642LEAF(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
677BASE(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
742LEAF(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
758LEAF(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
783BASE(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
812LEAF(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
834BASE(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
864LEAF(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
889LEAF(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
916LEAF(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
934BASE(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
963LEAF(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
990LEAF(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
1000LEAF(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
1011LEAF(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
1030LEAF(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
1058LEAF(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
1079LEAF(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
1109BASE(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
1135LEAF(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
1175LEAF(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
1192BASE(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
1214LEAF(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
1228LEAF(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
1242LEAF(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
1272BASE(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
1302LEAF(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
1335LEAF(InstanceOf, TypeCheck)
1336 public:
1337  // creation
1338  InstanceOf(ciKlass* klass, Value obj, ValueStack* state_before) : TypeCheck(klass, obj, intType, state_before) {}
1339};
1340
1341
1342BASE(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
1367LEAF(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
1389LEAF(MonitorExit, AccessMonitor)
1390 public:
1391  // creation
1392  MonitorExit(Value obj, int monitor_no) : AccessMonitor(obj, monitor_no) {}
1393};
1394
1395
1396LEAF(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
1460class LIR_List;
1461
1462LEAF(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
1660BASE(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
1708LEAF(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
1726LEAF(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
1789LEAF(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
1843BASE(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
1865LEAF(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
1881LEAF(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
1899LEAF(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
1921LEAF(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
1941LEAF(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
1959LEAF(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
1974LEAF(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.
1990LEAF(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
2010BASE(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
2036BASE(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
2082LEAF(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
2101LEAF(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
2131BASE(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
2153LEAF(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
2163LEAF(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
2183BASE(UnsafePrefetch, UnsafeObjectOp)
2184 public:
2185  UnsafePrefetch(Value object, Value offset)
2186  : UnsafeObjectOp(T_VOID, object, offset, false, false)
2187  {
2188  }
2189};
2190
2191
2192LEAF(UnsafePrefetchRead, UnsafePrefetch)
2193 public:
2194  UnsafePrefetchRead(Value object, Value offset)
2195  : UnsafePrefetch(object, offset)
2196  {
2197    ASSERT_VALUES
2198  }
2199};
2200
2201
2202LEAF(UnsafePrefetchWrite, UnsafePrefetch)
2203 public:
2204  UnsafePrefetchWrite(Value object, Value offset)
2205  : UnsafePrefetch(object, offset)
2206  {
2207    ASSERT_VALUES
2208  }
2209};
2210
2211
2212LEAF(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//
2243LEAF(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
2268class 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
2283define_array(BlockPairArray, BlockPair*)
2284define_stack(BlockPairList, BlockPairArray)
2285
2286
2287inline int         BlockBegin::number_of_sux() const            { assert(_end == NULL || _end->number_of_sux() == _successors.length(), "mismatch"); return _successors.length(); }
2288inline BlockBegin* BlockBegin::sux_at(int i) const              { assert(_end == NULL || _end->sux_at(i) == _successors.at(i), "mismatch");          return _successors.at(i); }
2289inline void        BlockBegin::add_successor(BlockBegin* sux)   { assert(_end == NULL, "Would create mismatch with successors of BlockEnd");         _successors.append(sux); }
2290
2291#undef ASSERT_VALUES
2292