1 /* 2 * Copyright 1999-2010 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 ValueStack* _state_before; // Required for deoptimization. 1144 1145 public: 1146 // creation 1147 Invoke(Bytecodes::Code code, ValueType* result_type, Value recv, Values* args, 1148 int vtable_index, ciMethod* target, ValueStack* state_before); 1149 1150 // accessors 1151 Bytecodes::Code code() const { return _code; } 1152 Value receiver() const { return _recv; } 1153 bool has_receiver() const { return receiver() != NULL; } 1154 int number_of_arguments() const { return _args->length(); } 1155 Value argument_at(int i) const { return _args->at(i); } 1156 int vtable_index() const { return _vtable_index; } 1157 BasicTypeList* signature() const { return _signature; } 1158 ciMethod* target() const { return _target; } 1159 ValueStack* state_before() const { return _state_before; } 1160 1161 // Returns false if target is not loaded 1162 bool target_is_final() const { return check_flag(TargetIsFinalFlag); } 1163 bool target_is_loaded() const { return check_flag(TargetIsLoadedFlag); } 1164 // Returns false if target is not loaded 1165 bool target_is_strictfp() const { return check_flag(TargetIsStrictfpFlag); } 1166 1167 // JSR 292 support 1168 bool is_invokedynamic() const { return code() == Bytecodes::_invokedynamic; } 1169 1170 // generic 1171 virtual bool can_trap() const { return true; } 1172 virtual void input_values_do(void f(Value*)) { 1173 StateSplit::input_values_do(f); 1174 if (has_receiver()) f(&_recv); 1175 for (int i = 0; i < _args->length(); i++) f(_args->adr_at(i)); 1176 } 1177 virtual void state_values_do(void f(Value*)); 1178 }; 1179 1180 1181 LEAF(NewInstance, StateSplit) 1182 private: 1183 ciInstanceKlass* _klass; 1184 1185 public: 1186 // creation 1187 NewInstance(ciInstanceKlass* klass) : StateSplit(instanceType), _klass(klass) {} 1188 1189 // accessors 1190 ciInstanceKlass* klass() const { return _klass; } 1191 1192 // generic 1193 virtual bool can_trap() const { return true; } 1194 ciType* exact_type() const; 1195 }; 1196 1197 1198 BASE(NewArray, StateSplit) 1199 private: 1200 Value _length; 1201 ValueStack* _state_before; 1202 1203 public: 1204 // creation 1205 NewArray(Value length, ValueStack* state_before) : StateSplit(objectType), _length(length), _state_before(state_before) { 1206 // Do not ASSERT_VALUES since length is NULL for NewMultiArray 1207 } 1208 1209 // accessors 1210 ValueStack* state_before() const { return _state_before; } 1211 Value length() const { return _length; } 1212 1213 // generic 1214 virtual bool can_trap() const { return true; } 1215 virtual void input_values_do(void f(Value*)) { StateSplit::input_values_do(f); f(&_length); } 1216 virtual void other_values_do(void f(Value*)); 1217 }; 1218 1219 1220 LEAF(NewTypeArray, NewArray) 1221 private: 1222 BasicType _elt_type; 1223 1224 public: 1225 // creation 1226 NewTypeArray(Value length, BasicType elt_type) : NewArray(length, NULL), _elt_type(elt_type) {} 1227 1228 // accessors 1229 BasicType elt_type() const { return _elt_type; } 1230 ciType* exact_type() const; 1231 }; 1232 1233 1234 LEAF(NewObjectArray, NewArray) 1235 private: 1236 ciKlass* _klass; 1237 1238 public: 1239 // creation 1240 NewObjectArray(ciKlass* klass, Value length, ValueStack* state_before) : NewArray(length, state_before), _klass(klass) {} 1241 1242 // accessors 1243 ciKlass* klass() const { return _klass; } 1244 ciType* exact_type() const; 1245 }; 1246 1247 1248 LEAF(NewMultiArray, NewArray) 1249 private: 1250 ciKlass* _klass; 1251 Values* _dims; 1252 1253 public: 1254 // creation 1255 NewMultiArray(ciKlass* klass, Values* dims, ValueStack* state_before) : NewArray(NULL, state_before), _klass(klass), _dims(dims) { 1256 ASSERT_VALUES 1257 } 1258 1259 // accessors 1260 ciKlass* klass() const { return _klass; } 1261 Values* dims() const { return _dims; } 1262 int rank() const { return dims()->length(); } 1263 1264 // generic 1265 virtual void input_values_do(void f(Value*)) { 1266 // NOTE: we do not call NewArray::input_values_do since "length" 1267 // is meaningless for a multi-dimensional array; passing the 1268 // zeroth element down to NewArray as its length is a bad idea 1269 // since there will be a copy in the "dims" array which doesn't 1270 // get updated, and the value must not be traversed twice. Was bug 1271 // - kbr 4/10/2001 1272 StateSplit::input_values_do(f); 1273 for (int i = 0; i < _dims->length(); i++) f(_dims->adr_at(i)); 1274 } 1275 }; 1276 1277 1278 BASE(TypeCheck, StateSplit) 1279 private: 1280 ciKlass* _klass; 1281 Value _obj; 1282 ValueStack* _state_before; 1283 1284 public: 1285 // creation 1286 TypeCheck(ciKlass* klass, Value obj, ValueType* type, ValueStack* state_before) : StateSplit(type), _klass(klass), _obj(obj), _state_before(state_before) { 1287 ASSERT_VALUES 1288 set_direct_compare(false); 1289 } 1290 1291 // accessors 1292 ValueStack* state_before() const { return _state_before; } 1293 ciKlass* klass() const { return _klass; } 1294 Value obj() const { return _obj; } 1295 bool is_loaded() const { return klass() != NULL; } 1296 bool direct_compare() const { return check_flag(DirectCompareFlag); } 1297 1298 // manipulation 1299 void set_direct_compare(bool flag) { set_flag(DirectCompareFlag, flag); } 1300 1301 // generic 1302 virtual bool can_trap() const { return true; } 1303 virtual void input_values_do(void f(Value*)) { StateSplit::input_values_do(f); f(&_obj); } 1304 virtual void other_values_do(void f(Value*)); 1305 }; 1306 1307 1308 LEAF(CheckCast, TypeCheck) 1309 private: 1310 ciMethod* _profiled_method; 1311 int _profiled_bci; 1312 1313 public: 1314 // creation 1315 CheckCast(ciKlass* klass, Value obj, ValueStack* state_before) 1316 : TypeCheck(klass, obj, objectType, state_before) 1317 , _profiled_method(NULL) 1318 , _profiled_bci(0) {} 1319 1320 void set_incompatible_class_change_check() { 1321 set_flag(ThrowIncompatibleClassChangeErrorFlag, true); 1322 } 1323 bool is_incompatible_class_change_check() const { 1324 return check_flag(ThrowIncompatibleClassChangeErrorFlag); 1325 } 1326 1327 // Helpers for methodDataOop profiling 1328 void set_should_profile(bool value) { set_flag(ProfileMDOFlag, value); } 1329 void set_profiled_method(ciMethod* method) { _profiled_method = method; } 1330 void set_profiled_bci(int bci) { _profiled_bci = bci; } 1331 bool should_profile() const { return check_flag(ProfileMDOFlag); } 1332 ciMethod* profiled_method() const { return _profiled_method; } 1333 int profiled_bci() const { return _profiled_bci; } 1334 1335 ciType* declared_type() const; 1336 ciType* exact_type() const; 1337 1338 }; 1339 1340 1341 LEAF(InstanceOf, TypeCheck) 1342 public: 1343 // creation 1344 InstanceOf(ciKlass* klass, Value obj, ValueStack* state_before) : TypeCheck(klass, obj, intType, state_before) {} 1345 }; 1346 1347 1348 BASE(AccessMonitor, StateSplit) 1349 private: 1350 Value _obj; 1351 int _monitor_no; 1352 1353 public: 1354 // creation 1355 AccessMonitor(Value obj, int monitor_no) 1356 : StateSplit(illegalType) 1357 , _obj(obj) 1358 , _monitor_no(monitor_no) 1359 { 1360 set_needs_null_check(true); 1361 ASSERT_VALUES 1362 } 1363 1364 // accessors 1365 Value obj() const { return _obj; } 1366 int monitor_no() const { return _monitor_no; } 1367 1368 // generic 1369 virtual void input_values_do(void f(Value*)) { StateSplit::input_values_do(f); f(&_obj); } 1370 }; 1371 1372 1373 LEAF(MonitorEnter, AccessMonitor) 1374 private: 1375 ValueStack* _lock_stack_before; 1376 1377 public: 1378 // creation 1379 MonitorEnter(Value obj, int monitor_no, ValueStack* lock_stack_before) 1380 : AccessMonitor(obj, monitor_no) 1381 , _lock_stack_before(lock_stack_before) 1382 { 1383 ASSERT_VALUES 1384 } 1385 1386 // accessors 1387 ValueStack* lock_stack_before() const { return _lock_stack_before; } 1388 virtual void state_values_do(void f(Value*)); 1389 1390 // generic 1391 virtual bool can_trap() const { return true; } 1392 }; 1393 1394 1395 LEAF(MonitorExit, AccessMonitor) 1396 public: 1397 // creation 1398 MonitorExit(Value obj, int monitor_no) : AccessMonitor(obj, monitor_no) {} 1399 }; 1400 1401 1402 LEAF(Intrinsic, StateSplit) 1403 private: 1404 vmIntrinsics::ID _id; 1405 Values* _args; 1406 ValueStack* _lock_stack; 1407 Value _recv; 1408 1409 public: 1410 // preserves_state can be set to true for Intrinsics 1411 // which are guaranteed to preserve register state across any slow 1412 // cases; setting it to true does not mean that the Intrinsic can 1413 // not trap, only that if we continue execution in the same basic 1414 // block after the Intrinsic, all of the registers are intact. This 1415 // allows load elimination and common expression elimination to be 1416 // performed across the Intrinsic. The default value is false. 1417 Intrinsic(ValueType* type, 1418 vmIntrinsics::ID id, 1419 Values* args, 1420 bool has_receiver, 1421 ValueStack* lock_stack, 1422 bool preserves_state, 1423 bool cantrap = true) 1424 : StateSplit(type) 1425 , _id(id) 1426 , _args(args) 1427 , _lock_stack(lock_stack) 1428 , _recv(NULL) 1429 { 1430 assert(args != NULL, "args must exist"); 1431 ASSERT_VALUES 1432 set_flag(PreservesStateFlag, preserves_state); 1433 set_flag(CanTrapFlag, cantrap); 1434 if (has_receiver) { 1435 _recv = argument_at(0); 1436 } 1437 set_needs_null_check(has_receiver); 1438 1439 // some intrinsics can't trap, so don't force them to be pinned 1440 if (!can_trap()) { 1441 unpin(PinStateSplitConstructor); 1442 } 1443 } 1444 1445 // accessors 1446 vmIntrinsics::ID id() const { return _id; } 1447 int number_of_arguments() const { return _args->length(); } 1448 Value argument_at(int i) const { return _args->at(i); } 1449 ValueStack* lock_stack() const { return _lock_stack; } 1450 1451 bool has_receiver() const { return (_recv != NULL); } 1452 Value receiver() const { assert(has_receiver(), "must have receiver"); return _recv; } 1453 bool preserves_state() const { return check_flag(PreservesStateFlag); } 1454 1455 // generic 1456 virtual bool can_trap() const { return check_flag(CanTrapFlag); } 1457 virtual void input_values_do(void f(Value*)) { 1458 StateSplit::input_values_do(f); 1459 for (int i = 0; i < _args->length(); i++) f(_args->adr_at(i)); 1460 } 1461 virtual void state_values_do(void f(Value*)); 1462 1463 }; 1464 1465 1466 class LIR_List; 1467 1468 LEAF(BlockBegin, StateSplit) 1469 private: 1470 static int _next_block_id; // the block counter 1471 1472 int _block_id; // the unique block id 1473 int _depth_first_number; // number of this block in a depth-first ordering 1474 int _linear_scan_number; // number of this block in linear-scan ordering 1475 int _loop_depth; // the loop nesting level of this block 1476 int _loop_index; // number of the innermost loop of this block 1477 int _flags; // the flags associated with this block 1478 1479 // fields used by BlockListBuilder 1480 int _total_preds; // number of predecessors found by BlockListBuilder 1481 BitMap _stores_to_locals; // bit is set when a local variable is stored in the block 1482 1483 // SSA specific fields: (factor out later) 1484 BlockList _successors; // the successors of this block 1485 BlockList _predecessors; // the predecessors of this block 1486 BlockBegin* _dominator; // the dominator of this block 1487 // SSA specific ends 1488 BlockEnd* _end; // the last instruction of this block 1489 BlockList _exception_handlers; // the exception handlers potentially invoked by this block 1490 ValueStackStack* _exception_states; // only for xhandler entries: states of all instructions that have an edge to this xhandler 1491 int _exception_handler_pco; // if this block is the start of an exception handler, 1492 // this records the PC offset in the assembly code of the 1493 // first instruction in this block 1494 Label _label; // the label associated with this block 1495 LIR_List* _lir; // the low level intermediate representation for this block 1496 1497 BitMap _live_in; // set of live LIR_Opr registers at entry to this block 1498 BitMap _live_out; // set of live LIR_Opr registers at exit from this block 1499 BitMap _live_gen; // set of registers used before any redefinition in this block 1500 BitMap _live_kill; // set of registers defined in this block 1501 1502 BitMap _fpu_register_usage; 1503 intArray* _fpu_stack_state; // For x86 FPU code generation with UseLinearScan 1504 int _first_lir_instruction_id; // ID of first LIR instruction in this block 1505 int _last_lir_instruction_id; // ID of last LIR instruction in this block 1506 1507 void iterate_preorder (boolArray& mark, BlockClosure* closure); 1508 void iterate_postorder(boolArray& mark, BlockClosure* closure); 1509 1510 friend class SuxAndWeightAdjuster; 1511 1512 public: 1513 // initialization/counting 1514 static void initialize() { _next_block_id = 0; } 1515 static int number_of_blocks() { return _next_block_id; } 1516 1517 // creation 1518 BlockBegin(int bci) 1519 : StateSplit(illegalType) 1520 , _block_id(_next_block_id++) 1521 , _depth_first_number(-1) 1522 , _linear_scan_number(-1) 1523 , _loop_depth(0) 1524 , _flags(0) 1525 , _dominator(NULL) 1526 , _end(NULL) 1527 , _predecessors(2) 1528 , _successors(2) 1529 , _exception_handlers(1) 1530 , _exception_states(NULL) 1531 , _exception_handler_pco(-1) 1532 , _lir(NULL) 1533 , _loop_index(-1) 1534 , _live_in() 1535 , _live_out() 1536 , _live_gen() 1537 , _live_kill() 1538 , _fpu_register_usage() 1539 , _fpu_stack_state(NULL) 1540 , _first_lir_instruction_id(-1) 1541 , _last_lir_instruction_id(-1) 1542 , _total_preds(0) 1543 , _stores_to_locals() 1544 { 1545 set_bci(bci); 1546 } 1547 1548 // accessors 1549 int block_id() const { return _block_id; } 1550 BlockList* successors() { return &_successors; } 1551 BlockBegin* dominator() const { return _dominator; } 1552 int loop_depth() const { return _loop_depth; } 1553 int depth_first_number() const { return _depth_first_number; } 1554 int linear_scan_number() const { return _linear_scan_number; } 1555 BlockEnd* end() const { return _end; } 1556 Label* label() { return &_label; } 1557 LIR_List* lir() const { return _lir; } 1558 int exception_handler_pco() const { return _exception_handler_pco; } 1559 BitMap& live_in() { return _live_in; } 1560 BitMap& live_out() { return _live_out; } 1561 BitMap& live_gen() { return _live_gen; } 1562 BitMap& live_kill() { return _live_kill; } 1563 BitMap& fpu_register_usage() { return _fpu_register_usage; } 1564 intArray* fpu_stack_state() const { return _fpu_stack_state; } 1565 int first_lir_instruction_id() const { return _first_lir_instruction_id; } 1566 int last_lir_instruction_id() const { return _last_lir_instruction_id; } 1567 int total_preds() const { return _total_preds; } 1568 BitMap& stores_to_locals() { return _stores_to_locals; } 1569 1570 // manipulation 1571 void set_bci(int bci) { Instruction::set_bci(bci); } 1572 void set_dominator(BlockBegin* dom) { _dominator = dom; } 1573 void set_loop_depth(int d) { _loop_depth = d; } 1574 void set_depth_first_number(int dfn) { _depth_first_number = dfn; } 1575 void set_linear_scan_number(int lsn) { _linear_scan_number = lsn; } 1576 void set_end(BlockEnd* end); 1577 void disconnect_from_graph(); 1578 static void disconnect_edge(BlockBegin* from, BlockBegin* to); 1579 BlockBegin* insert_block_between(BlockBegin* sux); 1580 void substitute_sux(BlockBegin* old_sux, BlockBegin* new_sux); 1581 void set_lir(LIR_List* lir) { _lir = lir; } 1582 void set_exception_handler_pco(int pco) { _exception_handler_pco = pco; } 1583 void set_live_in (BitMap map) { _live_in = map; } 1584 void set_live_out (BitMap map) { _live_out = map; } 1585 void set_live_gen (BitMap map) { _live_gen = map; } 1586 void set_live_kill (BitMap map) { _live_kill = map; } 1587 void set_fpu_register_usage(BitMap map) { _fpu_register_usage = map; } 1588 void set_fpu_stack_state(intArray* state) { _fpu_stack_state = state; } 1589 void set_first_lir_instruction_id(int id) { _first_lir_instruction_id = id; } 1590 void set_last_lir_instruction_id(int id) { _last_lir_instruction_id = id; } 1591 void increment_total_preds(int n = 1) { _total_preds += n; } 1592 void init_stores_to_locals(int locals_count) { _stores_to_locals = BitMap(locals_count); _stores_to_locals.clear(); } 1593 1594 // generic 1595 virtual void state_values_do(void f(Value*)); 1596 1597 // successors and predecessors 1598 int number_of_sux() const; 1599 BlockBegin* sux_at(int i) const; 1600 void add_successor(BlockBegin* sux); 1601 void remove_successor(BlockBegin* pred); 1602 bool is_successor(BlockBegin* sux) const { return _successors.contains(sux); } 1603 1604 void add_predecessor(BlockBegin* pred); 1605 void remove_predecessor(BlockBegin* pred); 1606 bool is_predecessor(BlockBegin* pred) const { return _predecessors.contains(pred); } 1607 int number_of_preds() const { return _predecessors.length(); } 1608 BlockBegin* pred_at(int i) const { return _predecessors[i]; } 1609 1610 // exception handlers potentially invoked by this block 1611 void add_exception_handler(BlockBegin* b); 1612 bool is_exception_handler(BlockBegin* b) const { return _exception_handlers.contains(b); } 1613 int number_of_exception_handlers() const { return _exception_handlers.length(); } 1614 BlockBegin* exception_handler_at(int i) const { return _exception_handlers.at(i); } 1615 1616 // states of the instructions that have an edge to this exception handler 1617 int number_of_exception_states() { assert(is_set(exception_entry_flag), "only for xhandlers"); return _exception_states == NULL ? 0 : _exception_states->length(); } 1618 ValueStack* exception_state_at(int idx) const { assert(is_set(exception_entry_flag), "only for xhandlers"); return _exception_states->at(idx); } 1619 int add_exception_state(ValueStack* state); 1620 1621 // flags 1622 enum Flag { 1623 no_flag = 0, 1624 std_entry_flag = 1 << 0, 1625 osr_entry_flag = 1 << 1, 1626 exception_entry_flag = 1 << 2, 1627 subroutine_entry_flag = 1 << 3, 1628 backward_branch_target_flag = 1 << 4, 1629 is_on_work_list_flag = 1 << 5, 1630 was_visited_flag = 1 << 6, 1631 default_exception_handler_flag = 1 << 8, // identify block which represents the default exception handler 1632 parser_loop_header_flag = 1 << 9, // set by parser to identify blocks where phi functions can not be created on demand 1633 critical_edge_split_flag = 1 << 10, // set for all blocks that are introduced when critical edges are split 1634 linear_scan_loop_header_flag = 1 << 11, // set during loop-detection for LinearScan 1635 linear_scan_loop_end_flag = 1 << 12 // set during loop-detection for LinearScan 1636 }; 1637 1638 void set(Flag f) { _flags |= f; } 1639 void clear(Flag f) { _flags &= ~f; } 1640 bool is_set(Flag f) const { return (_flags & f) != 0; } 1641 bool is_entry_block() const { 1642 const int entry_mask = std_entry_flag | osr_entry_flag | exception_entry_flag; 1643 return (_flags & entry_mask) != 0; 1644 } 1645 1646 // iteration 1647 void iterate_preorder (BlockClosure* closure); 1648 void iterate_postorder (BlockClosure* closure); 1649 1650 void block_values_do(void f(Value*)); 1651 1652 // loops 1653 void set_loop_index(int ix) { _loop_index = ix; } 1654 int loop_index() const { return _loop_index; } 1655 1656 // merging 1657 bool try_merge(ValueStack* state); // try to merge states at block begin 1658 void merge(ValueStack* state) { bool b = try_merge(state); assert(b, "merge failed"); } 1659 1660 // debugging 1661 void print_block() PRODUCT_RETURN; 1662 void print_block(InstructionPrinter& ip, bool live_only = false) PRODUCT_RETURN; 1663 }; 1664 1665 1666 BASE(BlockEnd, StateSplit) 1667 private: 1668 BlockBegin* _begin; 1669 BlockList* _sux; 1670 ValueStack* _state_before; 1671 1672 protected: 1673 BlockList* sux() const { return _sux; } 1674 1675 void set_sux(BlockList* sux) { 1676 #ifdef ASSERT 1677 assert(sux != NULL, "sux must exist"); 1678 for (int i = sux->length() - 1; i >= 0; i--) assert(sux->at(i) != NULL, "sux must exist"); 1679 #endif 1680 _sux = sux; 1681 } 1682 1683 public: 1684 // creation 1685 BlockEnd(ValueType* type, ValueStack* state_before, bool is_safepoint) 1686 : StateSplit(type) 1687 , _begin(NULL) 1688 , _sux(NULL) 1689 , _state_before(state_before) { 1690 set_flag(IsSafepointFlag, is_safepoint); 1691 } 1692 1693 // accessors 1694 ValueStack* state_before() const { return _state_before; } 1695 bool is_safepoint() const { return check_flag(IsSafepointFlag); } 1696 BlockBegin* begin() const { return _begin; } 1697 1698 // manipulation 1699 void set_begin(BlockBegin* begin); 1700 1701 // generic 1702 virtual void other_values_do(void f(Value*)); 1703 1704 // successors 1705 int number_of_sux() const { return _sux != NULL ? _sux->length() : 0; } 1706 BlockBegin* sux_at(int i) const { return _sux->at(i); } 1707 BlockBegin* default_sux() const { return sux_at(number_of_sux() - 1); } 1708 BlockBegin** addr_sux_at(int i) const { return _sux->adr_at(i); } 1709 int sux_index(BlockBegin* sux) const { return _sux->find(sux); } 1710 void substitute_sux(BlockBegin* old_sux, BlockBegin* new_sux); 1711 }; 1712 1713 1714 LEAF(Goto, BlockEnd) 1715 public: 1716 // creation 1717 Goto(BlockBegin* sux, ValueStack* state_before, bool is_safepoint = false) : BlockEnd(illegalType, state_before, is_safepoint) { 1718 BlockList* s = new BlockList(1); 1719 s->append(sux); 1720 set_sux(s); 1721 } 1722 1723 Goto(BlockBegin* sux, bool is_safepoint) : BlockEnd(illegalType, NULL, is_safepoint) { 1724 BlockList* s = new BlockList(1); 1725 s->append(sux); 1726 set_sux(s); 1727 } 1728 1729 }; 1730 1731 1732 LEAF(If, BlockEnd) 1733 private: 1734 Value _x; 1735 Condition _cond; 1736 Value _y; 1737 ciMethod* _profiled_method; 1738 int _profiled_bci; // Canonicalizer may alter bci of If node 1739 public: 1740 // creation 1741 // unordered_is_true is valid for float/double compares only 1742 If(Value x, Condition cond, bool unordered_is_true, Value y, BlockBegin* tsux, BlockBegin* fsux, ValueStack* state_before, bool is_safepoint) 1743 : BlockEnd(illegalType, state_before, is_safepoint) 1744 , _x(x) 1745 , _cond(cond) 1746 , _y(y) 1747 , _profiled_method(NULL) 1748 , _profiled_bci(0) 1749 { 1750 ASSERT_VALUES 1751 set_flag(UnorderedIsTrueFlag, unordered_is_true); 1752 assert(x->type()->tag() == y->type()->tag(), "types must match"); 1753 BlockList* s = new BlockList(2); 1754 s->append(tsux); 1755 s->append(fsux); 1756 set_sux(s); 1757 } 1758 1759 // accessors 1760 Value x() const { return _x; } 1761 Condition cond() const { return _cond; } 1762 bool unordered_is_true() const { return check_flag(UnorderedIsTrueFlag); } 1763 Value y() const { return _y; } 1764 BlockBegin* sux_for(bool is_true) const { return sux_at(is_true ? 0 : 1); } 1765 BlockBegin* tsux() const { return sux_for(true); } 1766 BlockBegin* fsux() const { return sux_for(false); } 1767 BlockBegin* usux() const { return sux_for(unordered_is_true()); } 1768 bool should_profile() const { return check_flag(ProfileMDOFlag); } 1769 ciMethod* profiled_method() const { return _profiled_method; } // set only for profiled branches 1770 int profiled_bci() const { return _profiled_bci; } // set only for profiled branches 1771 1772 // manipulation 1773 void swap_operands() { 1774 Value t = _x; _x = _y; _y = t; 1775 _cond = mirror(_cond); 1776 } 1777 1778 void swap_sux() { 1779 assert(number_of_sux() == 2, "wrong number of successors"); 1780 BlockList* s = sux(); 1781 BlockBegin* t = s->at(0); s->at_put(0, s->at(1)); s->at_put(1, t); 1782 _cond = negate(_cond); 1783 set_flag(UnorderedIsTrueFlag, !check_flag(UnorderedIsTrueFlag)); 1784 } 1785 1786 void set_should_profile(bool value) { set_flag(ProfileMDOFlag, value); } 1787 void set_profiled_method(ciMethod* method) { _profiled_method = method; } 1788 void set_profiled_bci(int bci) { _profiled_bci = bci; } 1789 1790 // generic 1791 virtual void input_values_do(void f(Value*)) { BlockEnd::input_values_do(f); f(&_x); f(&_y); } 1792 }; 1793 1794 1795 LEAF(IfInstanceOf, BlockEnd) 1796 private: 1797 ciKlass* _klass; 1798 Value _obj; 1799 bool _test_is_instance; // jump if instance 1800 int _instanceof_bci; 1801 1802 public: 1803 IfInstanceOf(ciKlass* klass, Value obj, bool test_is_instance, int instanceof_bci, BlockBegin* tsux, BlockBegin* fsux) 1804 : BlockEnd(illegalType, NULL, false) // temporary set to false 1805 , _klass(klass) 1806 , _obj(obj) 1807 , _test_is_instance(test_is_instance) 1808 , _instanceof_bci(instanceof_bci) 1809 { 1810 ASSERT_VALUES 1811 assert(instanceof_bci >= 0, "illegal bci"); 1812 BlockList* s = new BlockList(2); 1813 s->append(tsux); 1814 s->append(fsux); 1815 set_sux(s); 1816 } 1817 1818 // accessors 1819 // 1820 // Note 1: If test_is_instance() is true, IfInstanceOf tests if obj *is* an 1821 // instance of klass; otherwise it tests if it is *not* and instance 1822 // of klass. 1823 // 1824 // Note 2: IfInstanceOf instructions are created by combining an InstanceOf 1825 // and an If instruction. The IfInstanceOf bci() corresponds to the 1826 // bci that the If would have had; the (this->) instanceof_bci() is 1827 // the bci of the original InstanceOf instruction. 1828 ciKlass* klass() const { return _klass; } 1829 Value obj() const { return _obj; } 1830 int instanceof_bci() const { return _instanceof_bci; } 1831 bool test_is_instance() const { return _test_is_instance; } 1832 BlockBegin* sux_for(bool is_true) const { return sux_at(is_true ? 0 : 1); } 1833 BlockBegin* tsux() const { return sux_for(true); } 1834 BlockBegin* fsux() const { return sux_for(false); } 1835 1836 // manipulation 1837 void swap_sux() { 1838 assert(number_of_sux() == 2, "wrong number of successors"); 1839 BlockList* s = sux(); 1840 BlockBegin* t = s->at(0); s->at_put(0, s->at(1)); s->at_put(1, t); 1841 _test_is_instance = !_test_is_instance; 1842 } 1843 1844 // generic 1845 virtual void input_values_do(void f(Value*)) { BlockEnd::input_values_do(f); f(&_obj); } 1846 }; 1847 1848 1849 BASE(Switch, BlockEnd) 1850 private: 1851 Value _tag; 1852 1853 public: 1854 // creation 1855 Switch(Value tag, BlockList* sux, ValueStack* state_before, bool is_safepoint) 1856 : BlockEnd(illegalType, state_before, is_safepoint) 1857 , _tag(tag) { 1858 ASSERT_VALUES 1859 set_sux(sux); 1860 } 1861 1862 // accessors 1863 Value tag() const { return _tag; } 1864 int length() const { return number_of_sux() - 1; } 1865 1866 // generic 1867 virtual void input_values_do(void f(Value*)) { BlockEnd::input_values_do(f); f(&_tag); } 1868 }; 1869 1870 1871 LEAF(TableSwitch, Switch) 1872 private: 1873 int _lo_key; 1874 1875 public: 1876 // creation 1877 TableSwitch(Value tag, BlockList* sux, int lo_key, ValueStack* state_before, bool is_safepoint) 1878 : Switch(tag, sux, state_before, is_safepoint) 1879 , _lo_key(lo_key) {} 1880 1881 // accessors 1882 int lo_key() const { return _lo_key; } 1883 int hi_key() const { return _lo_key + length() - 1; } 1884 }; 1885 1886 1887 LEAF(LookupSwitch, Switch) 1888 private: 1889 intArray* _keys; 1890 1891 public: 1892 // creation 1893 LookupSwitch(Value tag, BlockList* sux, intArray* keys, ValueStack* state_before, bool is_safepoint) 1894 : Switch(tag, sux, state_before, is_safepoint) 1895 , _keys(keys) { 1896 assert(keys != NULL, "keys must exist"); 1897 assert(keys->length() == length(), "sux & keys have incompatible lengths"); 1898 } 1899 1900 // accessors 1901 int key_at(int i) const { return _keys->at(i); } 1902 }; 1903 1904 1905 LEAF(Return, BlockEnd) 1906 private: 1907 Value _result; 1908 1909 public: 1910 // creation 1911 Return(Value result) : 1912 BlockEnd(result == NULL ? voidType : result->type()->base(), NULL, true), 1913 _result(result) {} 1914 1915 // accessors 1916 Value result() const { return _result; } 1917 bool has_result() const { return result() != NULL; } 1918 1919 // generic 1920 virtual void input_values_do(void f(Value*)) { 1921 BlockEnd::input_values_do(f); 1922 if (has_result()) f(&_result); 1923 } 1924 }; 1925 1926 1927 LEAF(Throw, BlockEnd) 1928 private: 1929 Value _exception; 1930 1931 public: 1932 // creation 1933 Throw(Value exception, ValueStack* state_before) : BlockEnd(illegalType, state_before, true), _exception(exception) { 1934 ASSERT_VALUES 1935 } 1936 1937 // accessors 1938 Value exception() const { return _exception; } 1939 1940 // generic 1941 virtual bool can_trap() const { return true; } 1942 virtual void input_values_do(void f(Value*)) { BlockEnd::input_values_do(f); f(&_exception); } 1943 virtual void state_values_do(void f(Value*)); 1944 }; 1945 1946 1947 LEAF(Base, BlockEnd) 1948 public: 1949 // creation 1950 Base(BlockBegin* std_entry, BlockBegin* osr_entry) : BlockEnd(illegalType, NULL, false) { 1951 assert(std_entry->is_set(BlockBegin::std_entry_flag), "std entry must be flagged"); 1952 assert(osr_entry == NULL || osr_entry->is_set(BlockBegin::osr_entry_flag), "osr entry must be flagged"); 1953 BlockList* s = new BlockList(2); 1954 if (osr_entry != NULL) s->append(osr_entry); 1955 s->append(std_entry); // must be default sux! 1956 set_sux(s); 1957 } 1958 1959 // accessors 1960 BlockBegin* std_entry() const { return default_sux(); } 1961 BlockBegin* osr_entry() const { return number_of_sux() < 2 ? NULL : sux_at(0); } 1962 }; 1963 1964 1965 LEAF(OsrEntry, Instruction) 1966 public: 1967 // creation 1968 #ifdef _LP64 1969 OsrEntry() : Instruction(longType, false) { pin(); } 1970 #else 1971 OsrEntry() : Instruction(intType, false) { pin(); } 1972 #endif 1973 1974 // generic 1975 virtual void input_values_do(void f(Value*)) { } 1976 }; 1977 1978 1979 // Models the incoming exception at a catch site 1980 LEAF(ExceptionObject, Instruction) 1981 public: 1982 // creation 1983 ExceptionObject() : Instruction(objectType, false) { 1984 pin(); 1985 } 1986 1987 // generic 1988 virtual void input_values_do(void f(Value*)) { } 1989 }; 1990 1991 1992 // Models needed rounding for floating-point values on Intel. 1993 // Currently only used to represent rounding of double-precision 1994 // values stored into local variables, but could be used to model 1995 // intermediate rounding of single-precision values as well. 1996 LEAF(RoundFP, Instruction) 1997 private: 1998 Value _input; // floating-point value to be rounded 1999 2000 public: 2001 RoundFP(Value input) 2002 : Instruction(input->type()) // Note: should not be used for constants 2003 , _input(input) 2004 { 2005 ASSERT_VALUES 2006 } 2007 2008 // accessors 2009 Value input() const { return _input; } 2010 2011 // generic 2012 virtual void input_values_do(void f(Value*)) { f(&_input); } 2013 }; 2014 2015 2016 BASE(UnsafeOp, Instruction) 2017 private: 2018 BasicType _basic_type; // ValueType can not express byte-sized integers 2019 2020 protected: 2021 // creation 2022 UnsafeOp(BasicType basic_type, bool is_put) 2023 : Instruction(is_put ? voidType : as_ValueType(basic_type)) 2024 , _basic_type(basic_type) 2025 { 2026 //Note: Unsafe ops are not not guaranteed to throw NPE. 2027 // Convservatively, Unsafe operations must be pinned though we could be 2028 // looser about this if we wanted to.. 2029 pin(); 2030 } 2031 2032 public: 2033 // accessors 2034 BasicType basic_type() { return _basic_type; } 2035 2036 // generic 2037 virtual void input_values_do(void f(Value*)) { } 2038 virtual void other_values_do(void f(Value*)) { } 2039 }; 2040 2041 2042 BASE(UnsafeRawOp, UnsafeOp) 2043 private: 2044 Value _base; // Base address (a Java long) 2045 Value _index; // Index if computed by optimizer; initialized to NULL 2046 int _log2_scale; // Scale factor: 0, 1, 2, or 3. 2047 // Indicates log2 of number of bytes (1, 2, 4, or 8) 2048 // to scale index by. 2049 2050 protected: 2051 UnsafeRawOp(BasicType basic_type, Value addr, bool is_put) 2052 : UnsafeOp(basic_type, is_put) 2053 , _base(addr) 2054 , _index(NULL) 2055 , _log2_scale(0) 2056 { 2057 // Can not use ASSERT_VALUES because index may be NULL 2058 assert(addr != NULL && addr->type()->is_long(), "just checking"); 2059 } 2060 2061 UnsafeRawOp(BasicType basic_type, Value base, Value index, int log2_scale, bool is_put) 2062 : UnsafeOp(basic_type, is_put) 2063 , _base(base) 2064 , _index(index) 2065 , _log2_scale(log2_scale) 2066 { 2067 } 2068 2069 public: 2070 // accessors 2071 Value base() { return _base; } 2072 Value index() { return _index; } 2073 bool has_index() { return (_index != NULL); } 2074 int log2_scale() { return _log2_scale; } 2075 2076 // setters 2077 void set_base (Value base) { _base = base; } 2078 void set_index(Value index) { _index = index; } 2079 void set_log2_scale(int log2_scale) { _log2_scale = log2_scale; } 2080 2081 // generic 2082 virtual void input_values_do(void f(Value*)) { UnsafeOp::input_values_do(f); 2083 f(&_base); 2084 if (has_index()) f(&_index); } 2085 }; 2086 2087 2088 LEAF(UnsafeGetRaw, UnsafeRawOp) 2089 private: 2090 bool _may_be_unaligned; // For OSREntry 2091 2092 public: 2093 UnsafeGetRaw(BasicType basic_type, Value addr, bool may_be_unaligned) 2094 : UnsafeRawOp(basic_type, addr, false) { 2095 _may_be_unaligned = may_be_unaligned; 2096 } 2097 2098 UnsafeGetRaw(BasicType basic_type, Value base, Value index, int log2_scale, bool may_be_unaligned) 2099 : UnsafeRawOp(basic_type, base, index, log2_scale, false) { 2100 _may_be_unaligned = may_be_unaligned; 2101 } 2102 2103 bool may_be_unaligned() { return _may_be_unaligned; } 2104 }; 2105 2106 2107 LEAF(UnsafePutRaw, UnsafeRawOp) 2108 private: 2109 Value _value; // Value to be stored 2110 2111 public: 2112 UnsafePutRaw(BasicType basic_type, Value addr, Value value) 2113 : UnsafeRawOp(basic_type, addr, true) 2114 , _value(value) 2115 { 2116 assert(value != NULL, "just checking"); 2117 ASSERT_VALUES 2118 } 2119 2120 UnsafePutRaw(BasicType basic_type, Value base, Value index, int log2_scale, Value value) 2121 : UnsafeRawOp(basic_type, base, index, log2_scale, true) 2122 , _value(value) 2123 { 2124 assert(value != NULL, "just checking"); 2125 ASSERT_VALUES 2126 } 2127 2128 // accessors 2129 Value value() { return _value; } 2130 2131 // generic 2132 virtual void input_values_do(void f(Value*)) { UnsafeRawOp::input_values_do(f); 2133 f(&_value); } 2134 }; 2135 2136 2137 BASE(UnsafeObjectOp, UnsafeOp) 2138 private: 2139 Value _object; // Object to be fetched from or mutated 2140 Value _offset; // Offset within object 2141 bool _is_volatile; // true if volatile - dl/JSR166 2142 public: 2143 UnsafeObjectOp(BasicType basic_type, Value object, Value offset, bool is_put, bool is_volatile) 2144 : UnsafeOp(basic_type, is_put), _object(object), _offset(offset), _is_volatile(is_volatile) 2145 { 2146 } 2147 2148 // accessors 2149 Value object() { return _object; } 2150 Value offset() { return _offset; } 2151 bool is_volatile() { return _is_volatile; } 2152 // generic 2153 virtual void input_values_do(void f(Value*)) { UnsafeOp::input_values_do(f); 2154 f(&_object); 2155 f(&_offset); } 2156 }; 2157 2158 2159 LEAF(UnsafeGetObject, UnsafeObjectOp) 2160 public: 2161 UnsafeGetObject(BasicType basic_type, Value object, Value offset, bool is_volatile) 2162 : UnsafeObjectOp(basic_type, object, offset, false, is_volatile) 2163 { 2164 ASSERT_VALUES 2165 } 2166 }; 2167 2168 2169 LEAF(UnsafePutObject, UnsafeObjectOp) 2170 private: 2171 Value _value; // Value to be stored 2172 public: 2173 UnsafePutObject(BasicType basic_type, Value object, Value offset, Value value, bool is_volatile) 2174 : UnsafeObjectOp(basic_type, object, offset, true, is_volatile) 2175 , _value(value) 2176 { 2177 ASSERT_VALUES 2178 } 2179 2180 // accessors 2181 Value value() { return _value; } 2182 2183 // generic 2184 virtual void input_values_do(void f(Value*)) { UnsafeObjectOp::input_values_do(f); 2185 f(&_value); } 2186 }; 2187 2188 2189 BASE(UnsafePrefetch, UnsafeObjectOp) 2190 public: 2191 UnsafePrefetch(Value object, Value offset) 2192 : UnsafeObjectOp(T_VOID, object, offset, false, false) 2193 { 2194 } 2195 }; 2196 2197 2198 LEAF(UnsafePrefetchRead, UnsafePrefetch) 2199 public: 2200 UnsafePrefetchRead(Value object, Value offset) 2201 : UnsafePrefetch(object, offset) 2202 { 2203 ASSERT_VALUES 2204 } 2205 }; 2206 2207 2208 LEAF(UnsafePrefetchWrite, UnsafePrefetch) 2209 public: 2210 UnsafePrefetchWrite(Value object, Value offset) 2211 : UnsafePrefetch(object, offset) 2212 { 2213 ASSERT_VALUES 2214 } 2215 }; 2216 2217 2218 LEAF(ProfileCall, Instruction) 2219 private: 2220 ciMethod* _method; 2221 int _bci_of_invoke; 2222 Value _recv; 2223 ciKlass* _known_holder; 2224 2225 public: 2226 ProfileCall(ciMethod* method, int bci, Value recv, ciKlass* known_holder) 2227 : Instruction(voidType) 2228 , _method(method) 2229 , _bci_of_invoke(bci) 2230 , _recv(recv) 2231 , _known_holder(known_holder) 2232 { 2233 // The ProfileCall has side-effects and must occur precisely where located 2234 pin(); 2235 } 2236 2237 ciMethod* method() { return _method; } 2238 int bci_of_invoke() { return _bci_of_invoke; } 2239 Value recv() { return _recv; } 2240 ciKlass* known_holder() { return _known_holder; } 2241 2242 virtual void input_values_do(void f(Value*)) { if (_recv != NULL) f(&_recv); } 2243 }; 2244 2245 2246 // 2247 // Simple node representing a counter update generally used for updating MDOs 2248 // 2249 LEAF(ProfileCounter, Instruction) 2250 private: 2251 Value _mdo; 2252 int _offset; 2253 int _increment; 2254 2255 public: 2256 ProfileCounter(Value mdo, int offset, int increment = 1) 2257 : Instruction(voidType) 2258 , _mdo(mdo) 2259 , _offset(offset) 2260 , _increment(increment) 2261 { 2262 // The ProfileCounter has side-effects and must occur precisely where located 2263 pin(); 2264 } 2265 2266 Value mdo() { return _mdo; } 2267 int offset() { return _offset; } 2268 int increment() { return _increment; } 2269 2270 virtual void input_values_do(void f(Value*)) { f(&_mdo); } 2271 }; 2272 2273 2274 class BlockPair: public CompilationResourceObj { 2275 private: 2276 BlockBegin* _from; 2277 BlockBegin* _to; 2278 public: 2279 BlockPair(BlockBegin* from, BlockBegin* to): _from(from), _to(to) {} 2280 BlockBegin* from() const { return _from; } 2281 BlockBegin* to() const { return _to; } 2282 bool is_same(BlockBegin* from, BlockBegin* to) const { return _from == from && _to == to; } 2283 bool is_same(BlockPair* p) const { return _from == p->from() && _to == p->to(); } 2284 void set_to(BlockBegin* b) { _to = b; } 2285 void set_from(BlockBegin* b) { _from = b; } 2286 }; 2287 2288 2289 define_array(BlockPairArray, BlockPair*) 2290 define_stack(BlockPairList, BlockPairArray) 2291 2292 2293 inline int BlockBegin::number_of_sux() const { assert(_end == NULL || _end->number_of_sux() == _successors.length(), "mismatch"); return _successors.length(); } 2294 inline BlockBegin* BlockBegin::sux_at(int i) const { assert(_end == NULL || _end->sux_at(i) == _successors.at(i), "mismatch"); return _successors.at(i); } 2295 inline void BlockBegin::add_successor(BlockBegin* sux) { assert(_end == NULL, "Would create mismatch with successors of BlockEnd"); _successors.append(sux); } 2296 2297 #undef ASSERT_VALUES