src/share/vm/opto/connode.cpp

Mon, 01 Dec 2014 22:27:00 +0100

author
roland
date
Mon, 01 Dec 2014 22:27:00 +0100
changeset 7394
5b8e0f84f00f
parent 6313
de95063c0e34
child 7422
d9e22e15d3f6
permissions
-rw-r--r--

8054478: C2: Incorrectly compiled char[] array access crashes JVM
Summary: dead backbranch in main loop results in erroneous array access
Reviewed-by: kvn, iveresov

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

mercurial