src/share/vm/opto/connode.cpp

Sat, 01 Dec 2007 00:00:00 +0000

author
duke
date
Sat, 01 Dec 2007 00:00:00 +0000
changeset 435
a61af66fc99e
child 471
f34d9da7acb2
permissions
-rw-r--r--

Initial load

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

mercurial