comparison src/share/vm/opto/connode.cpp @ 0:a61af66fc99e jdk7-b24

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