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