1 /* 2 * Copyright (c) 1997, 2009, 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 // Optimization - Graph Style 26 27 #include "incls/_precompiled.incl" 28 #include "incls/_connode.cpp.incl" 29 30 //============================================================================= 31 //------------------------------hash------------------------------------------- 32 uint ConNode::hash() const { 33 return (uintptr_t)in(TypeFunc::Control) + _type->hash(); 34 } 35 36 //------------------------------make------------------------------------------- 37 ConNode *ConNode::make( Compile* C, const Type *t ) { 38 switch( t->basic_type() ) { 39 case T_INT: return new (C, 1) ConINode( t->is_int() ); 40 case T_LONG: return new (C, 1) ConLNode( t->is_long() ); 41 case T_FLOAT: return new (C, 1) ConFNode( t->is_float_constant() ); 42 case T_DOUBLE: return new (C, 1) ConDNode( t->is_double_constant() ); 43 case T_VOID: return new (C, 1) ConNode ( Type::TOP ); 44 case T_OBJECT: return new (C, 1) ConPNode( t->is_oopptr() ); 45 case T_ARRAY: return new (C, 1) ConPNode( t->is_aryptr() ); 46 case T_ADDRESS: return new (C, 1) ConPNode( t->is_ptr() ); 47 case T_NARROWOOP: return new (C, 1) ConNNode( t->is_narrowoop() ); 48 // Expected cases: TypePtr::NULL_PTR, any is_rawptr() 49 // Also seen: AnyPtr(TopPTR *+top); from command line: 50 // r -XX:+PrintOpto -XX:CIStart=285 -XX:+CompileTheWorld -XX:CompileTheWorldStartAt=660 51 // %%%% Stop using TypePtr::NULL_PTR to represent nulls: use either TypeRawPtr::NULL_PTR 52 // or else TypeOopPtr::NULL_PTR. Then set Type::_basic_type[AnyPtr] = T_ILLEGAL 53 } 54 ShouldNotReachHere(); 55 return NULL; 56 } 57 58 //============================================================================= 59 /* 60 The major change is for CMoveP and StrComp. They have related but slightly 61 different problems. They both take in TWO oops which are both null-checked 62 independently before the using Node. After CCP removes the CastPP's they need 63 to pick up the guarding test edge - in this case TWO control edges. I tried 64 various solutions, all have problems: 65 66 (1) Do nothing. This leads to a bug where we hoist a Load from a CMoveP or a 67 StrComp above a guarding null check. I've seen both cases in normal -Xcomp 68 testing. 69 70 (2) Plug the control edge from 1 of the 2 oops in. Apparent problem here is 71 to figure out which test post-dominates. The real problem is that it doesn't 72 matter which one you pick. After you pick up, the dominating-test elider in 73 IGVN can remove the test and allow you to hoist up to the dominating test on 74 the chosen oop bypassing the test on the not-chosen oop. Seen in testing. 75 Oops. 76 77 (3) Leave the CastPP's in. This makes the graph more accurate in some sense; 78 we get to keep around the knowledge that an oop is not-null after some test. 79 Alas, the CastPP's interfere with GVN (some values are the regular oop, some 80 are the CastPP of the oop, all merge at Phi's which cannot collapse, etc). 81 This cost us 10% on SpecJVM, even when I removed some of the more trivial 82 cases in the optimizer. Removing more useless Phi's started allowing Loads to 83 illegally float above null checks. I gave up on this approach. 84 85 (4) Add BOTH control edges to both tests. Alas, too much code knows that 86 control edges are in slot-zero ONLY. Many quick asserts fail; no way to do 87 this one. Note that I really want to allow the CMoveP to float and add both 88 control edges to the dependent Load op - meaning I can select early but I 89 cannot Load until I pass both tests. 90 91 (5) Do not hoist CMoveP and StrComp. To this end I added the v-call 92 depends_only_on_test(). No obvious performance loss on Spec, but we are 93 clearly conservative on CMoveP (also so on StrComp but that's unlikely to 94 matter ever). 95 96 */ 97 98 99 //------------------------------Ideal------------------------------------------ 100 // Return a node which is more "ideal" than the current node. 101 // Move constants to the right. 102 Node *CMoveNode::Ideal(PhaseGVN *phase, bool can_reshape) { 103 if( in(0) && remove_dead_region(phase, can_reshape) ) return this; 104 // Don't bother trying to transform a dead node 105 if( in(0) && in(0)->is_top() ) return NULL; 106 assert( !phase->eqv(in(Condition), this) && 107 !phase->eqv(in(IfFalse), this) && 108 !phase->eqv(in(IfTrue), this), "dead loop in CMoveNode::Ideal" ); 109 if( phase->type(in(Condition)) == Type::TOP ) 110 return NULL; // return NULL when Condition is dead 111 112 if( in(IfFalse)->is_Con() && !in(IfTrue)->is_Con() ) { 113 if( in(Condition)->is_Bool() ) { 114 BoolNode* b = in(Condition)->as_Bool(); 115 BoolNode* b2 = b->negate(phase); 116 return make( phase->C, in(Control), phase->transform(b2), in(IfTrue), in(IfFalse), _type ); 117 } 118 } 119 return NULL; 120 } 121 122 //------------------------------is_cmove_id------------------------------------ 123 // Helper function to check for CMOVE identity. Shared with PhiNode::Identity 124 Node *CMoveNode::is_cmove_id( PhaseTransform *phase, Node *cmp, Node *t, Node *f, BoolNode *b ) { 125 // Check for Cmp'ing and CMove'ing same values 126 if( (phase->eqv(cmp->in(1),f) && 127 phase->eqv(cmp->in(2),t)) || 128 // Swapped Cmp is OK 129 (phase->eqv(cmp->in(2),f) && 130 phase->eqv(cmp->in(1),t)) ) { 131 // Give up this identity check for floating points because it may choose incorrect 132 // value around 0.0 and -0.0 133 if ( cmp->Opcode()==Op_CmpF || cmp->Opcode()==Op_CmpD ) 134 return NULL; 135 // Check for "(t==f)?t:f;" and replace with "f" 136 if( b->_test._test == BoolTest::eq ) 137 return f; 138 // Allow the inverted case as well 139 // Check for "(t!=f)?t:f;" and replace with "t" 140 if( b->_test._test == BoolTest::ne ) 141 return t; 142 } 143 return NULL; 144 } 145 146 //------------------------------Identity--------------------------------------- 147 // Conditional-move is an identity if both inputs are the same, or the test 148 // true or false. 149 Node *CMoveNode::Identity( PhaseTransform *phase ) { 150 if( phase->eqv(in(IfFalse),in(IfTrue)) ) // C-moving identical inputs? 151 return in(IfFalse); // Then it doesn't matter 152 if( phase->type(in(Condition)) == TypeInt::ZERO ) 153 return in(IfFalse); // Always pick left(false) input 154 if( phase->type(in(Condition)) == TypeInt::ONE ) 155 return in(IfTrue); // Always pick right(true) input 156 157 // Check for CMove'ing a constant after comparing against the constant. 158 // Happens all the time now, since if we compare equality vs a constant in 159 // the parser, we "know" the variable is constant on one path and we force 160 // it. Thus code like "if( x==0 ) {/*EMPTY*/}" ends up inserting a 161 // conditional move: "x = (x==0)?0:x;". Yucko. This fix is slightly more 162 // general in that we don't need constants. 163 if( in(Condition)->is_Bool() ) { 164 BoolNode *b = in(Condition)->as_Bool(); 165 Node *cmp = b->in(1); 166 if( cmp->is_Cmp() ) { 167 Node *id = is_cmove_id( phase, cmp, in(IfTrue), in(IfFalse), b ); 168 if( id ) return id; 169 } 170 } 171 172 return this; 173 } 174 175 //------------------------------Value------------------------------------------ 176 // Result is the meet of inputs 177 const Type *CMoveNode::Value( PhaseTransform *phase ) const { 178 if( phase->type(in(Condition)) == Type::TOP ) 179 return Type::TOP; 180 return phase->type(in(IfFalse))->meet(phase->type(in(IfTrue))); 181 } 182 183 //------------------------------make------------------------------------------- 184 // Make a correctly-flavored CMove. Since _type is directly determined 185 // from the inputs we do not need to specify it here. 186 CMoveNode *CMoveNode::make( Compile *C, Node *c, Node *bol, Node *left, Node *right, const Type *t ) { 187 switch( t->basic_type() ) { 188 case T_INT: return new (C, 4) CMoveINode( bol, left, right, t->is_int() ); 189 case T_FLOAT: return new (C, 4) CMoveFNode( bol, left, right, t ); 190 case T_DOUBLE: return new (C, 4) CMoveDNode( bol, left, right, t ); 191 case T_LONG: return new (C, 4) CMoveLNode( bol, left, right, t->is_long() ); 192 case T_OBJECT: return new (C, 4) CMovePNode( c, bol, left, right, t->is_oopptr() ); 193 case T_ADDRESS: return new (C, 4) CMovePNode( c, bol, left, right, t->is_ptr() ); 194 case T_NARROWOOP: return new (C, 4) CMoveNNode( c, bol, left, right, t ); 195 default: 196 ShouldNotReachHere(); 197 return NULL; 198 } 199 } 200 201 //============================================================================= 202 //------------------------------Ideal------------------------------------------ 203 // Return a node which is more "ideal" than the current node. 204 // Check for conversions to boolean 205 Node *CMoveINode::Ideal(PhaseGVN *phase, bool can_reshape) { 206 // Try generic ideal's first 207 Node *x = CMoveNode::Ideal(phase, can_reshape); 208 if( x ) return x; 209 210 // If zero is on the left (false-case, no-move-case) it must mean another 211 // constant is on the right (otherwise the shared CMove::Ideal code would 212 // have moved the constant to the right). This situation is bad for Intel 213 // and a don't-care for Sparc. It's bad for Intel because the zero has to 214 // be manifested in a register with a XOR which kills flags, which are live 215 // on input to the CMoveI, leading to a situation which causes excessive 216 // spilling on Intel. For Sparc, if the zero in on the left the Sparc will 217 // zero a register via G0 and conditionally-move the other constant. If the 218 // zero is on the right, the Sparc will load the first constant with a 219 // 13-bit set-lo and conditionally move G0. See bug 4677505. 220 if( phase->type(in(IfFalse)) == TypeInt::ZERO && !(phase->type(in(IfTrue)) == TypeInt::ZERO) ) { 221 if( in(Condition)->is_Bool() ) { 222 BoolNode* b = in(Condition)->as_Bool(); 223 BoolNode* b2 = b->negate(phase); 224 return make( phase->C, in(Control), phase->transform(b2), in(IfTrue), in(IfFalse), _type ); 225 } 226 } 227 228 // Now check for booleans 229 int flip = 0; 230 231 // Check for picking from zero/one 232 if( phase->type(in(IfFalse)) == TypeInt::ZERO && phase->type(in(IfTrue)) == TypeInt::ONE ) { 233 flip = 1 - flip; 234 } else if( phase->type(in(IfFalse)) == TypeInt::ONE && phase->type(in(IfTrue)) == TypeInt::ZERO ) { 235 } else return NULL; 236 237 // Check for eq/ne test 238 if( !in(1)->is_Bool() ) return NULL; 239 BoolNode *bol = in(1)->as_Bool(); 240 if( bol->_test._test == BoolTest::eq ) { 241 } else if( bol->_test._test == BoolTest::ne ) { 242 flip = 1-flip; 243 } else return NULL; 244 245 // Check for vs 0 or 1 246 if( !bol->in(1)->is_Cmp() ) return NULL; 247 const CmpNode *cmp = bol->in(1)->as_Cmp(); 248 if( phase->type(cmp->in(2)) == TypeInt::ZERO ) { 249 } else if( phase->type(cmp->in(2)) == TypeInt::ONE ) { 250 // Allow cmp-vs-1 if the other input is bounded by 0-1 251 if( phase->type(cmp->in(1)) != TypeInt::BOOL ) 252 return NULL; 253 flip = 1 - flip; 254 } else return NULL; 255 256 // Convert to a bool (flipped) 257 // Build int->bool conversion 258 #ifndef PRODUCT 259 if( PrintOpto ) tty->print_cr("CMOV to I2B"); 260 #endif 261 Node *n = new (phase->C, 2) Conv2BNode( cmp->in(1) ); 262 if( flip ) 263 n = new (phase->C, 3) XorINode( phase->transform(n), phase->intcon(1) ); 264 265 return n; 266 } 267 268 //============================================================================= 269 //------------------------------Ideal------------------------------------------ 270 // Return a node which is more "ideal" than the current node. 271 // Check for absolute value 272 Node *CMoveFNode::Ideal(PhaseGVN *phase, bool can_reshape) { 273 // Try generic ideal's first 274 Node *x = CMoveNode::Ideal(phase, can_reshape); 275 if( x ) return x; 276 277 int cmp_zero_idx = 0; // Index of compare input where to look for zero 278 int phi_x_idx = 0; // Index of phi input where to find naked x 279 280 // Find the Bool 281 if( !in(1)->is_Bool() ) return NULL; 282 BoolNode *bol = in(1)->as_Bool(); 283 // Check bool sense 284 switch( bol->_test._test ) { 285 case BoolTest::lt: cmp_zero_idx = 1; phi_x_idx = IfTrue; break; 286 case BoolTest::le: cmp_zero_idx = 2; phi_x_idx = IfFalse; break; 287 case BoolTest::gt: cmp_zero_idx = 2; phi_x_idx = IfTrue; break; 288 case BoolTest::ge: cmp_zero_idx = 1; phi_x_idx = IfFalse; break; 289 default: return NULL; break; 290 } 291 292 // Find zero input of CmpF; the other input is being abs'd 293 Node *cmpf = bol->in(1); 294 if( cmpf->Opcode() != Op_CmpF ) return NULL; 295 Node *X = NULL; 296 bool flip = false; 297 if( phase->type(cmpf->in(cmp_zero_idx)) == TypeF::ZERO ) { 298 X = cmpf->in(3 - cmp_zero_idx); 299 } else if (phase->type(cmpf->in(3 - cmp_zero_idx)) == TypeF::ZERO) { 300 // The test is inverted, we should invert the result... 301 X = cmpf->in(cmp_zero_idx); 302 flip = true; 303 } else { 304 return NULL; 305 } 306 307 // If X is found on the appropriate phi input, find the subtract on the other 308 if( X != in(phi_x_idx) ) return NULL; 309 int phi_sub_idx = phi_x_idx == IfTrue ? IfFalse : IfTrue; 310 Node *sub = in(phi_sub_idx); 311 312 // Allow only SubF(0,X) and fail out for all others; NegF is not OK 313 if( sub->Opcode() != Op_SubF || 314 sub->in(2) != X || 315 phase->type(sub->in(1)) != TypeF::ZERO ) return NULL; 316 317 Node *abs = new (phase->C, 2) AbsFNode( X ); 318 if( flip ) 319 abs = new (phase->C, 3) SubFNode(sub->in(1), phase->transform(abs)); 320 321 return abs; 322 } 323 324 //============================================================================= 325 //------------------------------Ideal------------------------------------------ 326 // Return a node which is more "ideal" than the current node. 327 // Check for absolute value 328 Node *CMoveDNode::Ideal(PhaseGVN *phase, bool can_reshape) { 329 // Try generic ideal's first 330 Node *x = CMoveNode::Ideal(phase, can_reshape); 331 if( x ) return x; 332 333 int cmp_zero_idx = 0; // Index of compare input where to look for zero 334 int phi_x_idx = 0; // Index of phi input where to find naked x 335 336 // Find the Bool 337 if( !in(1)->is_Bool() ) return NULL; 338 BoolNode *bol = in(1)->as_Bool(); 339 // Check bool sense 340 switch( bol->_test._test ) { 341 case BoolTest::lt: cmp_zero_idx = 1; phi_x_idx = IfTrue; break; 342 case BoolTest::le: cmp_zero_idx = 2; phi_x_idx = IfFalse; break; 343 case BoolTest::gt: cmp_zero_idx = 2; phi_x_idx = IfTrue; break; 344 case BoolTest::ge: cmp_zero_idx = 1; phi_x_idx = IfFalse; break; 345 default: return NULL; break; 346 } 347 348 // Find zero input of CmpD; the other input is being abs'd 349 Node *cmpd = bol->in(1); 350 if( cmpd->Opcode() != Op_CmpD ) return NULL; 351 Node *X = NULL; 352 bool flip = false; 353 if( phase->type(cmpd->in(cmp_zero_idx)) == TypeD::ZERO ) { 354 X = cmpd->in(3 - cmp_zero_idx); 355 } else if (phase->type(cmpd->in(3 - cmp_zero_idx)) == TypeD::ZERO) { 356 // The test is inverted, we should invert the result... 357 X = cmpd->in(cmp_zero_idx); 358 flip = true; 359 } else { 360 return NULL; 361 } 362 363 // If X is found on the appropriate phi input, find the subtract on the other 364 if( X != in(phi_x_idx) ) return NULL; 365 int phi_sub_idx = phi_x_idx == IfTrue ? IfFalse : IfTrue; 366 Node *sub = in(phi_sub_idx); 367 368 // Allow only SubD(0,X) and fail out for all others; NegD is not OK 369 if( sub->Opcode() != Op_SubD || 370 sub->in(2) != X || 371 phase->type(sub->in(1)) != TypeD::ZERO ) return NULL; 372 373 Node *abs = new (phase->C, 2) AbsDNode( X ); 374 if( flip ) 375 abs = new (phase->C, 3) SubDNode(sub->in(1), phase->transform(abs)); 376 377 return abs; 378 } 379 380 381 //============================================================================= 382 // If input is already higher or equal to cast type, then this is an identity. 383 Node *ConstraintCastNode::Identity( PhaseTransform *phase ) { 384 return phase->type(in(1))->higher_equal(_type) ? in(1) : this; 385 } 386 387 //------------------------------Value------------------------------------------ 388 // Take 'join' of input and cast-up type 389 const Type *ConstraintCastNode::Value( PhaseTransform *phase ) const { 390 if( in(0) && phase->type(in(0)) == Type::TOP ) return Type::TOP; 391 const Type* ft = phase->type(in(1))->filter(_type); 392 393 #ifdef ASSERT 394 // Previous versions of this function had some special case logic, 395 // which is no longer necessary. Make sure of the required effects. 396 switch (Opcode()) { 397 case Op_CastII: 398 { 399 const Type* t1 = phase->type(in(1)); 400 if( t1 == Type::TOP ) assert(ft == Type::TOP, "special case #1"); 401 const Type* rt = t1->join(_type); 402 if (rt->empty()) assert(ft == Type::TOP, "special case #2"); 403 break; 404 } 405 case Op_CastPP: 406 if (phase->type(in(1)) == TypePtr::NULL_PTR && 407 _type->isa_ptr() && _type->is_ptr()->_ptr == TypePtr::NotNull) 408 assert(ft == Type::TOP, "special case #3"); 409 break; 410 } 411 #endif //ASSERT 412 413 return ft; 414 } 415 416 //------------------------------Ideal------------------------------------------ 417 // Return a node which is more "ideal" than the current node. Strip out 418 // control copies 419 Node *ConstraintCastNode::Ideal(PhaseGVN *phase, bool can_reshape){ 420 return (in(0) && remove_dead_region(phase, can_reshape)) ? this : NULL; 421 } 422 423 //------------------------------Ideal_DU_postCCP------------------------------- 424 // Throw away cast after constant propagation 425 Node *ConstraintCastNode::Ideal_DU_postCCP( PhaseCCP *ccp ) { 426 const Type *t = ccp->type(in(1)); 427 ccp->hash_delete(this); 428 set_type(t); // Turn into ID function 429 ccp->hash_insert(this); 430 return this; 431 } 432 433 434 //============================================================================= 435 436 //------------------------------Ideal_DU_postCCP------------------------------- 437 // If not converting int->oop, throw away cast after constant propagation 438 Node *CastPPNode::Ideal_DU_postCCP( PhaseCCP *ccp ) { 439 const Type *t = ccp->type(in(1)); 440 if (!t->isa_oop_ptr() || (in(1)->is_DecodeN() && Matcher::gen_narrow_oop_implicit_null_checks())) { 441 return NULL; // do not transform raw pointers or narrow oops 442 } 443 return ConstraintCastNode::Ideal_DU_postCCP(ccp); 444 } 445 446 447 448 //============================================================================= 449 //------------------------------Identity--------------------------------------- 450 // If input is already higher or equal to cast type, then this is an identity. 451 Node *CheckCastPPNode::Identity( PhaseTransform *phase ) { 452 // Toned down to rescue meeting at a Phi 3 different oops all implementing 453 // the same interface. CompileTheWorld starting at 502, kd12rc1.zip. 454 return (phase->type(in(1)) == phase->type(this)) ? in(1) : this; 455 } 456 457 // Determine whether "n" is a node which can cause an alias of one of its inputs. Node types 458 // which can create aliases are: CheckCastPP, Phi, and any store (if there is also a load from 459 // the location.) 460 // Note: this checks for aliases created in this compilation, not ones which may 461 // be potentially created at call sites. 462 static bool can_cause_alias(Node *n, PhaseTransform *phase) { 463 bool possible_alias = false; 464 465 if (n->is_Store()) { 466 possible_alias = !n->as_Store()->value_never_loaded(phase); 467 } else { 468 int opc = n->Opcode(); 469 possible_alias = n->is_Phi() || 470 opc == Op_CheckCastPP || 471 opc == Op_StorePConditional || 472 opc == Op_CompareAndSwapP || 473 opc == Op_CompareAndSwapN; 474 } 475 return possible_alias; 476 } 477 478 //------------------------------Value------------------------------------------ 479 // Take 'join' of input and cast-up type, unless working with an Interface 480 const Type *CheckCastPPNode::Value( PhaseTransform *phase ) const { 481 if( in(0) && phase->type(in(0)) == Type::TOP ) return Type::TOP; 482 483 const Type *inn = phase->type(in(1)); 484 if( inn == Type::TOP ) return Type::TOP; // No information yet 485 486 const TypePtr *in_type = inn->isa_ptr(); 487 const TypePtr *my_type = _type->isa_ptr(); 488 const Type *result = _type; 489 if( in_type != NULL && my_type != NULL ) { 490 TypePtr::PTR in_ptr = in_type->ptr(); 491 if( in_ptr == TypePtr::Null ) { 492 result = in_type; 493 } else if( in_ptr == TypePtr::Constant ) { 494 // Casting a constant oop to an interface? 495 // (i.e., a String to a Comparable?) 496 // Then return the interface. 497 const TypeOopPtr *jptr = my_type->isa_oopptr(); 498 assert( jptr, "" ); 499 result = (jptr->klass()->is_interface() || !in_type->higher_equal(_type)) 500 ? my_type->cast_to_ptr_type( TypePtr::NotNull ) 501 : in_type; 502 } else { 503 result = my_type->cast_to_ptr_type( my_type->join_ptr(in_ptr) ); 504 } 505 } 506 return result; 507 508 // JOIN NOT DONE HERE BECAUSE OF INTERFACE ISSUES. 509 // FIX THIS (DO THE JOIN) WHEN UNION TYPES APPEAR! 510 511 // 512 // Remove this code after overnight run indicates no performance 513 // loss from not performing JOIN at CheckCastPPNode 514 // 515 // const TypeInstPtr *in_oop = in->isa_instptr(); 516 // const TypeInstPtr *my_oop = _type->isa_instptr(); 517 // // If either input is an 'interface', return destination type 518 // assert (in_oop == NULL || in_oop->klass() != NULL, ""); 519 // assert (my_oop == NULL || my_oop->klass() != NULL, ""); 520 // if( (in_oop && in_oop->klass()->klass_part()->is_interface()) 521 // ||(my_oop && my_oop->klass()->klass_part()->is_interface()) ) { 522 // TypePtr::PTR in_ptr = in->isa_ptr() ? in->is_ptr()->_ptr : TypePtr::BotPTR; 523 // // Preserve cast away nullness for interfaces 524 // if( in_ptr == TypePtr::NotNull && my_oop && my_oop->_ptr == TypePtr::BotPTR ) { 525 // return my_oop->cast_to_ptr_type(TypePtr::NotNull); 526 // } 527 // return _type; 528 // } 529 // 530 // // Neither the input nor the destination type is an interface, 531 // 532 // // history: JOIN used to cause weird corner case bugs 533 // // return (in == TypeOopPtr::NULL_PTR) ? in : _type; 534 // // JOIN picks up NotNull in common instance-of/check-cast idioms, both oops. 535 // // JOIN does not preserve NotNull in other cases, e.g. RawPtr vs InstPtr 536 // const Type *join = in->join(_type); 537 // // Check if join preserved NotNull'ness for pointers 538 // if( join->isa_ptr() && _type->isa_ptr() ) { 539 // TypePtr::PTR join_ptr = join->is_ptr()->_ptr; 540 // TypePtr::PTR type_ptr = _type->is_ptr()->_ptr; 541 // // If there isn't any NotNull'ness to preserve 542 // // OR if join preserved NotNull'ness then return it 543 // if( type_ptr == TypePtr::BotPTR || type_ptr == TypePtr::Null || 544 // join_ptr == TypePtr::NotNull || join_ptr == TypePtr::Constant ) { 545 // return join; 546 // } 547 // // ELSE return same old type as before 548 // return _type; 549 // } 550 // // Not joining two pointers 551 // return join; 552 } 553 554 //------------------------------Ideal------------------------------------------ 555 // Return a node which is more "ideal" than the current node. Strip out 556 // control copies 557 Node *CheckCastPPNode::Ideal(PhaseGVN *phase, bool can_reshape){ 558 return (in(0) && remove_dead_region(phase, can_reshape)) ? this : NULL; 559 } 560 561 562 Node* DecodeNNode::Identity(PhaseTransform* phase) { 563 const Type *t = phase->type( in(1) ); 564 if( t == Type::TOP ) return in(1); 565 566 if (in(1)->is_EncodeP()) { 567 // (DecodeN (EncodeP p)) -> p 568 return in(1)->in(1); 569 } 570 return this; 571 } 572 573 const Type *DecodeNNode::Value( PhaseTransform *phase ) const { 574 const Type *t = phase->type( in(1) ); 575 if (t == Type::TOP) return Type::TOP; 576 if (t == TypeNarrowOop::NULL_PTR) return TypePtr::NULL_PTR; 577 578 assert(t->isa_narrowoop(), "only narrowoop here"); 579 return t->make_ptr(); 580 } 581 582 Node* EncodePNode::Identity(PhaseTransform* phase) { 583 const Type *t = phase->type( in(1) ); 584 if( t == Type::TOP ) return in(1); 585 586 if (in(1)->is_DecodeN()) { 587 // (EncodeP (DecodeN p)) -> p 588 return in(1)->in(1); 589 } 590 return this; 591 } 592 593 const Type *EncodePNode::Value( PhaseTransform *phase ) const { 594 const Type *t = phase->type( in(1) ); 595 if (t == Type::TOP) return Type::TOP; 596 if (t == TypePtr::NULL_PTR) return TypeNarrowOop::NULL_PTR; 597 598 assert(t->isa_oopptr(), "only oopptr here"); 599 return t->make_narrowoop(); 600 } 601 602 603 Node *EncodePNode::Ideal_DU_postCCP( PhaseCCP *ccp ) { 604 return MemNode::Ideal_common_DU_postCCP(ccp, this, in(1)); 605 } 606 607 //============================================================================= 608 //------------------------------Identity--------------------------------------- 609 Node *Conv2BNode::Identity( PhaseTransform *phase ) { 610 const Type *t = phase->type( in(1) ); 611 if( t == Type::TOP ) return in(1); 612 if( t == TypeInt::ZERO ) return in(1); 613 if( t == TypeInt::ONE ) return in(1); 614 if( t == TypeInt::BOOL ) return in(1); 615 return this; 616 } 617 618 //------------------------------Value------------------------------------------ 619 const Type *Conv2BNode::Value( PhaseTransform *phase ) const { 620 const Type *t = phase->type( in(1) ); 621 if( t == Type::TOP ) return Type::TOP; 622 if( t == TypeInt::ZERO ) return TypeInt::ZERO; 623 if( t == TypePtr::NULL_PTR ) return TypeInt::ZERO; 624 const TypePtr *tp = t->isa_ptr(); 625 if( tp != NULL ) { 626 if( tp->ptr() == TypePtr::AnyNull ) return Type::TOP; 627 if( tp->ptr() == TypePtr::Constant) return TypeInt::ONE; 628 if (tp->ptr() == TypePtr::NotNull) return TypeInt::ONE; 629 return TypeInt::BOOL; 630 } 631 if (t->base() != Type::Int) return TypeInt::BOOL; 632 const TypeInt *ti = t->is_int(); 633 if( ti->_hi < 0 || ti->_lo > 0 ) return TypeInt::ONE; 634 return TypeInt::BOOL; 635 } 636 637 638 // The conversions operations are all Alpha sorted. Please keep it that way! 639 //============================================================================= 640 //------------------------------Value------------------------------------------ 641 const Type *ConvD2FNode::Value( PhaseTransform *phase ) const { 642 const Type *t = phase->type( in(1) ); 643 if( t == Type::TOP ) return Type::TOP; 644 if( t == Type::DOUBLE ) return Type::FLOAT; 645 const TypeD *td = t->is_double_constant(); 646 return TypeF::make( (float)td->getd() ); 647 } 648 649 //------------------------------Identity--------------------------------------- 650 // Float's can be converted to doubles with no loss of bits. Hence 651 // converting a float to a double and back to a float is a NOP. 652 Node *ConvD2FNode::Identity(PhaseTransform *phase) { 653 return (in(1)->Opcode() == Op_ConvF2D) ? in(1)->in(1) : this; 654 } 655 656 //============================================================================= 657 //------------------------------Value------------------------------------------ 658 const Type *ConvD2INode::Value( PhaseTransform *phase ) const { 659 const Type *t = phase->type( in(1) ); 660 if( t == Type::TOP ) return Type::TOP; 661 if( t == Type::DOUBLE ) return TypeInt::INT; 662 const TypeD *td = t->is_double_constant(); 663 return TypeInt::make( SharedRuntime::d2i( td->getd() ) ); 664 } 665 666 //------------------------------Ideal------------------------------------------ 667 // If converting to an int type, skip any rounding nodes 668 Node *ConvD2INode::Ideal(PhaseGVN *phase, bool can_reshape) { 669 if( in(1)->Opcode() == Op_RoundDouble ) 670 set_req(1,in(1)->in(1)); 671 return NULL; 672 } 673 674 //------------------------------Identity--------------------------------------- 675 // Int's can be converted to doubles with no loss of bits. Hence 676 // converting an integer to a double and back to an integer is a NOP. 677 Node *ConvD2INode::Identity(PhaseTransform *phase) { 678 return (in(1)->Opcode() == Op_ConvI2D) ? in(1)->in(1) : this; 679 } 680 681 //============================================================================= 682 //------------------------------Value------------------------------------------ 683 const Type *ConvD2LNode::Value( PhaseTransform *phase ) const { 684 const Type *t = phase->type( in(1) ); 685 if( t == Type::TOP ) return Type::TOP; 686 if( t == Type::DOUBLE ) return TypeLong::LONG; 687 const TypeD *td = t->is_double_constant(); 688 return TypeLong::make( SharedRuntime::d2l( td->getd() ) ); 689 } 690 691 //------------------------------Identity--------------------------------------- 692 Node *ConvD2LNode::Identity(PhaseTransform *phase) { 693 // Remove ConvD2L->ConvL2D->ConvD2L sequences. 694 if( in(1) ->Opcode() == Op_ConvL2D && 695 in(1)->in(1)->Opcode() == Op_ConvD2L ) 696 return in(1)->in(1); 697 return this; 698 } 699 700 //------------------------------Ideal------------------------------------------ 701 // If converting to an int type, skip any rounding nodes 702 Node *ConvD2LNode::Ideal(PhaseGVN *phase, bool can_reshape) { 703 if( in(1)->Opcode() == Op_RoundDouble ) 704 set_req(1,in(1)->in(1)); 705 return NULL; 706 } 707 708 //============================================================================= 709 //------------------------------Value------------------------------------------ 710 const Type *ConvF2DNode::Value( PhaseTransform *phase ) const { 711 const Type *t = phase->type( in(1) ); 712 if( t == Type::TOP ) return Type::TOP; 713 if( t == Type::FLOAT ) return Type::DOUBLE; 714 const TypeF *tf = t->is_float_constant(); 715 #ifndef IA64 716 return TypeD::make( (double)tf->getf() ); 717 #else 718 float x = tf->getf(); 719 return TypeD::make( (x == 0.0f) ? (double)x : (double)x + ia64_double_zero ); 720 #endif 721 } 722 723 //============================================================================= 724 //------------------------------Value------------------------------------------ 725 const Type *ConvF2INode::Value( PhaseTransform *phase ) const { 726 const Type *t = phase->type( in(1) ); 727 if( t == Type::TOP ) return Type::TOP; 728 if( t == Type::FLOAT ) return TypeInt::INT; 729 const TypeF *tf = t->is_float_constant(); 730 return TypeInt::make( SharedRuntime::f2i( tf->getf() ) ); 731 } 732 733 //------------------------------Identity--------------------------------------- 734 Node *ConvF2INode::Identity(PhaseTransform *phase) { 735 // Remove ConvF2I->ConvI2F->ConvF2I sequences. 736 if( in(1) ->Opcode() == Op_ConvI2F && 737 in(1)->in(1)->Opcode() == Op_ConvF2I ) 738 return in(1)->in(1); 739 return this; 740 } 741 742 //------------------------------Ideal------------------------------------------ 743 // If converting to an int type, skip any rounding nodes 744 Node *ConvF2INode::Ideal(PhaseGVN *phase, bool can_reshape) { 745 if( in(1)->Opcode() == Op_RoundFloat ) 746 set_req(1,in(1)->in(1)); 747 return NULL; 748 } 749 750 //============================================================================= 751 //------------------------------Value------------------------------------------ 752 const Type *ConvF2LNode::Value( PhaseTransform *phase ) const { 753 const Type *t = phase->type( in(1) ); 754 if( t == Type::TOP ) return Type::TOP; 755 if( t == Type::FLOAT ) return TypeLong::LONG; 756 const TypeF *tf = t->is_float_constant(); 757 return TypeLong::make( SharedRuntime::f2l( tf->getf() ) ); 758 } 759 760 //------------------------------Identity--------------------------------------- 761 Node *ConvF2LNode::Identity(PhaseTransform *phase) { 762 // Remove ConvF2L->ConvL2F->ConvF2L sequences. 763 if( in(1) ->Opcode() == Op_ConvL2F && 764 in(1)->in(1)->Opcode() == Op_ConvF2L ) 765 return in(1)->in(1); 766 return this; 767 } 768 769 //------------------------------Ideal------------------------------------------ 770 // If converting to an int type, skip any rounding nodes 771 Node *ConvF2LNode::Ideal(PhaseGVN *phase, bool can_reshape) { 772 if( in(1)->Opcode() == Op_RoundFloat ) 773 set_req(1,in(1)->in(1)); 774 return NULL; 775 } 776 777 //============================================================================= 778 //------------------------------Value------------------------------------------ 779 const Type *ConvI2DNode::Value( PhaseTransform *phase ) const { 780 const Type *t = phase->type( in(1) ); 781 if( t == Type::TOP ) return Type::TOP; 782 const TypeInt *ti = t->is_int(); 783 if( ti->is_con() ) return TypeD::make( (double)ti->get_con() ); 784 return bottom_type(); 785 } 786 787 //============================================================================= 788 //------------------------------Value------------------------------------------ 789 const Type *ConvI2FNode::Value( PhaseTransform *phase ) const { 790 const Type *t = phase->type( in(1) ); 791 if( t == Type::TOP ) return Type::TOP; 792 const TypeInt *ti = t->is_int(); 793 if( ti->is_con() ) return TypeF::make( (float)ti->get_con() ); 794 return bottom_type(); 795 } 796 797 //------------------------------Identity--------------------------------------- 798 Node *ConvI2FNode::Identity(PhaseTransform *phase) { 799 // Remove ConvI2F->ConvF2I->ConvI2F sequences. 800 if( in(1) ->Opcode() == Op_ConvF2I && 801 in(1)->in(1)->Opcode() == Op_ConvI2F ) 802 return in(1)->in(1); 803 return this; 804 } 805 806 //============================================================================= 807 //------------------------------Value------------------------------------------ 808 const Type *ConvI2LNode::Value( PhaseTransform *phase ) const { 809 const Type *t = phase->type( in(1) ); 810 if( t == Type::TOP ) return Type::TOP; 811 const TypeInt *ti = t->is_int(); 812 const Type* tl = TypeLong::make(ti->_lo, ti->_hi, ti->_widen); 813 // Join my declared type against my incoming type. 814 tl = tl->filter(_type); 815 return tl; 816 } 817 818 #ifdef _LP64 819 static inline bool long_ranges_overlap(jlong lo1, jlong hi1, 820 jlong lo2, jlong hi2) { 821 // Two ranges overlap iff one range's low point falls in the other range. 822 return (lo2 <= lo1 && lo1 <= hi2) || (lo1 <= lo2 && lo2 <= hi1); 823 } 824 #endif 825 826 //------------------------------Ideal------------------------------------------ 827 Node *ConvI2LNode::Ideal(PhaseGVN *phase, bool can_reshape) { 828 const TypeLong* this_type = this->type()->is_long(); 829 Node* this_changed = NULL; 830 831 // If _major_progress, then more loop optimizations follow. Do NOT 832 // remove this node's type assertion until no more loop ops can happen. 833 // The progress bit is set in the major loop optimizations THEN comes the 834 // call to IterGVN and any chance of hitting this code. Cf. Opaque1Node. 835 if (can_reshape && !phase->C->major_progress()) { 836 const TypeInt* in_type = phase->type(in(1))->isa_int(); 837 if (in_type != NULL && this_type != NULL && 838 (in_type->_lo != this_type->_lo || 839 in_type->_hi != this_type->_hi)) { 840 // Although this WORSENS the type, it increases GVN opportunities, 841 // because I2L nodes with the same input will common up, regardless 842 // of slightly differing type assertions. Such slight differences 843 // arise routinely as a result of loop unrolling, so this is a 844 // post-unrolling graph cleanup. Choose a type which depends only 845 // on my input. (Exception: Keep a range assertion of >=0 or <0.) 846 jlong lo1 = this_type->_lo; 847 jlong hi1 = this_type->_hi; 848 int w1 = this_type->_widen; 849 if (lo1 != (jint)lo1 || 850 hi1 != (jint)hi1 || 851 lo1 > hi1) { 852 // Overflow leads to wraparound, wraparound leads to range saturation. 853 lo1 = min_jint; hi1 = max_jint; 854 } else if (lo1 >= 0) { 855 // Keep a range assertion of >=0. 856 lo1 = 0; hi1 = max_jint; 857 } else if (hi1 < 0) { 858 // Keep a range assertion of <0. 859 lo1 = min_jint; hi1 = -1; 860 } else { 861 lo1 = min_jint; hi1 = max_jint; 862 } 863 const TypeLong* wtype = TypeLong::make(MAX2((jlong)in_type->_lo, lo1), 864 MIN2((jlong)in_type->_hi, hi1), 865 MAX2((int)in_type->_widen, w1)); 866 if (wtype != type()) { 867 set_type(wtype); 868 // Note: this_type still has old type value, for the logic below. 869 this_changed = this; 870 } 871 } 872 } 873 874 #ifdef _LP64 875 // Convert ConvI2L(AddI(x, y)) to AddL(ConvI2L(x), ConvI2L(y)) , 876 // but only if x and y have subranges that cannot cause 32-bit overflow, 877 // under the assumption that x+y is in my own subrange this->type(). 878 879 // This assumption is based on a constraint (i.e., type assertion) 880 // established in Parse::array_addressing or perhaps elsewhere. 881 // This constraint has been adjoined to the "natural" type of 882 // the incoming argument in(0). We know (because of runtime 883 // checks) - that the result value I2L(x+y) is in the joined range. 884 // Hence we can restrict the incoming terms (x, y) to values such 885 // that their sum also lands in that range. 886 887 // This optimization is useful only on 64-bit systems, where we hope 888 // the addition will end up subsumed in an addressing mode. 889 // It is necessary to do this when optimizing an unrolled array 890 // copy loop such as x[i++] = y[i++]. 891 892 // On 32-bit systems, it's better to perform as much 32-bit math as 893 // possible before the I2L conversion, because 32-bit math is cheaper. 894 // There's no common reason to "leak" a constant offset through the I2L. 895 // Addressing arithmetic will not absorb it as part of a 64-bit AddL. 896 897 Node* z = in(1); 898 int op = z->Opcode(); 899 if (op == Op_AddI || op == Op_SubI) { 900 Node* x = z->in(1); 901 Node* y = z->in(2); 902 assert (x != z && y != z, "dead loop in ConvI2LNode::Ideal"); 903 if (phase->type(x) == Type::TOP) return this_changed; 904 if (phase->type(y) == Type::TOP) return this_changed; 905 const TypeInt* tx = phase->type(x)->is_int(); 906 const TypeInt* ty = phase->type(y)->is_int(); 907 const TypeLong* tz = this_type; 908 jlong xlo = tx->_lo; 909 jlong xhi = tx->_hi; 910 jlong ylo = ty->_lo; 911 jlong yhi = ty->_hi; 912 jlong zlo = tz->_lo; 913 jlong zhi = tz->_hi; 914 jlong vbit = CONST64(1) << BitsPerInt; 915 int widen = MAX2(tx->_widen, ty->_widen); 916 if (op == Op_SubI) { 917 jlong ylo0 = ylo; 918 ylo = -yhi; 919 yhi = -ylo0; 920 } 921 // See if x+y can cause positive overflow into z+2**32 922 if (long_ranges_overlap(xlo+ylo, xhi+yhi, zlo+vbit, zhi+vbit)) { 923 return this_changed; 924 } 925 // See if x+y can cause negative overflow into z-2**32 926 if (long_ranges_overlap(xlo+ylo, xhi+yhi, zlo-vbit, zhi-vbit)) { 927 return this_changed; 928 } 929 // Now it's always safe to assume x+y does not overflow. 930 // This is true even if some pairs x,y might cause overflow, as long 931 // as that overflow value cannot fall into [zlo,zhi]. 932 933 // Confident that the arithmetic is "as if infinite precision", 934 // we can now use z's range to put constraints on those of x and y. 935 // The "natural" range of x [xlo,xhi] can perhaps be narrowed to a 936 // more "restricted" range by intersecting [xlo,xhi] with the 937 // range obtained by subtracting y's range from the asserted range 938 // of the I2L conversion. Here's the interval arithmetic algebra: 939 // x == z-y == [zlo,zhi]-[ylo,yhi] == [zlo,zhi]+[-yhi,-ylo] 940 // => x in [zlo-yhi, zhi-ylo] 941 // => x in [zlo-yhi, zhi-ylo] INTERSECT [xlo,xhi] 942 // => x in [xlo MAX zlo-yhi, xhi MIN zhi-ylo] 943 jlong rxlo = MAX2(xlo, zlo - yhi); 944 jlong rxhi = MIN2(xhi, zhi - ylo); 945 // And similarly, x changing place with y: 946 jlong rylo = MAX2(ylo, zlo - xhi); 947 jlong ryhi = MIN2(yhi, zhi - xlo); 948 if (rxlo > rxhi || rylo > ryhi) { 949 return this_changed; // x or y is dying; don't mess w/ it 950 } 951 if (op == Op_SubI) { 952 jlong rylo0 = rylo; 953 rylo = -ryhi; 954 ryhi = -rylo0; 955 } 956 957 Node* cx = phase->transform( new (phase->C, 2) ConvI2LNode(x, TypeLong::make(rxlo, rxhi, widen)) ); 958 Node* cy = phase->transform( new (phase->C, 2) ConvI2LNode(y, TypeLong::make(rylo, ryhi, widen)) ); 959 switch (op) { 960 case Op_AddI: return new (phase->C, 3) AddLNode(cx, cy); 961 case Op_SubI: return new (phase->C, 3) SubLNode(cx, cy); 962 default: ShouldNotReachHere(); 963 } 964 } 965 #endif //_LP64 966 967 return this_changed; 968 } 969 970 //============================================================================= 971 //------------------------------Value------------------------------------------ 972 const Type *ConvL2DNode::Value( PhaseTransform *phase ) const { 973 const Type *t = phase->type( in(1) ); 974 if( t == Type::TOP ) return Type::TOP; 975 const TypeLong *tl = t->is_long(); 976 if( tl->is_con() ) return TypeD::make( (double)tl->get_con() ); 977 return bottom_type(); 978 } 979 980 //============================================================================= 981 //------------------------------Value------------------------------------------ 982 const Type *ConvL2FNode::Value( PhaseTransform *phase ) const { 983 const Type *t = phase->type( in(1) ); 984 if( t == Type::TOP ) return Type::TOP; 985 const TypeLong *tl = t->is_long(); 986 if( tl->is_con() ) return TypeF::make( (float)tl->get_con() ); 987 return bottom_type(); 988 } 989 990 //============================================================================= 991 //----------------------------Identity----------------------------------------- 992 Node *ConvL2INode::Identity( PhaseTransform *phase ) { 993 // Convert L2I(I2L(x)) => x 994 if (in(1)->Opcode() == Op_ConvI2L) return in(1)->in(1); 995 return this; 996 } 997 998 //------------------------------Value------------------------------------------ 999 const Type *ConvL2INode::Value( PhaseTransform *phase ) const { 1000 const Type *t = phase->type( in(1) ); 1001 if( t == Type::TOP ) return Type::TOP; 1002 const TypeLong *tl = t->is_long(); 1003 if (tl->is_con()) 1004 // Easy case. 1005 return TypeInt::make((jint)tl->get_con()); 1006 return bottom_type(); 1007 } 1008 1009 //------------------------------Ideal------------------------------------------ 1010 // Return a node which is more "ideal" than the current node. 1011 // Blow off prior masking to int 1012 Node *ConvL2INode::Ideal(PhaseGVN *phase, bool can_reshape) { 1013 Node *andl = in(1); 1014 uint andl_op = andl->Opcode(); 1015 if( andl_op == Op_AndL ) { 1016 // Blow off prior masking to int 1017 if( phase->type(andl->in(2)) == TypeLong::make( 0xFFFFFFFF ) ) { 1018 set_req(1,andl->in(1)); 1019 return this; 1020 } 1021 } 1022 1023 // Swap with a prior add: convL2I(addL(x,y)) ==> addI(convL2I(x),convL2I(y)) 1024 // This replaces an 'AddL' with an 'AddI'. 1025 if( andl_op == Op_AddL ) { 1026 // Don't do this for nodes which have more than one user since 1027 // we'll end up computing the long add anyway. 1028 if (andl->outcnt() > 1) return NULL; 1029 1030 Node* x = andl->in(1); 1031 Node* y = andl->in(2); 1032 assert( x != andl && y != andl, "dead loop in ConvL2INode::Ideal" ); 1033 if (phase->type(x) == Type::TOP) return NULL; 1034 if (phase->type(y) == Type::TOP) return NULL; 1035 Node *add1 = phase->transform(new (phase->C, 2) ConvL2INode(x)); 1036 Node *add2 = phase->transform(new (phase->C, 2) ConvL2INode(y)); 1037 return new (phase->C, 3) AddINode(add1,add2); 1038 } 1039 1040 // Disable optimization: LoadL->ConvL2I ==> LoadI. 1041 // It causes problems (sizes of Load and Store nodes do not match) 1042 // in objects initialization code and Escape Analysis. 1043 return NULL; 1044 } 1045 1046 //============================================================================= 1047 //------------------------------Value------------------------------------------ 1048 const Type *CastX2PNode::Value( PhaseTransform *phase ) const { 1049 const Type* t = phase->type(in(1)); 1050 if (t->base() == Type_X && t->singleton()) { 1051 uintptr_t bits = (uintptr_t) t->is_intptr_t()->get_con(); 1052 if (bits == 0) return TypePtr::NULL_PTR; 1053 return TypeRawPtr::make((address) bits); 1054 } 1055 return CastX2PNode::bottom_type(); 1056 } 1057 1058 //------------------------------Idealize--------------------------------------- 1059 static inline bool fits_in_int(const Type* t, bool but_not_min_int = false) { 1060 if (t == Type::TOP) return false; 1061 const TypeX* tl = t->is_intptr_t(); 1062 jint lo = min_jint; 1063 jint hi = max_jint; 1064 if (but_not_min_int) ++lo; // caller wants to negate the value w/o overflow 1065 return (tl->_lo >= lo) && (tl->_hi <= hi); 1066 } 1067 1068 static inline Node* addP_of_X2P(PhaseGVN *phase, 1069 Node* base, 1070 Node* dispX, 1071 bool negate = false) { 1072 if (negate) { 1073 dispX = new (phase->C, 3) SubXNode(phase->MakeConX(0), phase->transform(dispX)); 1074 } 1075 return new (phase->C, 4) AddPNode(phase->C->top(), 1076 phase->transform(new (phase->C, 2) CastX2PNode(base)), 1077 phase->transform(dispX)); 1078 } 1079 1080 Node *CastX2PNode::Ideal(PhaseGVN *phase, bool can_reshape) { 1081 // convert CastX2P(AddX(x, y)) to AddP(CastX2P(x), y) if y fits in an int 1082 int op = in(1)->Opcode(); 1083 Node* x; 1084 Node* y; 1085 switch (op) { 1086 case Op_SubX: 1087 x = in(1)->in(1); 1088 // Avoid ideal transformations ping-pong between this and AddP for raw pointers. 1089 if (phase->find_intptr_t_con(x, -1) == 0) 1090 break; 1091 y = in(1)->in(2); 1092 if (fits_in_int(phase->type(y), true)) { 1093 return addP_of_X2P(phase, x, y, true); 1094 } 1095 break; 1096 case Op_AddX: 1097 x = in(1)->in(1); 1098 y = in(1)->in(2); 1099 if (fits_in_int(phase->type(y))) { 1100 return addP_of_X2P(phase, x, y); 1101 } 1102 if (fits_in_int(phase->type(x))) { 1103 return addP_of_X2P(phase, y, x); 1104 } 1105 break; 1106 } 1107 return NULL; 1108 } 1109 1110 //------------------------------Identity--------------------------------------- 1111 Node *CastX2PNode::Identity( PhaseTransform *phase ) { 1112 if (in(1)->Opcode() == Op_CastP2X) return in(1)->in(1); 1113 return this; 1114 } 1115 1116 //============================================================================= 1117 //------------------------------Value------------------------------------------ 1118 const Type *CastP2XNode::Value( PhaseTransform *phase ) const { 1119 const Type* t = phase->type(in(1)); 1120 if (t->base() == Type::RawPtr && t->singleton()) { 1121 uintptr_t bits = (uintptr_t) t->is_rawptr()->get_con(); 1122 return TypeX::make(bits); 1123 } 1124 return CastP2XNode::bottom_type(); 1125 } 1126 1127 Node *CastP2XNode::Ideal(PhaseGVN *phase, bool can_reshape) { 1128 return (in(0) && remove_dead_region(phase, can_reshape)) ? this : NULL; 1129 } 1130 1131 //------------------------------Identity--------------------------------------- 1132 Node *CastP2XNode::Identity( PhaseTransform *phase ) { 1133 if (in(1)->Opcode() == Op_CastX2P) return in(1)->in(1); 1134 return this; 1135 } 1136 1137 1138 //============================================================================= 1139 //------------------------------Identity--------------------------------------- 1140 // Remove redundant roundings 1141 Node *RoundFloatNode::Identity( PhaseTransform *phase ) { 1142 assert(Matcher::strict_fp_requires_explicit_rounding, "should only generate for Intel"); 1143 // Do not round constants 1144 if (phase->type(in(1))->base() == Type::FloatCon) return in(1); 1145 int op = in(1)->Opcode(); 1146 // Redundant rounding 1147 if( op == Op_RoundFloat ) return in(1); 1148 // Already rounded 1149 if( op == Op_Parm ) return in(1); 1150 if( op == Op_LoadF ) return in(1); 1151 return this; 1152 } 1153 1154 //------------------------------Value------------------------------------------ 1155 const Type *RoundFloatNode::Value( PhaseTransform *phase ) const { 1156 return phase->type( in(1) ); 1157 } 1158 1159 //============================================================================= 1160 //------------------------------Identity--------------------------------------- 1161 // Remove redundant roundings. Incoming arguments are already rounded. 1162 Node *RoundDoubleNode::Identity( PhaseTransform *phase ) { 1163 assert(Matcher::strict_fp_requires_explicit_rounding, "should only generate for Intel"); 1164 // Do not round constants 1165 if (phase->type(in(1))->base() == Type::DoubleCon) return in(1); 1166 int op = in(1)->Opcode(); 1167 // Redundant rounding 1168 if( op == Op_RoundDouble ) return in(1); 1169 // Already rounded 1170 if( op == Op_Parm ) return in(1); 1171 if( op == Op_LoadD ) return in(1); 1172 if( op == Op_ConvF2D ) return in(1); 1173 if( op == Op_ConvI2D ) return in(1); 1174 return this; 1175 } 1176 1177 //------------------------------Value------------------------------------------ 1178 const Type *RoundDoubleNode::Value( PhaseTransform *phase ) const { 1179 return phase->type( in(1) ); 1180 } 1181 1182 1183 //============================================================================= 1184 // Do not allow value-numbering 1185 uint Opaque1Node::hash() const { return NO_HASH; } 1186 uint Opaque1Node::cmp( const Node &n ) const { 1187 return (&n == this); // Always fail except on self 1188 } 1189 1190 //------------------------------Identity--------------------------------------- 1191 // If _major_progress, then more loop optimizations follow. Do NOT remove 1192 // the opaque Node until no more loop ops can happen. Note the timing of 1193 // _major_progress; it's set in the major loop optimizations THEN comes the 1194 // call to IterGVN and any chance of hitting this code. Hence there's no 1195 // phase-ordering problem with stripping Opaque1 in IGVN followed by some 1196 // more loop optimizations that require it. 1197 Node *Opaque1Node::Identity( PhaseTransform *phase ) { 1198 return phase->C->major_progress() ? this : in(1); 1199 } 1200 1201 //============================================================================= 1202 // A node to prevent unwanted optimizations. Allows constant folding. Stops 1203 // value-numbering, most Ideal calls or Identity functions. This Node is 1204 // specifically designed to prevent the pre-increment value of a loop trip 1205 // counter from being live out of the bottom of the loop (hence causing the 1206 // pre- and post-increment values both being live and thus requiring an extra 1207 // temp register and an extra move). If we "accidentally" optimize through 1208 // this kind of a Node, we'll get slightly pessimal, but correct, code. Thus 1209 // it's OK to be slightly sloppy on optimizations here. 1210 1211 // Do not allow value-numbering 1212 uint Opaque2Node::hash() const { return NO_HASH; } 1213 uint Opaque2Node::cmp( const Node &n ) const { 1214 return (&n == this); // Always fail except on self 1215 } 1216 1217 1218 //------------------------------Value------------------------------------------ 1219 const Type *MoveL2DNode::Value( PhaseTransform *phase ) const { 1220 const Type *t = phase->type( in(1) ); 1221 if( t == Type::TOP ) return Type::TOP; 1222 const TypeLong *tl = t->is_long(); 1223 if( !tl->is_con() ) return bottom_type(); 1224 JavaValue v; 1225 v.set_jlong(tl->get_con()); 1226 return TypeD::make( v.get_jdouble() ); 1227 } 1228 1229 //------------------------------Value------------------------------------------ 1230 const Type *MoveI2FNode::Value( PhaseTransform *phase ) const { 1231 const Type *t = phase->type( in(1) ); 1232 if( t == Type::TOP ) return Type::TOP; 1233 const TypeInt *ti = t->is_int(); 1234 if( !ti->is_con() ) return bottom_type(); 1235 JavaValue v; 1236 v.set_jint(ti->get_con()); 1237 return TypeF::make( v.get_jfloat() ); 1238 } 1239 1240 //------------------------------Value------------------------------------------ 1241 const Type *MoveF2INode::Value( PhaseTransform *phase ) const { 1242 const Type *t = phase->type( in(1) ); 1243 if( t == Type::TOP ) return Type::TOP; 1244 if( t == Type::FLOAT ) return TypeInt::INT; 1245 const TypeF *tf = t->is_float_constant(); 1246 JavaValue v; 1247 v.set_jfloat(tf->getf()); 1248 return TypeInt::make( v.get_jint() ); 1249 } 1250 1251 //------------------------------Value------------------------------------------ 1252 const Type *MoveD2LNode::Value( PhaseTransform *phase ) const { 1253 const Type *t = phase->type( in(1) ); 1254 if( t == Type::TOP ) return Type::TOP; 1255 if( t == Type::DOUBLE ) return TypeLong::LONG; 1256 const TypeD *td = t->is_double_constant(); 1257 JavaValue v; 1258 v.set_jdouble(td->getd()); 1259 return TypeLong::make( v.get_jlong() ); 1260 } 1261 1262 //------------------------------Value------------------------------------------ 1263 const Type* CountLeadingZerosINode::Value(PhaseTransform* phase) const { 1264 const Type* t = phase->type(in(1)); 1265 if (t == Type::TOP) return Type::TOP; 1266 const TypeInt* ti = t->isa_int(); 1267 if (ti && ti->is_con()) { 1268 jint i = ti->get_con(); 1269 // HD, Figure 5-6 1270 if (i == 0) 1271 return TypeInt::make(BitsPerInt); 1272 int n = 1; 1273 unsigned int x = i; 1274 if (x >> 16 == 0) { n += 16; x <<= 16; } 1275 if (x >> 24 == 0) { n += 8; x <<= 8; } 1276 if (x >> 28 == 0) { n += 4; x <<= 4; } 1277 if (x >> 30 == 0) { n += 2; x <<= 2; } 1278 n -= x >> 31; 1279 return TypeInt::make(n); 1280 } 1281 return TypeInt::INT; 1282 } 1283 1284 //------------------------------Value------------------------------------------ 1285 const Type* CountLeadingZerosLNode::Value(PhaseTransform* phase) const { 1286 const Type* t = phase->type(in(1)); 1287 if (t == Type::TOP) return Type::TOP; 1288 const TypeLong* tl = t->isa_long(); 1289 if (tl && tl->is_con()) { 1290 jlong l = tl->get_con(); 1291 // HD, Figure 5-6 1292 if (l == 0) 1293 return TypeInt::make(BitsPerLong); 1294 int n = 1; 1295 unsigned int x = (((julong) l) >> 32); 1296 if (x == 0) { n += 32; x = (int) l; } 1297 if (x >> 16 == 0) { n += 16; x <<= 16; } 1298 if (x >> 24 == 0) { n += 8; x <<= 8; } 1299 if (x >> 28 == 0) { n += 4; x <<= 4; } 1300 if (x >> 30 == 0) { n += 2; x <<= 2; } 1301 n -= x >> 31; 1302 return TypeInt::make(n); 1303 } 1304 return TypeInt::INT; 1305 } 1306 1307 //------------------------------Value------------------------------------------ 1308 const Type* CountTrailingZerosINode::Value(PhaseTransform* phase) const { 1309 const Type* t = phase->type(in(1)); 1310 if (t == Type::TOP) return Type::TOP; 1311 const TypeInt* ti = t->isa_int(); 1312 if (ti && ti->is_con()) { 1313 jint i = ti->get_con(); 1314 // HD, Figure 5-14 1315 int y; 1316 if (i == 0) 1317 return TypeInt::make(BitsPerInt); 1318 int n = 31; 1319 y = i << 16; if (y != 0) { n = n - 16; i = y; } 1320 y = i << 8; if (y != 0) { n = n - 8; i = y; } 1321 y = i << 4; if (y != 0) { n = n - 4; i = y; } 1322 y = i << 2; if (y != 0) { n = n - 2; i = y; } 1323 y = i << 1; if (y != 0) { n = n - 1; } 1324 return TypeInt::make(n); 1325 } 1326 return TypeInt::INT; 1327 } 1328 1329 //------------------------------Value------------------------------------------ 1330 const Type* CountTrailingZerosLNode::Value(PhaseTransform* phase) const { 1331 const Type* t = phase->type(in(1)); 1332 if (t == Type::TOP) return Type::TOP; 1333 const TypeLong* tl = t->isa_long(); 1334 if (tl && tl->is_con()) { 1335 jlong l = tl->get_con(); 1336 // HD, Figure 5-14 1337 int x, y; 1338 if (l == 0) 1339 return TypeInt::make(BitsPerLong); 1340 int n = 63; 1341 y = (int) l; if (y != 0) { n = n - 32; x = y; } else x = (((julong) l) >> 32); 1342 y = x << 16; if (y != 0) { n = n - 16; x = y; } 1343 y = x << 8; if (y != 0) { n = n - 8; x = y; } 1344 y = x << 4; if (y != 0) { n = n - 4; x = y; } 1345 y = x << 2; if (y != 0) { n = n - 2; x = y; } 1346 y = x << 1; if (y != 0) { n = n - 1; } 1347 return TypeInt::make(n); 1348 } 1349 return TypeInt::INT; 1350 }