annotate src/share/vm/opto/connode.cpp @ 1994:6cd6d394f280

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