1 /*
2 * Copyright (c) 1997, 2019, 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 */
24
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"
36
37 // Optimization - Graph Style
38
39 //=============================================================================
40 //------------------------------hash-------------------------------------------
hash() const41 uint ConNode::hash() const {
42 return (uintptr_t)in(TypeFunc::Control) + _type->hash();
43 }
44
45 //------------------------------make-------------------------------------------
make(Compile * C,const Type * t)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 }
68
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:
76
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.
80
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.
87
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.
95
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.
101
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).
106
107 */
108
109
110 //------------------------------Ideal------------------------------------------
111 // Return a node which is more "ideal" than the current node.
112 // Move constants to the right.
Ideal(PhaseGVN * phase,bool can_reshape)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
122
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 }
132
133 //------------------------------is_cmove_id------------------------------------
134 // Helper function to check for CMOVE identity. Shared with PhiNode::Identity
is_cmove_id(PhaseTransform * phase,Node * cmp,Node * t,Node * f,BoolNode * b)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 }
156
157 //------------------------------Identity---------------------------------------
158 // Conditional-move is an identity if both inputs are the same, or the test
159 // true or false.
Identity(PhaseTransform * phase)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
167
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 }
182
183 return this;
184 }
185
186 //------------------------------Value------------------------------------------
187 // Result is the meet of inputs
Value(PhaseTransform * phase) const188 const Type *CMoveNode::Value( PhaseTransform *phase ) const {
189 if( phase->type(in(Condition)) == Type::TOP )
190 return Type::TOP;
191 return phase->type(in(IfFalse))->meet_speculative(phase->type(in(IfTrue)));
192 }
193
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.
make(Compile * C,Node * c,Node * bol,Node * left,Node * right,const Type * t)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 }
211
212 //=============================================================================
213 //------------------------------Ideal------------------------------------------
214 // Return a node which is more "ideal" than the current node.
215 // Check for conversions to boolean
Ideal(PhaseGVN * phase,bool can_reshape)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;
220
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 }
238
239 // Now check for booleans
240 int flip = 0;
241
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;
247
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;
255
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;
266
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) );
275
276 return n;
277 }
278
279 //=============================================================================
280 //------------------------------Ideal------------------------------------------
281 // Return a node which is more "ideal" than the current node.
282 // Check for absolute value
Ideal(PhaseGVN * phase,bool can_reshape)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;
287
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
290
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 }
302
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 }
317
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);
322
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;
327
328 Node *abs = new (phase->C) AbsFNode( X );
329 if( flip )
330 abs = new (phase->C) SubFNode(sub->in(1), phase->transform(abs));
331
332 return abs;
333 }
334
335 //=============================================================================
336 //------------------------------Ideal------------------------------------------
337 // Return a node which is more "ideal" than the current node.
338 // Check for absolute value
Ideal(PhaseGVN * phase,bool can_reshape)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;
343
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
346
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 }
358
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 }
373
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);
378
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;
383
384 Node *abs = new (phase->C) AbsDNode( X );
385 if( flip )
386 abs = new (phase->C) SubDNode(sub->in(1), phase->transform(abs));
387
388 return abs;
389 }
390
391
392 //=============================================================================
393 // If input is already higher or equal to cast type, then this is an identity.
Identity(PhaseTransform * phase)394 Node *ConstraintCastNode::Identity( PhaseTransform *phase ) {
395 return phase->type(in(1))->higher_equal_speculative(_type) ? in(1) : this;
396 }
397
398 //------------------------------Value------------------------------------------
399 // Take 'join' of input and cast-up type
Value(PhaseTransform * phase) const400 const Type *ConstraintCastNode::Value( PhaseTransform *phase ) const {
401 if( in(0) && phase->type(in(0)) == Type::TOP ) return Type::TOP;
402 const Type* ft = phase->type(in(1))->filter_speculative(_type);
403
404 #ifdef ASSERT
405 // Previous versions of this function had some special case logic,
406 // which is no longer necessary. Make sure of the required effects.
407 switch (Opcode()) {
408 case Op_CastII:
409 {
410 const Type* t1 = phase->type(in(1));
411 if( t1 == Type::TOP ) assert(ft == Type::TOP, "special case #1");
412 const Type* rt = t1->join_speculative(_type);
413 if (rt->empty()) assert(ft == Type::TOP, "special case #2");
414 break;
415 }
416 case Op_CastPP:
417 if (phase->type(in(1)) == TypePtr::NULL_PTR &&
418 _type->isa_ptr() && _type->is_ptr()->_ptr == TypePtr::NotNull)
419 assert(ft == Type::TOP, "special case #3");
420 break;
421 }
422 #endif //ASSERT
423
424 return ft;
425 }
426
427 //------------------------------Ideal------------------------------------------
428 // Return a node which is more "ideal" than the current node. Strip out
429 // control copies
Ideal(PhaseGVN * phase,bool can_reshape)430 Node *ConstraintCastNode::Ideal(PhaseGVN *phase, bool can_reshape){
431 return (in(0) && remove_dead_region(phase, can_reshape)) ? this : NULL;
432 }
433
434 //------------------------------Ideal_DU_postCCP-------------------------------
435 // Throw away cast after constant propagation
Ideal_DU_postCCP(PhaseCCP * ccp)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 }
443
size_of() const444 uint CastIINode::size_of() const {
445 return sizeof(*this);
446 }
447
cmp(const Node & n) const448 uint CastIINode::cmp(const Node &n) const {
449 return TypeNode::cmp(n) &&
450 ((CastIINode&)n)._carry_dependency == _carry_dependency &&
451 ((CastIINode&)n)._range_check_dependency == _range_check_dependency;
452 }
453
Identity(PhaseTransform * phase)454 Node *CastIINode::Identity(PhaseTransform *phase) {
455 if (_carry_dependency) {
456 return this;
457 }
458 return ConstraintCastNode::Identity(phase);
459 }
460
Value(PhaseTransform * phase) const461 const Type *CastIINode::Value(PhaseTransform *phase) const {
462 const Type *res = ConstraintCastNode::Value(phase);
463
464 // Try to improve the type of the CastII if we recognize a CmpI/If
465 // pattern.
466 if (_carry_dependency) {
467 if (in(0) != NULL && in(0)->in(0) != NULL && in(0)->in(0)->is_If()) {
468 assert(in(0)->is_IfFalse() || in(0)->is_IfTrue(), "should be If proj");
469 Node* proj = in(0);
470 if (proj->in(0)->in(1)->is_Bool()) {
471 Node* b = proj->in(0)->in(1);
472 if (b->in(1)->Opcode() == Op_CmpI) {
473 Node* cmp = b->in(1);
474 if (cmp->in(1) == in(1) && phase->type(cmp->in(2))->isa_int()) {
475 const TypeInt* in2_t = phase->type(cmp->in(2))->is_int();
476 const Type* t = TypeInt::INT;
477 BoolTest test = b->as_Bool()->_test;
478 if (proj->is_IfFalse()) {
479 test = test.negate();
480 }
481 BoolTest::mask m = test._test;
482 jlong lo_long = min_jint;
483 jlong hi_long = max_jint;
484 if (m == BoolTest::le || m == BoolTest::lt) {
485 hi_long = in2_t->_hi;
486 if (m == BoolTest::lt) {
487 hi_long -= 1;
488 }
489 } else if (m == BoolTest::ge || m == BoolTest::gt) {
490 lo_long = in2_t->_lo;
491 if (m == BoolTest::gt) {
492 lo_long += 1;
493 }
494 } else if (m == BoolTest::eq) {
495 lo_long = in2_t->_lo;
496 hi_long = in2_t->_hi;
497 } else if (m == BoolTest::ne) {
498 // can't do any better
499 } else {
500 stringStream ss;
501 test.dump_on(&ss);
502 fatal(err_msg_res("unexpected comparison %s", ss.as_string()));
503 }
504 int lo_int = (int)lo_long;
505 int hi_int = (int)hi_long;
506
507 if (lo_long != (jlong)lo_int) {
508 lo_int = min_jint;
509 }
510 if (hi_long != (jlong)hi_int) {
511 hi_int = max_jint;
512 }
513
514 t = TypeInt::make(lo_int, hi_int, Type::WidenMax);
515
516 res = res->filter_speculative(t);
517
518 return res;
519 }
520 }
521 }
522 }
523 }
524 return res;
525 }
526
Ideal_DU_postCCP(PhaseCCP * ccp)527 Node *CastIINode::Ideal_DU_postCCP(PhaseCCP *ccp) {
528 if (_carry_dependency || _range_check_dependency) {
529 return NULL;
530 }
531 return ConstraintCastNode::Ideal_DU_postCCP(ccp);
532 }
533
534 #ifndef PRODUCT
dump_spec(outputStream * st) const535 void CastIINode::dump_spec(outputStream *st) const {
536 TypeNode::dump_spec(st);
537 if (_carry_dependency) {
538 st->print(" carry dependency");
539 }
540 if (_range_check_dependency) {
541 st->print(" range check dependency");
542 }
543 }
544 #endif
545
546 //=============================================================================
547
548 //------------------------------Ideal_DU_postCCP-------------------------------
549 // If not converting int->oop, throw away cast after constant propagation
Ideal_DU_postCCP(PhaseCCP * ccp)550 Node *CastPPNode::Ideal_DU_postCCP( PhaseCCP *ccp ) {
551 const Type *t = ccp->type(in(1));
552 if (!t->isa_oop_ptr() || ((in(1)->is_DecodeN()) && Matcher::gen_narrow_oop_implicit_null_checks())) {
553 return NULL; // do not transform raw pointers or narrow oops
554 }
555 return ConstraintCastNode::Ideal_DU_postCCP(ccp);
556 }
557
558
559
560 //=============================================================================
561 //------------------------------Identity---------------------------------------
562 // If input is already higher or equal to cast type, then this is an identity.
Identity(PhaseTransform * phase)563 Node *CheckCastPPNode::Identity( PhaseTransform *phase ) {
564 // Toned down to rescue meeting at a Phi 3 different oops all implementing
565 // the same interface. CompileTheWorld starting at 502, kd12rc1.zip.
566 return (phase->type(in(1)) == phase->type(this)) ? in(1) : this;
567 }
568
569 //------------------------------Value------------------------------------------
570 // Take 'join' of input and cast-up type, unless working with an Interface
Value(PhaseTransform * phase) const571 const Type *CheckCastPPNode::Value( PhaseTransform *phase ) const {
572 if( in(0) && phase->type(in(0)) == Type::TOP ) return Type::TOP;
573
574 const Type *inn = phase->type(in(1));
575 if( inn == Type::TOP ) return Type::TOP; // No information yet
576
577 const TypePtr *in_type = inn->isa_ptr();
578 const TypePtr *my_type = _type->isa_ptr();
579 const Type *result = _type;
580 if( in_type != NULL && my_type != NULL ) {
581 TypePtr::PTR in_ptr = in_type->ptr();
582 if( in_ptr == TypePtr::Null ) {
583 result = in_type;
584 } else if( in_ptr == TypePtr::Constant ) {
585 // Casting a constant oop to an interface?
586 // (i.e., a String to a Comparable?)
587 // Then return the interface.
588 const TypeOopPtr *jptr = my_type->isa_oopptr();
589 assert( jptr, "" );
590 result = (jptr->klass()->is_interface() || !in_type->higher_equal(_type))
591 ? my_type->cast_to_ptr_type( TypePtr::NotNull )
592 : in_type;
593 } else {
594 result = my_type->cast_to_ptr_type( my_type->join_ptr(in_ptr) );
595 }
596 }
597 return result;
598
599 // JOIN NOT DONE HERE BECAUSE OF INTERFACE ISSUES.
600 // FIX THIS (DO THE JOIN) WHEN UNION TYPES APPEAR!
601
602 //
603 // Remove this code after overnight run indicates no performance
604 // loss from not performing JOIN at CheckCastPPNode
605 //
606 // const TypeInstPtr *in_oop = in->isa_instptr();
607 // const TypeInstPtr *my_oop = _type->isa_instptr();
608 // // If either input is an 'interface', return destination type
609 // assert (in_oop == NULL || in_oop->klass() != NULL, "");
610 // assert (my_oop == NULL || my_oop->klass() != NULL, "");
611 // if( (in_oop && in_oop->klass()->is_interface())
612 // ||(my_oop && my_oop->klass()->is_interface()) ) {
613 // TypePtr::PTR in_ptr = in->isa_ptr() ? in->is_ptr()->_ptr : TypePtr::BotPTR;
614 // // Preserve cast away nullness for interfaces
615 // if( in_ptr == TypePtr::NotNull && my_oop && my_oop->_ptr == TypePtr::BotPTR ) {
616 // return my_oop->cast_to_ptr_type(TypePtr::NotNull);
617 // }
618 // return _type;
619 // }
620 //
621 // // Neither the input nor the destination type is an interface,
622 //
623 // // history: JOIN used to cause weird corner case bugs
624 // // return (in == TypeOopPtr::NULL_PTR) ? in : _type;
625 // // JOIN picks up NotNull in common instance-of/check-cast idioms, both oops.
626 // // JOIN does not preserve NotNull in other cases, e.g. RawPtr vs InstPtr
627 // const Type *join = in->join(_type);
628 // // Check if join preserved NotNull'ness for pointers
629 // if( join->isa_ptr() && _type->isa_ptr() ) {
630 // TypePtr::PTR join_ptr = join->is_ptr()->_ptr;
631 // TypePtr::PTR type_ptr = _type->is_ptr()->_ptr;
632 // // If there isn't any NotNull'ness to preserve
633 // // OR if join preserved NotNull'ness then return it
634 // if( type_ptr == TypePtr::BotPTR || type_ptr == TypePtr::Null ||
635 // join_ptr == TypePtr::NotNull || join_ptr == TypePtr::Constant ) {
636 // return join;
637 // }
638 // // ELSE return same old type as before
639 // return _type;
640 // }
641 // // Not joining two pointers
642 // return join;
643 }
644
645 //------------------------------Ideal------------------------------------------
646 // Return a node which is more "ideal" than the current node. Strip out
647 // control copies
Ideal(PhaseGVN * phase,bool can_reshape)648 Node *CheckCastPPNode::Ideal(PhaseGVN *phase, bool can_reshape){
649 return (in(0) && remove_dead_region(phase, can_reshape)) ? this : NULL;
650 }
651
652
Identity(PhaseTransform * phase)653 Node* DecodeNNode::Identity(PhaseTransform* phase) {
654 const Type *t = phase->type( in(1) );
655 if( t == Type::TOP ) return in(1);
656
657 if (in(1)->is_EncodeP()) {
658 // (DecodeN (EncodeP p)) -> p
659 return in(1)->in(1);
660 }
661 return this;
662 }
663
Value(PhaseTransform * phase) const664 const Type *DecodeNNode::Value( PhaseTransform *phase ) const {
665 const Type *t = phase->type( in(1) );
666 if (t == Type::TOP) return Type::TOP;
667 if (t == TypeNarrowOop::NULL_PTR) return TypePtr::NULL_PTR;
668
669 assert(t->isa_narrowoop(), "only narrowoop here");
670 return t->make_ptr();
671 }
672
Identity(PhaseTransform * phase)673 Node* EncodePNode::Identity(PhaseTransform* phase) {
674 const Type *t = phase->type( in(1) );
675 if( t == Type::TOP ) return in(1);
676
677 if (in(1)->is_DecodeN()) {
678 // (EncodeP (DecodeN p)) -> p
679 return in(1)->in(1);
680 }
681 return this;
682 }
683
Value(PhaseTransform * phase) const684 const Type *EncodePNode::Value( PhaseTransform *phase ) const {
685 const Type *t = phase->type( in(1) );
686 if (t == Type::TOP) return Type::TOP;
687 if (t == TypePtr::NULL_PTR) return TypeNarrowOop::NULL_PTR;
688
689 assert(t->isa_oop_ptr(), "only oopptr here");
690 return t->make_narrowoop();
691 }
692
693
Ideal_DU_postCCP(PhaseCCP * ccp)694 Node *EncodeNarrowPtrNode::Ideal_DU_postCCP( PhaseCCP *ccp ) {
695 return MemNode::Ideal_common_DU_postCCP(ccp, this, in(1));
696 }
697
Identity(PhaseTransform * phase)698 Node* DecodeNKlassNode::Identity(PhaseTransform* phase) {
699 const Type *t = phase->type( in(1) );
700 if( t == Type::TOP ) return in(1);
701
702 if (in(1)->is_EncodePKlass()) {
703 // (DecodeNKlass (EncodePKlass p)) -> p
704 return in(1)->in(1);
705 }
706 return this;
707 }
708
Value(PhaseTransform * phase) const709 const Type *DecodeNKlassNode::Value( PhaseTransform *phase ) const {
710 const Type *t = phase->type( in(1) );
711 if (t == Type::TOP) return Type::TOP;
712 assert(t != TypeNarrowKlass::NULL_PTR, "null klass?");
713
714 assert(t->isa_narrowklass(), "only narrow klass ptr here");
715 return t->make_ptr();
716 }
717
Identity(PhaseTransform * phase)718 Node* EncodePKlassNode::Identity(PhaseTransform* phase) {
719 const Type *t = phase->type( in(1) );
720 if( t == Type::TOP ) return in(1);
721
722 if (in(1)->is_DecodeNKlass()) {
723 // (EncodePKlass (DecodeNKlass p)) -> p
724 return in(1)->in(1);
725 }
726 return this;
727 }
728
Value(PhaseTransform * phase) const729 const Type *EncodePKlassNode::Value( PhaseTransform *phase ) const {
730 const Type *t = phase->type( in(1) );
731 if (t == Type::TOP) return Type::TOP;
732 assert (t != TypePtr::NULL_PTR, "null klass?");
733
734 assert(UseCompressedClassPointers && t->isa_klassptr(), "only klass ptr here");
735 return t->make_narrowklass();
736 }
737
738
739 //=============================================================================
740 //------------------------------Identity---------------------------------------
Identity(PhaseTransform * phase)741 Node *Conv2BNode::Identity( PhaseTransform *phase ) {
742 const Type *t = phase->type( in(1) );
743 if( t == Type::TOP ) return in(1);
744 if( t == TypeInt::ZERO ) return in(1);
745 if( t == TypeInt::ONE ) return in(1);
746 if( t == TypeInt::BOOL ) return in(1);
747 return this;
748 }
749
750 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const751 const Type *Conv2BNode::Value( PhaseTransform *phase ) const {
752 const Type *t = phase->type( in(1) );
753 if( t == Type::TOP ) return Type::TOP;
754 if( t == TypeInt::ZERO ) return TypeInt::ZERO;
755 if( t == TypePtr::NULL_PTR ) return TypeInt::ZERO;
756 const TypePtr *tp = t->isa_ptr();
757 if( tp != NULL ) {
758 if( tp->ptr() == TypePtr::AnyNull ) return Type::TOP;
759 if( tp->ptr() == TypePtr::Constant) return TypeInt::ONE;
760 if (tp->ptr() == TypePtr::NotNull) return TypeInt::ONE;
761 return TypeInt::BOOL;
762 }
763 if (t->base() != Type::Int) return TypeInt::BOOL;
764 const TypeInt *ti = t->is_int();
765 if( ti->_hi < 0 || ti->_lo > 0 ) return TypeInt::ONE;
766 return TypeInt::BOOL;
767 }
768
769
770 // The conversions operations are all Alpha sorted. Please keep it that way!
771 //=============================================================================
772 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const773 const Type *ConvD2FNode::Value( PhaseTransform *phase ) const {
774 const Type *t = phase->type( in(1) );
775 if( t == Type::TOP ) return Type::TOP;
776 if( t == Type::DOUBLE ) return Type::FLOAT;
777 const TypeD *td = t->is_double_constant();
778 return TypeF::make( (float)td->getd() );
779 }
780
781 //------------------------------Identity---------------------------------------
782 // Float's can be converted to doubles with no loss of bits. Hence
783 // converting a float to a double and back to a float is a NOP.
Identity(PhaseTransform * phase)784 Node *ConvD2FNode::Identity(PhaseTransform *phase) {
785 return (in(1)->Opcode() == Op_ConvF2D) ? in(1)->in(1) : this;
786 }
787
788 //=============================================================================
789 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const790 const Type *ConvD2INode::Value( PhaseTransform *phase ) const {
791 const Type *t = phase->type( in(1) );
792 if( t == Type::TOP ) return Type::TOP;
793 if( t == Type::DOUBLE ) return TypeInt::INT;
794 const TypeD *td = t->is_double_constant();
795 return TypeInt::make( SharedRuntime::d2i( td->getd() ) );
796 }
797
798 //------------------------------Ideal------------------------------------------
799 // If converting to an int type, skip any rounding nodes
Ideal(PhaseGVN * phase,bool can_reshape)800 Node *ConvD2INode::Ideal(PhaseGVN *phase, bool can_reshape) {
801 if( in(1)->Opcode() == Op_RoundDouble )
802 set_req(1,in(1)->in(1));
803 return NULL;
804 }
805
806 //------------------------------Identity---------------------------------------
807 // Int's can be converted to doubles with no loss of bits. Hence
808 // converting an integer to a double and back to an integer is a NOP.
Identity(PhaseTransform * phase)809 Node *ConvD2INode::Identity(PhaseTransform *phase) {
810 return (in(1)->Opcode() == Op_ConvI2D) ? in(1)->in(1) : this;
811 }
812
813 //=============================================================================
814 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const815 const Type *ConvD2LNode::Value( PhaseTransform *phase ) const {
816 const Type *t = phase->type( in(1) );
817 if( t == Type::TOP ) return Type::TOP;
818 if( t == Type::DOUBLE ) return TypeLong::LONG;
819 const TypeD *td = t->is_double_constant();
820 return TypeLong::make( SharedRuntime::d2l( td->getd() ) );
821 }
822
823 //------------------------------Identity---------------------------------------
Identity(PhaseTransform * phase)824 Node *ConvD2LNode::Identity(PhaseTransform *phase) {
825 // Remove ConvD2L->ConvL2D->ConvD2L sequences.
826 if( in(1) ->Opcode() == Op_ConvL2D &&
827 in(1)->in(1)->Opcode() == Op_ConvD2L )
828 return in(1)->in(1);
829 return this;
830 }
831
832 //------------------------------Ideal------------------------------------------
833 // If converting to an int type, skip any rounding nodes
Ideal(PhaseGVN * phase,bool can_reshape)834 Node *ConvD2LNode::Ideal(PhaseGVN *phase, bool can_reshape) {
835 if( in(1)->Opcode() == Op_RoundDouble )
836 set_req(1,in(1)->in(1));
837 return NULL;
838 }
839
840 //=============================================================================
841 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const842 const Type *ConvF2DNode::Value( PhaseTransform *phase ) const {
843 const Type *t = phase->type( in(1) );
844 if( t == Type::TOP ) return Type::TOP;
845 if( t == Type::FLOAT ) return Type::DOUBLE;
846 const TypeF *tf = t->is_float_constant();
847 return TypeD::make( (double)tf->getf() );
848 }
849
850 //=============================================================================
851 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const852 const Type *ConvF2INode::Value( PhaseTransform *phase ) const {
853 const Type *t = phase->type( in(1) );
854 if( t == Type::TOP ) return Type::TOP;
855 if( t == Type::FLOAT ) return TypeInt::INT;
856 const TypeF *tf = t->is_float_constant();
857 return TypeInt::make( SharedRuntime::f2i( tf->getf() ) );
858 }
859
860 //------------------------------Identity---------------------------------------
Identity(PhaseTransform * phase)861 Node *ConvF2INode::Identity(PhaseTransform *phase) {
862 // Remove ConvF2I->ConvI2F->ConvF2I sequences.
863 if( in(1) ->Opcode() == Op_ConvI2F &&
864 in(1)->in(1)->Opcode() == Op_ConvF2I )
865 return in(1)->in(1);
866 return this;
867 }
868
869 //------------------------------Ideal------------------------------------------
870 // If converting to an int type, skip any rounding nodes
Ideal(PhaseGVN * phase,bool can_reshape)871 Node *ConvF2INode::Ideal(PhaseGVN *phase, bool can_reshape) {
872 if( in(1)->Opcode() == Op_RoundFloat )
873 set_req(1,in(1)->in(1));
874 return NULL;
875 }
876
877 //=============================================================================
878 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const879 const Type *ConvF2LNode::Value( PhaseTransform *phase ) const {
880 const Type *t = phase->type( in(1) );
881 if( t == Type::TOP ) return Type::TOP;
882 if( t == Type::FLOAT ) return TypeLong::LONG;
883 const TypeF *tf = t->is_float_constant();
884 return TypeLong::make( SharedRuntime::f2l( tf->getf() ) );
885 }
886
887 //------------------------------Identity---------------------------------------
Identity(PhaseTransform * phase)888 Node *ConvF2LNode::Identity(PhaseTransform *phase) {
889 // Remove ConvF2L->ConvL2F->ConvF2L sequences.
890 if( in(1) ->Opcode() == Op_ConvL2F &&
891 in(1)->in(1)->Opcode() == Op_ConvF2L )
892 return in(1)->in(1);
893 return this;
894 }
895
896 //------------------------------Ideal------------------------------------------
897 // If converting to an int type, skip any rounding nodes
Ideal(PhaseGVN * phase,bool can_reshape)898 Node *ConvF2LNode::Ideal(PhaseGVN *phase, bool can_reshape) {
899 if( in(1)->Opcode() == Op_RoundFloat )
900 set_req(1,in(1)->in(1));
901 return NULL;
902 }
903
904 //=============================================================================
905 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const906 const Type *ConvI2DNode::Value( PhaseTransform *phase ) const {
907 const Type *t = phase->type( in(1) );
908 if( t == Type::TOP ) return Type::TOP;
909 const TypeInt *ti = t->is_int();
910 if( ti->is_con() ) return TypeD::make( (double)ti->get_con() );
911 return bottom_type();
912 }
913
914 //=============================================================================
915 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const916 const Type *ConvI2FNode::Value( PhaseTransform *phase ) const {
917 const Type *t = phase->type( in(1) );
918 if( t == Type::TOP ) return Type::TOP;
919 const TypeInt *ti = t->is_int();
920 if( ti->is_con() ) return TypeF::make( (float)ti->get_con() );
921 return bottom_type();
922 }
923
924 //------------------------------Identity---------------------------------------
Identity(PhaseTransform * phase)925 Node *ConvI2FNode::Identity(PhaseTransform *phase) {
926 // Remove ConvI2F->ConvF2I->ConvI2F sequences.
927 if( in(1) ->Opcode() == Op_ConvF2I &&
928 in(1)->in(1)->Opcode() == Op_ConvI2F )
929 return in(1)->in(1);
930 return this;
931 }
932
933 //=============================================================================
934 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const935 const Type *ConvI2LNode::Value( PhaseTransform *phase ) const {
936 const Type *t = phase->type( in(1) );
937 if( t == Type::TOP ) return Type::TOP;
938 const TypeInt *ti = t->is_int();
939 const Type* tl = TypeLong::make(ti->_lo, ti->_hi, ti->_widen);
940 // Join my declared type against my incoming type.
941 tl = tl->filter(_type);
942 return tl;
943 }
944
945 #ifdef _LP64
long_ranges_overlap(jlong lo1,jlong hi1,jlong lo2,jlong hi2)946 static inline bool long_ranges_overlap(jlong lo1, jlong hi1,
947 jlong lo2, jlong hi2) {
948 // Two ranges overlap iff one range's low point falls in the other range.
949 return (lo2 <= lo1 && lo1 <= hi2) || (lo1 <= lo2 && lo2 <= hi1);
950 }
951 #endif
952
953 //------------------------------Ideal------------------------------------------
Ideal(PhaseGVN * phase,bool can_reshape)954 Node *ConvI2LNode::Ideal(PhaseGVN *phase, bool can_reshape) {
955 const TypeLong* this_type = this->type()->is_long();
956 Node* this_changed = NULL;
957
958 // If _major_progress, then more loop optimizations follow. Do NOT
959 // remove this node's type assertion until no more loop ops can happen.
960 // The progress bit is set in the major loop optimizations THEN comes the
961 // call to IterGVN and any chance of hitting this code. Cf. Opaque1Node.
962 if (can_reshape && !phase->C->major_progress()) {
963 const TypeInt* in_type = phase->type(in(1))->isa_int();
964 if (in_type != NULL && this_type != NULL &&
965 (in_type->_lo != this_type->_lo ||
966 in_type->_hi != this_type->_hi)) {
967 // Although this WORSENS the type, it increases GVN opportunities,
968 // because I2L nodes with the same input will common up, regardless
969 // of slightly differing type assertions. Such slight differences
970 // arise routinely as a result of loop unrolling, so this is a
971 // post-unrolling graph cleanup. Choose a type which depends only
972 // on my input. (Exception: Keep a range assertion of >=0 or <0.)
973 jlong lo1 = this_type->_lo;
974 jlong hi1 = this_type->_hi;
975 int w1 = this_type->_widen;
976 if (lo1 != (jint)lo1 ||
977 hi1 != (jint)hi1 ||
978 lo1 > hi1) {
979 // Overflow leads to wraparound, wraparound leads to range saturation.
980 lo1 = min_jint; hi1 = max_jint;
981 } else if (lo1 >= 0) {
982 // Keep a range assertion of >=0.
983 lo1 = 0; hi1 = max_jint;
984 } else if (hi1 < 0) {
985 // Keep a range assertion of <0.
986 lo1 = min_jint; hi1 = -1;
987 } else {
988 lo1 = min_jint; hi1 = max_jint;
989 }
990 const TypeLong* wtype = TypeLong::make(MAX2((jlong)in_type->_lo, lo1),
991 MIN2((jlong)in_type->_hi, hi1),
992 MAX2((int)in_type->_widen, w1));
993 if (wtype != type()) {
994 set_type(wtype);
995 // Note: this_type still has old type value, for the logic below.
996 this_changed = this;
997 }
998 }
999 }
1000
1001 #ifdef _LP64
1002 // Convert ConvI2L(AddI(x, y)) to AddL(ConvI2L(x), ConvI2L(y))
1003 // but only if x and y have subranges that cannot cause 32-bit overflow,
1004 // under the assumption that x+y is in my own subrange this->type().
1005
1006 // This assumption is based on a constraint (i.e., type assertion)
1007 // established in Parse::array_addressing or perhaps elsewhere.
1008 // This constraint has been adjoined to the "natural" type of
1009 // the incoming argument in(0). We know (because of runtime
1010 // checks) - that the result value I2L(x+y) is in the joined range.
1011 // Hence we can restrict the incoming terms (x, y) to values such
1012 // that their sum also lands in that range.
1013
1014 // This optimization is useful only on 64-bit systems, where we hope
1015 // the addition will end up subsumed in an addressing mode.
1016 // It is necessary to do this when optimizing an unrolled array
1017 // copy loop such as x[i++] = y[i++].
1018
1019 // On 32-bit systems, it's better to perform as much 32-bit math as
1020 // possible before the I2L conversion, because 32-bit math is cheaper.
1021 // There's no common reason to "leak" a constant offset through the I2L.
1022 // Addressing arithmetic will not absorb it as part of a 64-bit AddL.
1023
1024 Node* z = in(1);
1025 int op = z->Opcode();
1026 if (op == Op_AddI || op == Op_SubI) {
1027 Node* x = z->in(1);
1028 Node* y = z->in(2);
1029 assert (x != z && y != z, "dead loop in ConvI2LNode::Ideal");
1030 if (phase->type(x) == Type::TOP) return this_changed;
1031 if (phase->type(y) == Type::TOP) return this_changed;
1032 const TypeInt* tx = phase->type(x)->is_int();
1033 const TypeInt* ty = phase->type(y)->is_int();
1034 const TypeLong* tz = this_type;
1035 jlong xlo = tx->_lo;
1036 jlong xhi = tx->_hi;
1037 jlong ylo = ty->_lo;
1038 jlong yhi = ty->_hi;
1039 jlong zlo = tz->_lo;
1040 jlong zhi = tz->_hi;
1041 jlong vbit = CONST64(1) << BitsPerInt;
1042 int widen = MAX2(tx->_widen, ty->_widen);
1043 if (op == Op_SubI) {
1044 jlong ylo0 = ylo;
1045 ylo = -yhi;
1046 yhi = -ylo0;
1047 }
1048 // See if x+y can cause positive overflow into z+2**32
1049 if (long_ranges_overlap(xlo+ylo, xhi+yhi, zlo+vbit, zhi+vbit)) {
1050 return this_changed;
1051 }
1052 // See if x+y can cause negative overflow into z-2**32
1053 if (long_ranges_overlap(xlo+ylo, xhi+yhi, zlo-vbit, zhi-vbit)) {
1054 return this_changed;
1055 }
1056 // Now it's always safe to assume x+y does not overflow.
1057 // This is true even if some pairs x,y might cause overflow, as long
1058 // as that overflow value cannot fall into [zlo,zhi].
1059
1060 // Confident that the arithmetic is "as if infinite precision",
1061 // we can now use z's range to put constraints on those of x and y.
1062 // The "natural" range of x [xlo,xhi] can perhaps be narrowed to a
1063 // more "restricted" range by intersecting [xlo,xhi] with the
1064 // range obtained by subtracting y's range from the asserted range
1065 // of the I2L conversion. Here's the interval arithmetic algebra:
1066 // x == z-y == [zlo,zhi]-[ylo,yhi] == [zlo,zhi]+[-yhi,-ylo]
1067 // => x in [zlo-yhi, zhi-ylo]
1068 // => x in [zlo-yhi, zhi-ylo] INTERSECT [xlo,xhi]
1069 // => x in [xlo MAX zlo-yhi, xhi MIN zhi-ylo]
1070 jlong rxlo = MAX2(xlo, zlo - yhi);
1071 jlong rxhi = MIN2(xhi, zhi - ylo);
1072 // And similarly, x changing place with y:
1073 jlong rylo = MAX2(ylo, zlo - xhi);
1074 jlong ryhi = MIN2(yhi, zhi - xlo);
1075 if (rxlo > rxhi || rylo > ryhi) {
1076 return this_changed; // x or y is dying; don't mess w/ it
1077 }
1078 if (op == Op_SubI) {
1079 jlong rylo0 = rylo;
1080 rylo = -ryhi;
1081 ryhi = -rylo0;
1082 }
1083 assert(rxlo == (int)rxlo && rxhi == (int)rxhi, "x should not overflow");
1084 assert(rylo == (int)rylo && ryhi == (int)ryhi, "y should not overflow");
1085 Node* cx = phase->C->constrained_convI2L(phase, x, TypeInt::make(rxlo, rxhi, widen), NULL);
1086 Node *hook = new (phase->C) Node(1);
1087 hook->init_req(0, cx); // Add a use to cx to prevent him from dying
1088 Node* cy = phase->C->constrained_convI2L(phase, y, TypeInt::make(rylo, ryhi, widen), NULL);
1089 hook->del_req(0); // Just yank bogus edge
1090 hook->destruct();
1091 switch (op) {
1092 case Op_AddI: return new (phase->C) AddLNode(cx, cy);
1093 case Op_SubI: return new (phase->C) SubLNode(cx, cy);
1094 default: ShouldNotReachHere();
1095 }
1096 }
1097 #endif //_LP64
1098
1099 return this_changed;
1100 }
1101
1102 //=============================================================================
1103 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const1104 const Type *ConvL2DNode::Value( PhaseTransform *phase ) const {
1105 const Type *t = phase->type( in(1) );
1106 if( t == Type::TOP ) return Type::TOP;
1107 const TypeLong *tl = t->is_long();
1108 if( tl->is_con() ) return TypeD::make( (double)tl->get_con() );
1109 return bottom_type();
1110 }
1111
1112 //=============================================================================
1113 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const1114 const Type *ConvL2FNode::Value( PhaseTransform *phase ) const {
1115 const Type *t = phase->type( in(1) );
1116 if( t == Type::TOP ) return Type::TOP;
1117 const TypeLong *tl = t->is_long();
1118 if( tl->is_con() ) return TypeF::make( (float)tl->get_con() );
1119 return bottom_type();
1120 }
1121
1122 //=============================================================================
1123 //----------------------------Identity-----------------------------------------
Identity(PhaseTransform * phase)1124 Node *ConvL2INode::Identity( PhaseTransform *phase ) {
1125 // Convert L2I(I2L(x)) => x
1126 if (in(1)->Opcode() == Op_ConvI2L) return in(1)->in(1);
1127 return this;
1128 }
1129
1130 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const1131 const Type *ConvL2INode::Value( PhaseTransform *phase ) const {
1132 const Type *t = phase->type( in(1) );
1133 if( t == Type::TOP ) return Type::TOP;
1134 const TypeLong *tl = t->is_long();
1135 if (tl->is_con())
1136 // Easy case.
1137 return TypeInt::make((jint)tl->get_con());
1138 return bottom_type();
1139 }
1140
1141 //------------------------------Ideal------------------------------------------
1142 // Return a node which is more "ideal" than the current node.
1143 // Blow off prior masking to int
Ideal(PhaseGVN * phase,bool can_reshape)1144 Node *ConvL2INode::Ideal(PhaseGVN *phase, bool can_reshape) {
1145 Node *andl = in(1);
1146 uint andl_op = andl->Opcode();
1147 if( andl_op == Op_AndL ) {
1148 // Blow off prior masking to int
1149 if( phase->type(andl->in(2)) == TypeLong::make( 0xFFFFFFFF ) ) {
1150 set_req(1,andl->in(1));
1151 return this;
1152 }
1153 }
1154
1155 // Swap with a prior add: convL2I(addL(x,y)) ==> addI(convL2I(x),convL2I(y))
1156 // This replaces an 'AddL' with an 'AddI'.
1157 if( andl_op == Op_AddL ) {
1158 // Don't do this for nodes which have more than one user since
1159 // we'll end up computing the long add anyway.
1160 if (andl->outcnt() > 1) return NULL;
1161
1162 Node* x = andl->in(1);
1163 Node* y = andl->in(2);
1164 assert( x != andl && y != andl, "dead loop in ConvL2INode::Ideal" );
1165 if (phase->type(x) == Type::TOP) return NULL;
1166 if (phase->type(y) == Type::TOP) return NULL;
1167 Node *add1 = phase->transform(new (phase->C) ConvL2INode(x));
1168 Node *add2 = phase->transform(new (phase->C) ConvL2INode(y));
1169 return new (phase->C) AddINode(add1,add2);
1170 }
1171
1172 // Disable optimization: LoadL->ConvL2I ==> LoadI.
1173 // It causes problems (sizes of Load and Store nodes do not match)
1174 // in objects initialization code and Escape Analysis.
1175 return NULL;
1176 }
1177
1178 //=============================================================================
1179 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const1180 const Type *CastX2PNode::Value( PhaseTransform *phase ) const {
1181 const Type* t = phase->type(in(1));
1182 if (t == Type::TOP) return Type::TOP;
1183 if (t->base() == Type_X && t->singleton()) {
1184 uintptr_t bits = (uintptr_t) t->is_intptr_t()->get_con();
1185 if (bits == 0) return TypePtr::NULL_PTR;
1186 return TypeRawPtr::make((address) bits);
1187 }
1188 return CastX2PNode::bottom_type();
1189 }
1190
1191 //------------------------------Idealize---------------------------------------
fits_in_int(const Type * t,bool but_not_min_int=false)1192 static inline bool fits_in_int(const Type* t, bool but_not_min_int = false) {
1193 if (t == Type::TOP) return false;
1194 const TypeX* tl = t->is_intptr_t();
1195 jint lo = min_jint;
1196 jint hi = max_jint;
1197 if (but_not_min_int) ++lo; // caller wants to negate the value w/o overflow
1198 return (tl->_lo >= lo) && (tl->_hi <= hi);
1199 }
1200
addP_of_X2P(PhaseGVN * phase,Node * base,Node * dispX,bool negate=false)1201 static inline Node* addP_of_X2P(PhaseGVN *phase,
1202 Node* base,
1203 Node* dispX,
1204 bool negate = false) {
1205 if (negate) {
1206 dispX = new (phase->C) SubXNode(phase->MakeConX(0), phase->transform(dispX));
1207 }
1208 return new (phase->C) AddPNode(phase->C->top(),
1209 phase->transform(new (phase->C) CastX2PNode(base)),
1210 phase->transform(dispX));
1211 }
1212
Ideal(PhaseGVN * phase,bool can_reshape)1213 Node *CastX2PNode::Ideal(PhaseGVN *phase, bool can_reshape) {
1214 // convert CastX2P(AddX(x, y)) to AddP(CastX2P(x), y) if y fits in an int
1215 int op = in(1)->Opcode();
1216 Node* x;
1217 Node* y;
1218 switch (op) {
1219 case Op_SubX:
1220 x = in(1)->in(1);
1221 // Avoid ideal transformations ping-pong between this and AddP for raw pointers.
1222 if (phase->find_intptr_t_con(x, -1) == 0)
1223 break;
1224 y = in(1)->in(2);
1225 if (fits_in_int(phase->type(y), true)) {
1226 return addP_of_X2P(phase, x, y, true);
1227 }
1228 break;
1229 case Op_AddX:
1230 x = in(1)->in(1);
1231 y = in(1)->in(2);
1232 if (fits_in_int(phase->type(y))) {
1233 return addP_of_X2P(phase, x, y);
1234 }
1235 if (fits_in_int(phase->type(x))) {
1236 return addP_of_X2P(phase, y, x);
1237 }
1238 break;
1239 }
1240 return NULL;
1241 }
1242
1243 //------------------------------Identity---------------------------------------
Identity(PhaseTransform * phase)1244 Node *CastX2PNode::Identity( PhaseTransform *phase ) {
1245 if (in(1)->Opcode() == Op_CastP2X) return in(1)->in(1);
1246 return this;
1247 }
1248
1249 //=============================================================================
1250 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const1251 const Type *CastP2XNode::Value( PhaseTransform *phase ) const {
1252 const Type* t = phase->type(in(1));
1253 if (t == Type::TOP) return Type::TOP;
1254 if (t->base() == Type::RawPtr && t->singleton()) {
1255 uintptr_t bits = (uintptr_t) t->is_rawptr()->get_con();
1256 return TypeX::make(bits);
1257 }
1258 return CastP2XNode::bottom_type();
1259 }
1260
Ideal(PhaseGVN * phase,bool can_reshape)1261 Node *CastP2XNode::Ideal(PhaseGVN *phase, bool can_reshape) {
1262 return (in(0) && remove_dead_region(phase, can_reshape)) ? this : NULL;
1263 }
1264
1265 //------------------------------Identity---------------------------------------
Identity(PhaseTransform * phase)1266 Node *CastP2XNode::Identity( PhaseTransform *phase ) {
1267 if (in(1)->Opcode() == Op_CastX2P) return in(1)->in(1);
1268 return this;
1269 }
1270
1271
1272 //=============================================================================
1273 //------------------------------Identity---------------------------------------
1274 // Remove redundant roundings
Identity(PhaseTransform * phase)1275 Node *RoundFloatNode::Identity( PhaseTransform *phase ) {
1276 assert(Matcher::strict_fp_requires_explicit_rounding, "should only generate for Intel");
1277 // Do not round constants
1278 if (phase->type(in(1))->base() == Type::FloatCon) return in(1);
1279 int op = in(1)->Opcode();
1280 // Redundant rounding
1281 if( op == Op_RoundFloat ) return in(1);
1282 // Already rounded
1283 if( op == Op_Parm ) return in(1);
1284 if( op == Op_LoadF ) return in(1);
1285 return this;
1286 }
1287
1288 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const1289 const Type *RoundFloatNode::Value( PhaseTransform *phase ) const {
1290 return phase->type( in(1) );
1291 }
1292
1293 //=============================================================================
1294 //------------------------------Identity---------------------------------------
1295 // Remove redundant roundings. Incoming arguments are already rounded.
Identity(PhaseTransform * phase)1296 Node *RoundDoubleNode::Identity( PhaseTransform *phase ) {
1297 assert(Matcher::strict_fp_requires_explicit_rounding, "should only generate for Intel");
1298 // Do not round constants
1299 if (phase->type(in(1))->base() == Type::DoubleCon) return in(1);
1300 int op = in(1)->Opcode();
1301 // Redundant rounding
1302 if( op == Op_RoundDouble ) return in(1);
1303 // Already rounded
1304 if( op == Op_Parm ) return in(1);
1305 if( op == Op_LoadD ) return in(1);
1306 if( op == Op_ConvF2D ) return in(1);
1307 if( op == Op_ConvI2D ) return in(1);
1308 return this;
1309 }
1310
1311 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const1312 const Type *RoundDoubleNode::Value( PhaseTransform *phase ) const {
1313 return phase->type( in(1) );
1314 }
1315
1316
1317 //=============================================================================
1318 // Do not allow value-numbering
hash() const1319 uint Opaque1Node::hash() const { return NO_HASH; }
cmp(const Node & n) const1320 uint Opaque1Node::cmp( const Node &n ) const {
1321 return (&n == this); // Always fail except on self
1322 }
1323
1324 //------------------------------Identity---------------------------------------
1325 // If _major_progress, then more loop optimizations follow. Do NOT remove
1326 // the opaque Node until no more loop ops can happen. Note the timing of
1327 // _major_progress; it's set in the major loop optimizations THEN comes the
1328 // call to IterGVN and any chance of hitting this code. Hence there's no
1329 // phase-ordering problem with stripping Opaque1 in IGVN followed by some
1330 // more loop optimizations that require it.
Identity(PhaseTransform * phase)1331 Node *Opaque1Node::Identity( PhaseTransform *phase ) {
1332 return phase->C->major_progress() ? this : in(1);
1333 }
1334
1335 //=============================================================================
1336 // A node to prevent unwanted optimizations. Allows constant folding. Stops
1337 // value-numbering, most Ideal calls or Identity functions. This Node is
1338 // specifically designed to prevent the pre-increment value of a loop trip
1339 // counter from being live out of the bottom of the loop (hence causing the
1340 // pre- and post-increment values both being live and thus requiring an extra
1341 // temp register and an extra move). If we "accidentally" optimize through
1342 // this kind of a Node, we'll get slightly pessimal, but correct, code. Thus
1343 // it's OK to be slightly sloppy on optimizations here.
1344
1345 // Do not allow value-numbering
hash() const1346 uint Opaque2Node::hash() const { return NO_HASH; }
cmp(const Node & n) const1347 uint Opaque2Node::cmp( const Node &n ) const {
1348 return (&n == this); // Always fail except on self
1349 }
1350
1351 //=============================================================================
1352
hash() const1353 uint ProfileBooleanNode::hash() const { return NO_HASH; }
cmp(const Node & n) const1354 uint ProfileBooleanNode::cmp( const Node &n ) const {
1355 return (&n == this);
1356 }
1357
Ideal(PhaseGVN * phase,bool can_reshape)1358 Node *ProfileBooleanNode::Ideal(PhaseGVN *phase, bool can_reshape) {
1359 if (can_reshape && _delay_removal) {
1360 _delay_removal = false;
1361 return this;
1362 } else {
1363 return NULL;
1364 }
1365 }
1366
Identity(PhaseTransform * phase)1367 Node *ProfileBooleanNode::Identity( PhaseTransform *phase ) {
1368 if (_delay_removal) {
1369 return this;
1370 } else {
1371 assert(_consumed, "profile should be consumed before elimination");
1372 return in(1);
1373 }
1374 }
1375
1376 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const1377 const Type *MoveL2DNode::Value( PhaseTransform *phase ) const {
1378 const Type *t = phase->type( in(1) );
1379 if( t == Type::TOP ) return Type::TOP;
1380 const TypeLong *tl = t->is_long();
1381 if( !tl->is_con() ) return bottom_type();
1382 JavaValue v;
1383 v.set_jlong(tl->get_con());
1384 return TypeD::make( v.get_jdouble() );
1385 }
1386
1387 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const1388 const Type *MoveI2FNode::Value( PhaseTransform *phase ) const {
1389 const Type *t = phase->type( in(1) );
1390 if( t == Type::TOP ) return Type::TOP;
1391 const TypeInt *ti = t->is_int();
1392 if( !ti->is_con() ) return bottom_type();
1393 JavaValue v;
1394 v.set_jint(ti->get_con());
1395 return TypeF::make( v.get_jfloat() );
1396 }
1397
1398 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const1399 const Type *MoveF2INode::Value( PhaseTransform *phase ) const {
1400 const Type *t = phase->type( in(1) );
1401 if( t == Type::TOP ) return Type::TOP;
1402 if( t == Type::FLOAT ) return TypeInt::INT;
1403 const TypeF *tf = t->is_float_constant();
1404 JavaValue v;
1405 v.set_jfloat(tf->getf());
1406 return TypeInt::make( v.get_jint() );
1407 }
1408
1409 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const1410 const Type *MoveD2LNode::Value( PhaseTransform *phase ) const {
1411 const Type *t = phase->type( in(1) );
1412 if( t == Type::TOP ) return Type::TOP;
1413 if( t == Type::DOUBLE ) return TypeLong::LONG;
1414 const TypeD *td = t->is_double_constant();
1415 JavaValue v;
1416 v.set_jdouble(td->getd());
1417 return TypeLong::make( v.get_jlong() );
1418 }
1419
1420 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const1421 const Type* CountLeadingZerosINode::Value(PhaseTransform* phase) const {
1422 const Type* t = phase->type(in(1));
1423 if (t == Type::TOP) return Type::TOP;
1424 const TypeInt* ti = t->isa_int();
1425 if (ti && ti->is_con()) {
1426 jint i = ti->get_con();
1427 // HD, Figure 5-6
1428 if (i == 0)
1429 return TypeInt::make(BitsPerInt);
1430 int n = 1;
1431 unsigned int x = i;
1432 if (x >> 16 == 0) { n += 16; x <<= 16; }
1433 if (x >> 24 == 0) { n += 8; x <<= 8; }
1434 if (x >> 28 == 0) { n += 4; x <<= 4; }
1435 if (x >> 30 == 0) { n += 2; x <<= 2; }
1436 n -= x >> 31;
1437 return TypeInt::make(n);
1438 }
1439 return TypeInt::INT;
1440 }
1441
1442 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const1443 const Type* CountLeadingZerosLNode::Value(PhaseTransform* phase) const {
1444 const Type* t = phase->type(in(1));
1445 if (t == Type::TOP) return Type::TOP;
1446 const TypeLong* tl = t->isa_long();
1447 if (tl && tl->is_con()) {
1448 jlong l = tl->get_con();
1449 // HD, Figure 5-6
1450 if (l == 0)
1451 return TypeInt::make(BitsPerLong);
1452 int n = 1;
1453 unsigned int x = (((julong) l) >> 32);
1454 if (x == 0) { n += 32; x = (int) l; }
1455 if (x >> 16 == 0) { n += 16; x <<= 16; }
1456 if (x >> 24 == 0) { n += 8; x <<= 8; }
1457 if (x >> 28 == 0) { n += 4; x <<= 4; }
1458 if (x >> 30 == 0) { n += 2; x <<= 2; }
1459 n -= x >> 31;
1460 return TypeInt::make(n);
1461 }
1462 return TypeInt::INT;
1463 }
1464
1465 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const1466 const Type* CountTrailingZerosINode::Value(PhaseTransform* phase) const {
1467 const Type* t = phase->type(in(1));
1468 if (t == Type::TOP) return Type::TOP;
1469 const TypeInt* ti = t->isa_int();
1470 if (ti && ti->is_con()) {
1471 jint i = ti->get_con();
1472 // HD, Figure 5-14
1473 int y;
1474 if (i == 0)
1475 return TypeInt::make(BitsPerInt);
1476 int n = 31;
1477 y = i << 16; if (y != 0) { n = n - 16; i = y; }
1478 y = i << 8; if (y != 0) { n = n - 8; i = y; }
1479 y = i << 4; if (y != 0) { n = n - 4; i = y; }
1480 y = i << 2; if (y != 0) { n = n - 2; i = y; }
1481 y = i << 1; if (y != 0) { n = n - 1; }
1482 return TypeInt::make(n);
1483 }
1484 return TypeInt::INT;
1485 }
1486
1487 //------------------------------Value------------------------------------------
Value(PhaseTransform * phase) const1488 const Type* CountTrailingZerosLNode::Value(PhaseTransform* phase) const {
1489 const Type* t = phase->type(in(1));
1490 if (t == Type::TOP) return Type::TOP;
1491 const TypeLong* tl = t->isa_long();
1492 if (tl && tl->is_con()) {
1493 jlong l = tl->get_con();
1494 // HD, Figure 5-14
1495 int x, y;
1496 if (l == 0)
1497 return TypeInt::make(BitsPerLong);
1498 int n = 63;
1499 y = (int) l; if (y != 0) { n = n - 32; x = y; } else x = (((julong) l) >> 32);
1500 y = x << 16; if (y != 0) { n = n - 16; x = y; }
1501 y = x << 8; if (y != 0) { n = n - 8; x = y; }
1502 y = x << 4; if (y != 0) { n = n - 4; x = y; }
1503 y = x << 2; if (y != 0) { n = n - 2; x = y; }
1504 y = x << 1; if (y != 0) { n = n - 1; }
1505 return TypeInt::make(n);
1506 }
1507 return TypeInt::INT;
1508 }
1509