Wed, 24 Apr 2013 20:55:28 -0400
8003853: specify offset of IC load in java_to_interp stub
Summary: refactored code to allow platform-specific differences
Reviewed-by: dlong, twisti
Contributed-by: Goetz Lindenmaier <goetz.lindenmaier@sap.com>
1 /*
2 * Copyright (c) 1997, 2012, 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(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(_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(_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(_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 }
445 //=============================================================================
447 //------------------------------Ideal_DU_postCCP-------------------------------
448 // If not converting int->oop, throw away cast after constant propagation
449 Node *CastPPNode::Ideal_DU_postCCP( PhaseCCP *ccp ) {
450 const Type *t = ccp->type(in(1));
451 if (!t->isa_oop_ptr() || ((in(1)->is_DecodeN()) && Matcher::gen_narrow_oop_implicit_null_checks())) {
452 return NULL; // do not transform raw pointers or narrow oops
453 }
454 return ConstraintCastNode::Ideal_DU_postCCP(ccp);
455 }
459 //=============================================================================
460 //------------------------------Identity---------------------------------------
461 // If input is already higher or equal to cast type, then this is an identity.
462 Node *CheckCastPPNode::Identity( PhaseTransform *phase ) {
463 // Toned down to rescue meeting at a Phi 3 different oops all implementing
464 // the same interface. CompileTheWorld starting at 502, kd12rc1.zip.
465 return (phase->type(in(1)) == phase->type(this)) ? in(1) : this;
466 }
468 // Determine whether "n" is a node which can cause an alias of one of its inputs. Node types
469 // which can create aliases are: CheckCastPP, Phi, and any store (if there is also a load from
470 // the location.)
471 // Note: this checks for aliases created in this compilation, not ones which may
472 // be potentially created at call sites.
473 static bool can_cause_alias(Node *n, PhaseTransform *phase) {
474 bool possible_alias = false;
476 if (n->is_Store()) {
477 possible_alias = !n->as_Store()->value_never_loaded(phase);
478 } else {
479 int opc = n->Opcode();
480 possible_alias = n->is_Phi() ||
481 opc == Op_CheckCastPP ||
482 opc == Op_StorePConditional ||
483 opc == Op_CompareAndSwapP ||
484 opc == Op_CompareAndSwapN ||
485 opc == Op_GetAndSetP ||
486 opc == Op_GetAndSetN;
487 }
488 return possible_alias;
489 }
491 //------------------------------Value------------------------------------------
492 // Take 'join' of input and cast-up type, unless working with an Interface
493 const Type *CheckCastPPNode::Value( PhaseTransform *phase ) const {
494 if( in(0) && phase->type(in(0)) == Type::TOP ) return Type::TOP;
496 const Type *inn = phase->type(in(1));
497 if( inn == Type::TOP ) return Type::TOP; // No information yet
499 const TypePtr *in_type = inn->isa_ptr();
500 const TypePtr *my_type = _type->isa_ptr();
501 const Type *result = _type;
502 if( in_type != NULL && my_type != NULL ) {
503 TypePtr::PTR in_ptr = in_type->ptr();
504 if( in_ptr == TypePtr::Null ) {
505 result = in_type;
506 } else if( in_ptr == TypePtr::Constant ) {
507 // Casting a constant oop to an interface?
508 // (i.e., a String to a Comparable?)
509 // Then return the interface.
510 const TypeOopPtr *jptr = my_type->isa_oopptr();
511 assert( jptr, "" );
512 result = (jptr->klass()->is_interface() || !in_type->higher_equal(_type))
513 ? my_type->cast_to_ptr_type( TypePtr::NotNull )
514 : in_type;
515 } else {
516 result = my_type->cast_to_ptr_type( my_type->join_ptr(in_ptr) );
517 }
518 }
519 return result;
521 // JOIN NOT DONE HERE BECAUSE OF INTERFACE ISSUES.
522 // FIX THIS (DO THE JOIN) WHEN UNION TYPES APPEAR!
524 //
525 // Remove this code after overnight run indicates no performance
526 // loss from not performing JOIN at CheckCastPPNode
527 //
528 // const TypeInstPtr *in_oop = in->isa_instptr();
529 // const TypeInstPtr *my_oop = _type->isa_instptr();
530 // // If either input is an 'interface', return destination type
531 // assert (in_oop == NULL || in_oop->klass() != NULL, "");
532 // assert (my_oop == NULL || my_oop->klass() != NULL, "");
533 // if( (in_oop && in_oop->klass()->is_interface())
534 // ||(my_oop && my_oop->klass()->is_interface()) ) {
535 // TypePtr::PTR in_ptr = in->isa_ptr() ? in->is_ptr()->_ptr : TypePtr::BotPTR;
536 // // Preserve cast away nullness for interfaces
537 // if( in_ptr == TypePtr::NotNull && my_oop && my_oop->_ptr == TypePtr::BotPTR ) {
538 // return my_oop->cast_to_ptr_type(TypePtr::NotNull);
539 // }
540 // return _type;
541 // }
542 //
543 // // Neither the input nor the destination type is an interface,
544 //
545 // // history: JOIN used to cause weird corner case bugs
546 // // return (in == TypeOopPtr::NULL_PTR) ? in : _type;
547 // // JOIN picks up NotNull in common instance-of/check-cast idioms, both oops.
548 // // JOIN does not preserve NotNull in other cases, e.g. RawPtr vs InstPtr
549 // const Type *join = in->join(_type);
550 // // Check if join preserved NotNull'ness for pointers
551 // if( join->isa_ptr() && _type->isa_ptr() ) {
552 // TypePtr::PTR join_ptr = join->is_ptr()->_ptr;
553 // TypePtr::PTR type_ptr = _type->is_ptr()->_ptr;
554 // // If there isn't any NotNull'ness to preserve
555 // // OR if join preserved NotNull'ness then return it
556 // if( type_ptr == TypePtr::BotPTR || type_ptr == TypePtr::Null ||
557 // join_ptr == TypePtr::NotNull || join_ptr == TypePtr::Constant ) {
558 // return join;
559 // }
560 // // ELSE return same old type as before
561 // return _type;
562 // }
563 // // Not joining two pointers
564 // return join;
565 }
567 //------------------------------Ideal------------------------------------------
568 // Return a node which is more "ideal" than the current node. Strip out
569 // control copies
570 Node *CheckCastPPNode::Ideal(PhaseGVN *phase, bool can_reshape){
571 return (in(0) && remove_dead_region(phase, can_reshape)) ? this : NULL;
572 }
575 Node* DecodeNNode::Identity(PhaseTransform* phase) {
576 const Type *t = phase->type( in(1) );
577 if( t == Type::TOP ) return in(1);
579 if (in(1)->is_EncodeP()) {
580 // (DecodeN (EncodeP p)) -> p
581 return in(1)->in(1);
582 }
583 return this;
584 }
586 const Type *DecodeNNode::Value( PhaseTransform *phase ) const {
587 const Type *t = phase->type( in(1) );
588 if (t == Type::TOP) return Type::TOP;
589 if (t == TypeNarrowOop::NULL_PTR) return TypePtr::NULL_PTR;
591 assert(t->isa_narrowoop(), "only narrowoop here");
592 return t->make_ptr();
593 }
595 Node* EncodePNode::Identity(PhaseTransform* phase) {
596 const Type *t = phase->type( in(1) );
597 if( t == Type::TOP ) return in(1);
599 if (in(1)->is_DecodeN()) {
600 // (EncodeP (DecodeN p)) -> p
601 return in(1)->in(1);
602 }
603 return this;
604 }
606 const Type *EncodePNode::Value( PhaseTransform *phase ) const {
607 const Type *t = phase->type( in(1) );
608 if (t == Type::TOP) return Type::TOP;
609 if (t == TypePtr::NULL_PTR) return TypeNarrowOop::NULL_PTR;
611 assert(t->isa_oop_ptr(), "only oopptr here");
612 return t->make_narrowoop();
613 }
616 Node *EncodeNarrowPtrNode::Ideal_DU_postCCP( PhaseCCP *ccp ) {
617 return MemNode::Ideal_common_DU_postCCP(ccp, this, in(1));
618 }
620 Node* DecodeNKlassNode::Identity(PhaseTransform* phase) {
621 const Type *t = phase->type( in(1) );
622 if( t == Type::TOP ) return in(1);
624 if (in(1)->is_EncodePKlass()) {
625 // (DecodeNKlass (EncodePKlass p)) -> p
626 return in(1)->in(1);
627 }
628 return this;
629 }
631 const Type *DecodeNKlassNode::Value( PhaseTransform *phase ) const {
632 const Type *t = phase->type( in(1) );
633 if (t == Type::TOP) return Type::TOP;
634 assert(t != TypeNarrowKlass::NULL_PTR, "null klass?");
636 assert(t->isa_narrowklass(), "only narrow klass ptr here");
637 return t->make_ptr();
638 }
640 Node* EncodePKlassNode::Identity(PhaseTransform* phase) {
641 const Type *t = phase->type( in(1) );
642 if( t == Type::TOP ) return in(1);
644 if (in(1)->is_DecodeNKlass()) {
645 // (EncodePKlass (DecodeNKlass p)) -> p
646 return in(1)->in(1);
647 }
648 return this;
649 }
651 const Type *EncodePKlassNode::Value( PhaseTransform *phase ) const {
652 const Type *t = phase->type( in(1) );
653 if (t == Type::TOP) return Type::TOP;
654 assert (t != TypePtr::NULL_PTR, "null klass?");
656 assert(UseCompressedKlassPointers && t->isa_klassptr(), "only klass ptr here");
657 return t->make_narrowklass();
658 }
661 //=============================================================================
662 //------------------------------Identity---------------------------------------
663 Node *Conv2BNode::Identity( PhaseTransform *phase ) {
664 const Type *t = phase->type( in(1) );
665 if( t == Type::TOP ) return in(1);
666 if( t == TypeInt::ZERO ) return in(1);
667 if( t == TypeInt::ONE ) return in(1);
668 if( t == TypeInt::BOOL ) return in(1);
669 return this;
670 }
672 //------------------------------Value------------------------------------------
673 const Type *Conv2BNode::Value( PhaseTransform *phase ) const {
674 const Type *t = phase->type( in(1) );
675 if( t == Type::TOP ) return Type::TOP;
676 if( t == TypeInt::ZERO ) return TypeInt::ZERO;
677 if( t == TypePtr::NULL_PTR ) return TypeInt::ZERO;
678 const TypePtr *tp = t->isa_ptr();
679 if( tp != NULL ) {
680 if( tp->ptr() == TypePtr::AnyNull ) return Type::TOP;
681 if( tp->ptr() == TypePtr::Constant) return TypeInt::ONE;
682 if (tp->ptr() == TypePtr::NotNull) return TypeInt::ONE;
683 return TypeInt::BOOL;
684 }
685 if (t->base() != Type::Int) return TypeInt::BOOL;
686 const TypeInt *ti = t->is_int();
687 if( ti->_hi < 0 || ti->_lo > 0 ) return TypeInt::ONE;
688 return TypeInt::BOOL;
689 }
692 // The conversions operations are all Alpha sorted. Please keep it that way!
693 //=============================================================================
694 //------------------------------Value------------------------------------------
695 const Type *ConvD2FNode::Value( PhaseTransform *phase ) const {
696 const Type *t = phase->type( in(1) );
697 if( t == Type::TOP ) return Type::TOP;
698 if( t == Type::DOUBLE ) return Type::FLOAT;
699 const TypeD *td = t->is_double_constant();
700 return TypeF::make( (float)td->getd() );
701 }
703 //------------------------------Identity---------------------------------------
704 // Float's can be converted to doubles with no loss of bits. Hence
705 // converting a float to a double and back to a float is a NOP.
706 Node *ConvD2FNode::Identity(PhaseTransform *phase) {
707 return (in(1)->Opcode() == Op_ConvF2D) ? in(1)->in(1) : this;
708 }
710 //=============================================================================
711 //------------------------------Value------------------------------------------
712 const Type *ConvD2INode::Value( PhaseTransform *phase ) const {
713 const Type *t = phase->type( in(1) );
714 if( t == Type::TOP ) return Type::TOP;
715 if( t == Type::DOUBLE ) return TypeInt::INT;
716 const TypeD *td = t->is_double_constant();
717 return TypeInt::make( SharedRuntime::d2i( td->getd() ) );
718 }
720 //------------------------------Ideal------------------------------------------
721 // If converting to an int type, skip any rounding nodes
722 Node *ConvD2INode::Ideal(PhaseGVN *phase, bool can_reshape) {
723 if( in(1)->Opcode() == Op_RoundDouble )
724 set_req(1,in(1)->in(1));
725 return NULL;
726 }
728 //------------------------------Identity---------------------------------------
729 // Int's can be converted to doubles with no loss of bits. Hence
730 // converting an integer to a double and back to an integer is a NOP.
731 Node *ConvD2INode::Identity(PhaseTransform *phase) {
732 return (in(1)->Opcode() == Op_ConvI2D) ? in(1)->in(1) : this;
733 }
735 //=============================================================================
736 //------------------------------Value------------------------------------------
737 const Type *ConvD2LNode::Value( PhaseTransform *phase ) const {
738 const Type *t = phase->type( in(1) );
739 if( t == Type::TOP ) return Type::TOP;
740 if( t == Type::DOUBLE ) return TypeLong::LONG;
741 const TypeD *td = t->is_double_constant();
742 return TypeLong::make( SharedRuntime::d2l( td->getd() ) );
743 }
745 //------------------------------Identity---------------------------------------
746 Node *ConvD2LNode::Identity(PhaseTransform *phase) {
747 // Remove ConvD2L->ConvL2D->ConvD2L sequences.
748 if( in(1) ->Opcode() == Op_ConvL2D &&
749 in(1)->in(1)->Opcode() == Op_ConvD2L )
750 return in(1)->in(1);
751 return this;
752 }
754 //------------------------------Ideal------------------------------------------
755 // If converting to an int type, skip any rounding nodes
756 Node *ConvD2LNode::Ideal(PhaseGVN *phase, bool can_reshape) {
757 if( in(1)->Opcode() == Op_RoundDouble )
758 set_req(1,in(1)->in(1));
759 return NULL;
760 }
762 //=============================================================================
763 //------------------------------Value------------------------------------------
764 const Type *ConvF2DNode::Value( PhaseTransform *phase ) const {
765 const Type *t = phase->type( in(1) );
766 if( t == Type::TOP ) return Type::TOP;
767 if( t == Type::FLOAT ) return Type::DOUBLE;
768 const TypeF *tf = t->is_float_constant();
769 return TypeD::make( (double)tf->getf() );
770 }
772 //=============================================================================
773 //------------------------------Value------------------------------------------
774 const Type *ConvF2INode::Value( PhaseTransform *phase ) const {
775 const Type *t = phase->type( in(1) );
776 if( t == Type::TOP ) return Type::TOP;
777 if( t == Type::FLOAT ) return TypeInt::INT;
778 const TypeF *tf = t->is_float_constant();
779 return TypeInt::make( SharedRuntime::f2i( tf->getf() ) );
780 }
782 //------------------------------Identity---------------------------------------
783 Node *ConvF2INode::Identity(PhaseTransform *phase) {
784 // Remove ConvF2I->ConvI2F->ConvF2I sequences.
785 if( in(1) ->Opcode() == Op_ConvI2F &&
786 in(1)->in(1)->Opcode() == Op_ConvF2I )
787 return in(1)->in(1);
788 return this;
789 }
791 //------------------------------Ideal------------------------------------------
792 // If converting to an int type, skip any rounding nodes
793 Node *ConvF2INode::Ideal(PhaseGVN *phase, bool can_reshape) {
794 if( in(1)->Opcode() == Op_RoundFloat )
795 set_req(1,in(1)->in(1));
796 return NULL;
797 }
799 //=============================================================================
800 //------------------------------Value------------------------------------------
801 const Type *ConvF2LNode::Value( PhaseTransform *phase ) const {
802 const Type *t = phase->type( in(1) );
803 if( t == Type::TOP ) return Type::TOP;
804 if( t == Type::FLOAT ) return TypeLong::LONG;
805 const TypeF *tf = t->is_float_constant();
806 return TypeLong::make( SharedRuntime::f2l( tf->getf() ) );
807 }
809 //------------------------------Identity---------------------------------------
810 Node *ConvF2LNode::Identity(PhaseTransform *phase) {
811 // Remove ConvF2L->ConvL2F->ConvF2L sequences.
812 if( in(1) ->Opcode() == Op_ConvL2F &&
813 in(1)->in(1)->Opcode() == Op_ConvF2L )
814 return in(1)->in(1);
815 return this;
816 }
818 //------------------------------Ideal------------------------------------------
819 // If converting to an int type, skip any rounding nodes
820 Node *ConvF2LNode::Ideal(PhaseGVN *phase, bool can_reshape) {
821 if( in(1)->Opcode() == Op_RoundFloat )
822 set_req(1,in(1)->in(1));
823 return NULL;
824 }
826 //=============================================================================
827 //------------------------------Value------------------------------------------
828 const Type *ConvI2DNode::Value( PhaseTransform *phase ) const {
829 const Type *t = phase->type( in(1) );
830 if( t == Type::TOP ) return Type::TOP;
831 const TypeInt *ti = t->is_int();
832 if( ti->is_con() ) return TypeD::make( (double)ti->get_con() );
833 return bottom_type();
834 }
836 //=============================================================================
837 //------------------------------Value------------------------------------------
838 const Type *ConvI2FNode::Value( PhaseTransform *phase ) const {
839 const Type *t = phase->type( in(1) );
840 if( t == Type::TOP ) return Type::TOP;
841 const TypeInt *ti = t->is_int();
842 if( ti->is_con() ) return TypeF::make( (float)ti->get_con() );
843 return bottom_type();
844 }
846 //------------------------------Identity---------------------------------------
847 Node *ConvI2FNode::Identity(PhaseTransform *phase) {
848 // Remove ConvI2F->ConvF2I->ConvI2F sequences.
849 if( in(1) ->Opcode() == Op_ConvF2I &&
850 in(1)->in(1)->Opcode() == Op_ConvI2F )
851 return in(1)->in(1);
852 return this;
853 }
855 //=============================================================================
856 //------------------------------Value------------------------------------------
857 const Type *ConvI2LNode::Value( PhaseTransform *phase ) const {
858 const Type *t = phase->type( in(1) );
859 if( t == Type::TOP ) return Type::TOP;
860 const TypeInt *ti = t->is_int();
861 const Type* tl = TypeLong::make(ti->_lo, ti->_hi, ti->_widen);
862 // Join my declared type against my incoming type.
863 tl = tl->filter(_type);
864 return tl;
865 }
867 #ifdef _LP64
868 static inline bool long_ranges_overlap(jlong lo1, jlong hi1,
869 jlong lo2, jlong hi2) {
870 // Two ranges overlap iff one range's low point falls in the other range.
871 return (lo2 <= lo1 && lo1 <= hi2) || (lo1 <= lo2 && lo2 <= hi1);
872 }
873 #endif
875 //------------------------------Ideal------------------------------------------
876 Node *ConvI2LNode::Ideal(PhaseGVN *phase, bool can_reshape) {
877 const TypeLong* this_type = this->type()->is_long();
878 Node* this_changed = NULL;
880 // If _major_progress, then more loop optimizations follow. Do NOT
881 // remove this node's type assertion until no more loop ops can happen.
882 // The progress bit is set in the major loop optimizations THEN comes the
883 // call to IterGVN and any chance of hitting this code. Cf. Opaque1Node.
884 if (can_reshape && !phase->C->major_progress()) {
885 const TypeInt* in_type = phase->type(in(1))->isa_int();
886 if (in_type != NULL && this_type != NULL &&
887 (in_type->_lo != this_type->_lo ||
888 in_type->_hi != this_type->_hi)) {
889 // Although this WORSENS the type, it increases GVN opportunities,
890 // because I2L nodes with the same input will common up, regardless
891 // of slightly differing type assertions. Such slight differences
892 // arise routinely as a result of loop unrolling, so this is a
893 // post-unrolling graph cleanup. Choose a type which depends only
894 // on my input. (Exception: Keep a range assertion of >=0 or <0.)
895 jlong lo1 = this_type->_lo;
896 jlong hi1 = this_type->_hi;
897 int w1 = this_type->_widen;
898 if (lo1 != (jint)lo1 ||
899 hi1 != (jint)hi1 ||
900 lo1 > hi1) {
901 // Overflow leads to wraparound, wraparound leads to range saturation.
902 lo1 = min_jint; hi1 = max_jint;
903 } else if (lo1 >= 0) {
904 // Keep a range assertion of >=0.
905 lo1 = 0; hi1 = max_jint;
906 } else if (hi1 < 0) {
907 // Keep a range assertion of <0.
908 lo1 = min_jint; hi1 = -1;
909 } else {
910 lo1 = min_jint; hi1 = max_jint;
911 }
912 const TypeLong* wtype = TypeLong::make(MAX2((jlong)in_type->_lo, lo1),
913 MIN2((jlong)in_type->_hi, hi1),
914 MAX2((int)in_type->_widen, w1));
915 if (wtype != type()) {
916 set_type(wtype);
917 // Note: this_type still has old type value, for the logic below.
918 this_changed = this;
919 }
920 }
921 }
923 #ifdef _LP64
924 // Convert ConvI2L(AddI(x, y)) to AddL(ConvI2L(x), ConvI2L(y)) ,
925 // but only if x and y have subranges that cannot cause 32-bit overflow,
926 // under the assumption that x+y is in my own subrange this->type().
928 // This assumption is based on a constraint (i.e., type assertion)
929 // established in Parse::array_addressing or perhaps elsewhere.
930 // This constraint has been adjoined to the "natural" type of
931 // the incoming argument in(0). We know (because of runtime
932 // checks) - that the result value I2L(x+y) is in the joined range.
933 // Hence we can restrict the incoming terms (x, y) to values such
934 // that their sum also lands in that range.
936 // This optimization is useful only on 64-bit systems, where we hope
937 // the addition will end up subsumed in an addressing mode.
938 // It is necessary to do this when optimizing an unrolled array
939 // copy loop such as x[i++] = y[i++].
941 // On 32-bit systems, it's better to perform as much 32-bit math as
942 // possible before the I2L conversion, because 32-bit math is cheaper.
943 // There's no common reason to "leak" a constant offset through the I2L.
944 // Addressing arithmetic will not absorb it as part of a 64-bit AddL.
946 Node* z = in(1);
947 int op = z->Opcode();
948 if (op == Op_AddI || op == Op_SubI) {
949 Node* x = z->in(1);
950 Node* y = z->in(2);
951 assert (x != z && y != z, "dead loop in ConvI2LNode::Ideal");
952 if (phase->type(x) == Type::TOP) return this_changed;
953 if (phase->type(y) == Type::TOP) return this_changed;
954 const TypeInt* tx = phase->type(x)->is_int();
955 const TypeInt* ty = phase->type(y)->is_int();
956 const TypeLong* tz = this_type;
957 jlong xlo = tx->_lo;
958 jlong xhi = tx->_hi;
959 jlong ylo = ty->_lo;
960 jlong yhi = ty->_hi;
961 jlong zlo = tz->_lo;
962 jlong zhi = tz->_hi;
963 jlong vbit = CONST64(1) << BitsPerInt;
964 int widen = MAX2(tx->_widen, ty->_widen);
965 if (op == Op_SubI) {
966 jlong ylo0 = ylo;
967 ylo = -yhi;
968 yhi = -ylo0;
969 }
970 // See if x+y can cause positive overflow into z+2**32
971 if (long_ranges_overlap(xlo+ylo, xhi+yhi, zlo+vbit, zhi+vbit)) {
972 return this_changed;
973 }
974 // See if x+y can cause negative overflow into z-2**32
975 if (long_ranges_overlap(xlo+ylo, xhi+yhi, zlo-vbit, zhi-vbit)) {
976 return this_changed;
977 }
978 // Now it's always safe to assume x+y does not overflow.
979 // This is true even if some pairs x,y might cause overflow, as long
980 // as that overflow value cannot fall into [zlo,zhi].
982 // Confident that the arithmetic is "as if infinite precision",
983 // we can now use z's range to put constraints on those of x and y.
984 // The "natural" range of x [xlo,xhi] can perhaps be narrowed to a
985 // more "restricted" range by intersecting [xlo,xhi] with the
986 // range obtained by subtracting y's range from the asserted range
987 // of the I2L conversion. Here's the interval arithmetic algebra:
988 // x == z-y == [zlo,zhi]-[ylo,yhi] == [zlo,zhi]+[-yhi,-ylo]
989 // => x in [zlo-yhi, zhi-ylo]
990 // => x in [zlo-yhi, zhi-ylo] INTERSECT [xlo,xhi]
991 // => x in [xlo MAX zlo-yhi, xhi MIN zhi-ylo]
992 jlong rxlo = MAX2(xlo, zlo - yhi);
993 jlong rxhi = MIN2(xhi, zhi - ylo);
994 // And similarly, x changing place with y:
995 jlong rylo = MAX2(ylo, zlo - xhi);
996 jlong ryhi = MIN2(yhi, zhi - xlo);
997 if (rxlo > rxhi || rylo > ryhi) {
998 return this_changed; // x or y is dying; don't mess w/ it
999 }
1000 if (op == Op_SubI) {
1001 jlong rylo0 = rylo;
1002 rylo = -ryhi;
1003 ryhi = -rylo0;
1004 }
1006 Node* cx = phase->transform( new (phase->C) ConvI2LNode(x, TypeLong::make(rxlo, rxhi, widen)) );
1007 Node* cy = phase->transform( new (phase->C) ConvI2LNode(y, TypeLong::make(rylo, ryhi, widen)) );
1008 switch (op) {
1009 case Op_AddI: return new (phase->C) AddLNode(cx, cy);
1010 case Op_SubI: return new (phase->C) SubLNode(cx, cy);
1011 default: ShouldNotReachHere();
1012 }
1013 }
1014 #endif //_LP64
1016 return this_changed;
1017 }
1019 //=============================================================================
1020 //------------------------------Value------------------------------------------
1021 const Type *ConvL2DNode::Value( PhaseTransform *phase ) const {
1022 const Type *t = phase->type( in(1) );
1023 if( t == Type::TOP ) return Type::TOP;
1024 const TypeLong *tl = t->is_long();
1025 if( tl->is_con() ) return TypeD::make( (double)tl->get_con() );
1026 return bottom_type();
1027 }
1029 //=============================================================================
1030 //------------------------------Value------------------------------------------
1031 const Type *ConvL2FNode::Value( PhaseTransform *phase ) const {
1032 const Type *t = phase->type( in(1) );
1033 if( t == Type::TOP ) return Type::TOP;
1034 const TypeLong *tl = t->is_long();
1035 if( tl->is_con() ) return TypeF::make( (float)tl->get_con() );
1036 return bottom_type();
1037 }
1039 //=============================================================================
1040 //----------------------------Identity-----------------------------------------
1041 Node *ConvL2INode::Identity( PhaseTransform *phase ) {
1042 // Convert L2I(I2L(x)) => x
1043 if (in(1)->Opcode() == Op_ConvI2L) return in(1)->in(1);
1044 return this;
1045 }
1047 //------------------------------Value------------------------------------------
1048 const Type *ConvL2INode::Value( PhaseTransform *phase ) const {
1049 const Type *t = phase->type( in(1) );
1050 if( t == Type::TOP ) return Type::TOP;
1051 const TypeLong *tl = t->is_long();
1052 if (tl->is_con())
1053 // Easy case.
1054 return TypeInt::make((jint)tl->get_con());
1055 return bottom_type();
1056 }
1058 //------------------------------Ideal------------------------------------------
1059 // Return a node which is more "ideal" than the current node.
1060 // Blow off prior masking to int
1061 Node *ConvL2INode::Ideal(PhaseGVN *phase, bool can_reshape) {
1062 Node *andl = in(1);
1063 uint andl_op = andl->Opcode();
1064 if( andl_op == Op_AndL ) {
1065 // Blow off prior masking to int
1066 if( phase->type(andl->in(2)) == TypeLong::make( 0xFFFFFFFF ) ) {
1067 set_req(1,andl->in(1));
1068 return this;
1069 }
1070 }
1072 // Swap with a prior add: convL2I(addL(x,y)) ==> addI(convL2I(x),convL2I(y))
1073 // This replaces an 'AddL' with an 'AddI'.
1074 if( andl_op == Op_AddL ) {
1075 // Don't do this for nodes which have more than one user since
1076 // we'll end up computing the long add anyway.
1077 if (andl->outcnt() > 1) return NULL;
1079 Node* x = andl->in(1);
1080 Node* y = andl->in(2);
1081 assert( x != andl && y != andl, "dead loop in ConvL2INode::Ideal" );
1082 if (phase->type(x) == Type::TOP) return NULL;
1083 if (phase->type(y) == Type::TOP) return NULL;
1084 Node *add1 = phase->transform(new (phase->C) ConvL2INode(x));
1085 Node *add2 = phase->transform(new (phase->C) ConvL2INode(y));
1086 return new (phase->C) AddINode(add1,add2);
1087 }
1089 // Disable optimization: LoadL->ConvL2I ==> LoadI.
1090 // It causes problems (sizes of Load and Store nodes do not match)
1091 // in objects initialization code and Escape Analysis.
1092 return NULL;
1093 }
1095 //=============================================================================
1096 //------------------------------Value------------------------------------------
1097 const Type *CastX2PNode::Value( PhaseTransform *phase ) const {
1098 const Type* t = phase->type(in(1));
1099 if (t == Type::TOP) return Type::TOP;
1100 if (t->base() == Type_X && t->singleton()) {
1101 uintptr_t bits = (uintptr_t) t->is_intptr_t()->get_con();
1102 if (bits == 0) return TypePtr::NULL_PTR;
1103 return TypeRawPtr::make((address) bits);
1104 }
1105 return CastX2PNode::bottom_type();
1106 }
1108 //------------------------------Idealize---------------------------------------
1109 static inline bool fits_in_int(const Type* t, bool but_not_min_int = false) {
1110 if (t == Type::TOP) return false;
1111 const TypeX* tl = t->is_intptr_t();
1112 jint lo = min_jint;
1113 jint hi = max_jint;
1114 if (but_not_min_int) ++lo; // caller wants to negate the value w/o overflow
1115 return (tl->_lo >= lo) && (tl->_hi <= hi);
1116 }
1118 static inline Node* addP_of_X2P(PhaseGVN *phase,
1119 Node* base,
1120 Node* dispX,
1121 bool negate = false) {
1122 if (negate) {
1123 dispX = new (phase->C) SubXNode(phase->MakeConX(0), phase->transform(dispX));
1124 }
1125 return new (phase->C) AddPNode(phase->C->top(),
1126 phase->transform(new (phase->C) CastX2PNode(base)),
1127 phase->transform(dispX));
1128 }
1130 Node *CastX2PNode::Ideal(PhaseGVN *phase, bool can_reshape) {
1131 // convert CastX2P(AddX(x, y)) to AddP(CastX2P(x), y) if y fits in an int
1132 int op = in(1)->Opcode();
1133 Node* x;
1134 Node* y;
1135 switch (op) {
1136 case Op_SubX:
1137 x = in(1)->in(1);
1138 // Avoid ideal transformations ping-pong between this and AddP for raw pointers.
1139 if (phase->find_intptr_t_con(x, -1) == 0)
1140 break;
1141 y = in(1)->in(2);
1142 if (fits_in_int(phase->type(y), true)) {
1143 return addP_of_X2P(phase, x, y, true);
1144 }
1145 break;
1146 case Op_AddX:
1147 x = in(1)->in(1);
1148 y = in(1)->in(2);
1149 if (fits_in_int(phase->type(y))) {
1150 return addP_of_X2P(phase, x, y);
1151 }
1152 if (fits_in_int(phase->type(x))) {
1153 return addP_of_X2P(phase, y, x);
1154 }
1155 break;
1156 }
1157 return NULL;
1158 }
1160 //------------------------------Identity---------------------------------------
1161 Node *CastX2PNode::Identity( PhaseTransform *phase ) {
1162 if (in(1)->Opcode() == Op_CastP2X) return in(1)->in(1);
1163 return this;
1164 }
1166 //=============================================================================
1167 //------------------------------Value------------------------------------------
1168 const Type *CastP2XNode::Value( PhaseTransform *phase ) const {
1169 const Type* t = phase->type(in(1));
1170 if (t == Type::TOP) return Type::TOP;
1171 if (t->base() == Type::RawPtr && t->singleton()) {
1172 uintptr_t bits = (uintptr_t) t->is_rawptr()->get_con();
1173 return TypeX::make(bits);
1174 }
1175 return CastP2XNode::bottom_type();
1176 }
1178 Node *CastP2XNode::Ideal(PhaseGVN *phase, bool can_reshape) {
1179 return (in(0) && remove_dead_region(phase, can_reshape)) ? this : NULL;
1180 }
1182 //------------------------------Identity---------------------------------------
1183 Node *CastP2XNode::Identity( PhaseTransform *phase ) {
1184 if (in(1)->Opcode() == Op_CastX2P) return in(1)->in(1);
1185 return this;
1186 }
1189 //=============================================================================
1190 //------------------------------Identity---------------------------------------
1191 // Remove redundant roundings
1192 Node *RoundFloatNode::Identity( PhaseTransform *phase ) {
1193 assert(Matcher::strict_fp_requires_explicit_rounding, "should only generate for Intel");
1194 // Do not round constants
1195 if (phase->type(in(1))->base() == Type::FloatCon) return in(1);
1196 int op = in(1)->Opcode();
1197 // Redundant rounding
1198 if( op == Op_RoundFloat ) return in(1);
1199 // Already rounded
1200 if( op == Op_Parm ) return in(1);
1201 if( op == Op_LoadF ) return in(1);
1202 return this;
1203 }
1205 //------------------------------Value------------------------------------------
1206 const Type *RoundFloatNode::Value( PhaseTransform *phase ) const {
1207 return phase->type( in(1) );
1208 }
1210 //=============================================================================
1211 //------------------------------Identity---------------------------------------
1212 // Remove redundant roundings. Incoming arguments are already rounded.
1213 Node *RoundDoubleNode::Identity( PhaseTransform *phase ) {
1214 assert(Matcher::strict_fp_requires_explicit_rounding, "should only generate for Intel");
1215 // Do not round constants
1216 if (phase->type(in(1))->base() == Type::DoubleCon) return in(1);
1217 int op = in(1)->Opcode();
1218 // Redundant rounding
1219 if( op == Op_RoundDouble ) return in(1);
1220 // Already rounded
1221 if( op == Op_Parm ) return in(1);
1222 if( op == Op_LoadD ) return in(1);
1223 if( op == Op_ConvF2D ) return in(1);
1224 if( op == Op_ConvI2D ) return in(1);
1225 return this;
1226 }
1228 //------------------------------Value------------------------------------------
1229 const Type *RoundDoubleNode::Value( PhaseTransform *phase ) const {
1230 return phase->type( in(1) );
1231 }
1234 //=============================================================================
1235 // Do not allow value-numbering
1236 uint Opaque1Node::hash() const { return NO_HASH; }
1237 uint Opaque1Node::cmp( const Node &n ) const {
1238 return (&n == this); // Always fail except on self
1239 }
1241 //------------------------------Identity---------------------------------------
1242 // If _major_progress, then more loop optimizations follow. Do NOT remove
1243 // the opaque Node until no more loop ops can happen. Note the timing of
1244 // _major_progress; it's set in the major loop optimizations THEN comes the
1245 // call to IterGVN and any chance of hitting this code. Hence there's no
1246 // phase-ordering problem with stripping Opaque1 in IGVN followed by some
1247 // more loop optimizations that require it.
1248 Node *Opaque1Node::Identity( PhaseTransform *phase ) {
1249 return phase->C->major_progress() ? this : in(1);
1250 }
1252 //=============================================================================
1253 // A node to prevent unwanted optimizations. Allows constant folding. Stops
1254 // value-numbering, most Ideal calls or Identity functions. This Node is
1255 // specifically designed to prevent the pre-increment value of a loop trip
1256 // counter from being live out of the bottom of the loop (hence causing the
1257 // pre- and post-increment values both being live and thus requiring an extra
1258 // temp register and an extra move). If we "accidentally" optimize through
1259 // this kind of a Node, we'll get slightly pessimal, but correct, code. Thus
1260 // it's OK to be slightly sloppy on optimizations here.
1262 // Do not allow value-numbering
1263 uint Opaque2Node::hash() const { return NO_HASH; }
1264 uint Opaque2Node::cmp( const Node &n ) const {
1265 return (&n == this); // Always fail except on self
1266 }
1269 //------------------------------Value------------------------------------------
1270 const Type *MoveL2DNode::Value( PhaseTransform *phase ) const {
1271 const Type *t = phase->type( in(1) );
1272 if( t == Type::TOP ) return Type::TOP;
1273 const TypeLong *tl = t->is_long();
1274 if( !tl->is_con() ) return bottom_type();
1275 JavaValue v;
1276 v.set_jlong(tl->get_con());
1277 return TypeD::make( v.get_jdouble() );
1278 }
1280 //------------------------------Value------------------------------------------
1281 const Type *MoveI2FNode::Value( PhaseTransform *phase ) const {
1282 const Type *t = phase->type( in(1) );
1283 if( t == Type::TOP ) return Type::TOP;
1284 const TypeInt *ti = t->is_int();
1285 if( !ti->is_con() ) return bottom_type();
1286 JavaValue v;
1287 v.set_jint(ti->get_con());
1288 return TypeF::make( v.get_jfloat() );
1289 }
1291 //------------------------------Value------------------------------------------
1292 const Type *MoveF2INode::Value( PhaseTransform *phase ) const {
1293 const Type *t = phase->type( in(1) );
1294 if( t == Type::TOP ) return Type::TOP;
1295 if( t == Type::FLOAT ) return TypeInt::INT;
1296 const TypeF *tf = t->is_float_constant();
1297 JavaValue v;
1298 v.set_jfloat(tf->getf());
1299 return TypeInt::make( v.get_jint() );
1300 }
1302 //------------------------------Value------------------------------------------
1303 const Type *MoveD2LNode::Value( PhaseTransform *phase ) const {
1304 const Type *t = phase->type( in(1) );
1305 if( t == Type::TOP ) return Type::TOP;
1306 if( t == Type::DOUBLE ) return TypeLong::LONG;
1307 const TypeD *td = t->is_double_constant();
1308 JavaValue v;
1309 v.set_jdouble(td->getd());
1310 return TypeLong::make( v.get_jlong() );
1311 }
1313 //------------------------------Value------------------------------------------
1314 const Type* CountLeadingZerosINode::Value(PhaseTransform* phase) const {
1315 const Type* t = phase->type(in(1));
1316 if (t == Type::TOP) return Type::TOP;
1317 const TypeInt* ti = t->isa_int();
1318 if (ti && ti->is_con()) {
1319 jint i = ti->get_con();
1320 // HD, Figure 5-6
1321 if (i == 0)
1322 return TypeInt::make(BitsPerInt);
1323 int n = 1;
1324 unsigned int x = i;
1325 if (x >> 16 == 0) { n += 16; x <<= 16; }
1326 if (x >> 24 == 0) { n += 8; x <<= 8; }
1327 if (x >> 28 == 0) { n += 4; x <<= 4; }
1328 if (x >> 30 == 0) { n += 2; x <<= 2; }
1329 n -= x >> 31;
1330 return TypeInt::make(n);
1331 }
1332 return TypeInt::INT;
1333 }
1335 //------------------------------Value------------------------------------------
1336 const Type* CountLeadingZerosLNode::Value(PhaseTransform* phase) const {
1337 const Type* t = phase->type(in(1));
1338 if (t == Type::TOP) return Type::TOP;
1339 const TypeLong* tl = t->isa_long();
1340 if (tl && tl->is_con()) {
1341 jlong l = tl->get_con();
1342 // HD, Figure 5-6
1343 if (l == 0)
1344 return TypeInt::make(BitsPerLong);
1345 int n = 1;
1346 unsigned int x = (((julong) l) >> 32);
1347 if (x == 0) { n += 32; x = (int) l; }
1348 if (x >> 16 == 0) { n += 16; x <<= 16; }
1349 if (x >> 24 == 0) { n += 8; x <<= 8; }
1350 if (x >> 28 == 0) { n += 4; x <<= 4; }
1351 if (x >> 30 == 0) { n += 2; x <<= 2; }
1352 n -= x >> 31;
1353 return TypeInt::make(n);
1354 }
1355 return TypeInt::INT;
1356 }
1358 //------------------------------Value------------------------------------------
1359 const Type* CountTrailingZerosINode::Value(PhaseTransform* phase) const {
1360 const Type* t = phase->type(in(1));
1361 if (t == Type::TOP) return Type::TOP;
1362 const TypeInt* ti = t->isa_int();
1363 if (ti && ti->is_con()) {
1364 jint i = ti->get_con();
1365 // HD, Figure 5-14
1366 int y;
1367 if (i == 0)
1368 return TypeInt::make(BitsPerInt);
1369 int n = 31;
1370 y = i << 16; if (y != 0) { n = n - 16; i = y; }
1371 y = i << 8; if (y != 0) { n = n - 8; i = y; }
1372 y = i << 4; if (y != 0) { n = n - 4; i = y; }
1373 y = i << 2; if (y != 0) { n = n - 2; i = y; }
1374 y = i << 1; if (y != 0) { n = n - 1; }
1375 return TypeInt::make(n);
1376 }
1377 return TypeInt::INT;
1378 }
1380 //------------------------------Value------------------------------------------
1381 const Type* CountTrailingZerosLNode::Value(PhaseTransform* phase) const {
1382 const Type* t = phase->type(in(1));
1383 if (t == Type::TOP) return Type::TOP;
1384 const TypeLong* tl = t->isa_long();
1385 if (tl && tl->is_con()) {
1386 jlong l = tl->get_con();
1387 // HD, Figure 5-14
1388 int x, y;
1389 if (l == 0)
1390 return TypeInt::make(BitsPerLong);
1391 int n = 63;
1392 y = (int) l; if (y != 0) { n = n - 32; x = y; } else x = (((julong) l) >> 32);
1393 y = x << 16; if (y != 0) { n = n - 16; x = y; }
1394 y = x << 8; if (y != 0) { n = n - 8; x = y; }
1395 y = x << 4; if (y != 0) { n = n - 4; x = y; }
1396 y = x << 2; if (y != 0) { n = n - 2; x = y; }
1397 y = x << 1; if (y != 0) { n = n - 1; }
1398 return TypeInt::make(n);
1399 }
1400 return TypeInt::INT;
1401 }