461 // If input is already higher or equal to cast type, then this is an identity. |
461 // If input is already higher or equal to cast type, then this is an identity. |
462 Node *CheckCastPPNode::Identity( PhaseTransform *phase ) { |
462 Node *CheckCastPPNode::Identity( PhaseTransform *phase ) { |
463 // Toned down to rescue meeting at a Phi 3 different oops all implementing |
463 // Toned down to rescue meeting at a Phi 3 different oops all implementing |
464 // the same interface. CompileTheWorld starting at 502, kd12rc1.zip. |
464 // the same interface. CompileTheWorld starting at 502, kd12rc1.zip. |
465 return (phase->type(in(1)) == phase->type(this)) ? in(1) : this; |
465 return (phase->type(in(1)) == phase->type(this)) ? in(1) : this; |
466 } |
|
467 |
|
468 // Determine whether "n" is a node which can cause an alias of one of its inputs. Node types |
|
469 // which can create aliases are: CheckCastPP, Phi, and any store (if there is also a load from |
|
470 // the location.) |
|
471 // Note: this checks for aliases created in this compilation, not ones which may |
|
472 // be potentially created at call sites. |
|
473 static bool can_cause_alias(Node *n, PhaseTransform *phase) { |
|
474 bool possible_alias = false; |
|
475 |
|
476 if (n->is_Store()) { |
|
477 possible_alias = !n->as_Store()->value_never_loaded(phase); |
|
478 } else { |
|
479 int opc = n->Opcode(); |
|
480 possible_alias = n->is_Phi() || |
|
481 opc == Op_CheckCastPP || |
|
482 opc == Op_StorePConditional || |
|
483 opc == Op_CompareAndSwapP || |
|
484 opc == Op_CompareAndSwapN || |
|
485 opc == Op_GetAndSetP || |
|
486 opc == Op_GetAndSetN; |
|
487 } |
|
488 return possible_alias; |
|
489 } |
466 } |
490 |
467 |
491 //------------------------------Value------------------------------------------ |
468 //------------------------------Value------------------------------------------ |
492 // Take 'join' of input and cast-up type, unless working with an Interface |
469 // Take 'join' of input and cast-up type, unless working with an Interface |
493 const Type *CheckCastPPNode::Value( PhaseTransform *phase ) const { |
470 const Type *CheckCastPPNode::Value( PhaseTransform *phase ) const { |