16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "opto/addnode.hpp"
27 #include "opto/castnode.hpp"
28 #include "opto/connode.hpp"
29 #include "opto/matcher.hpp"
30 #include "opto/phaseX.hpp"
31 #include "opto/subnode.hpp"
32 #include "opto/type.hpp"
33
34 //=============================================================================
35 // If input is already higher or equal to cast type, then this is an identity.
36 Node *ConstraintCastNode::Identity( PhaseTransform *phase ) {
37 return phase->type(in(1))->higher_equal_speculative(_type) ? in(1) : this;
38 }
39
40 //------------------------------Value------------------------------------------
41 // Take 'join' of input and cast-up type
42 const Type *ConstraintCastNode::Value( PhaseTransform *phase ) const {
43 if( in(0) && phase->type(in(0)) == Type::TOP ) return Type::TOP;
44 const Type* ft = phase->type(in(1))->filter_speculative(_type);
45
46 #ifdef ASSERT
47 // Previous versions of this function had some special case logic,
48 // which is no longer necessary. Make sure of the required effects.
49 switch (Opcode()) {
50 case Op_CastII:
51 {
52 const Type* t1 = phase->type(in(1));
53 if( t1 == Type::TOP ) assert(ft == Type::TOP, "special case #1");
54 const Type* rt = t1->join_speculative(_type);
55 if (rt->empty()) assert(ft == Type::TOP, "special case #2");
56 break;
57 }
58 case Op_CastPP:
59 if (phase->type(in(1)) == TypePtr::NULL_PTR &&
60 _type->isa_ptr() && _type->is_ptr()->_ptr == TypePtr::NotNull)
61 assert(ft == Type::TOP, "special case #3");
62 break;
64 #endif //ASSERT
65
66 return ft;
67 }
68
69 //------------------------------Ideal------------------------------------------
70 // Return a node which is more "ideal" than the current node. Strip out
71 // control copies
72 Node *ConstraintCastNode::Ideal(PhaseGVN *phase, bool can_reshape){
73 return (in(0) && remove_dead_region(phase, can_reshape)) ? this : NULL;
74 }
75
76 uint CastIINode::size_of() const {
77 return sizeof(*this);
78 }
79
80 uint CastIINode::cmp(const Node &n) const {
81 return TypeNode::cmp(n) && ((CastIINode&)n)._carry_dependency == _carry_dependency;
82 }
83
84 Node *CastIINode::Identity(PhaseTransform *phase) {
85 if (_carry_dependency) {
86 return this;
87 }
88 return ConstraintCastNode::Identity(phase);
89 }
90
91 const Type *CastIINode::Value(PhaseTransform *phase) const {
92 const Type *res = ConstraintCastNode::Value(phase);
93
94 // Try to improve the type of the CastII if we recognize a CmpI/If
95 // pattern.
96 if (_carry_dependency) {
97 if (in(0) != NULL && in(0)->in(0) != NULL && in(0)->in(0)->is_If()) {
98 assert(in(0)->is_IfFalse() || in(0)->is_IfTrue(), "should be If proj");
99 Node* proj = in(0);
100 if (proj->in(0)->in(1)->is_Bool()) {
101 Node* b = proj->in(0)->in(1);
102 if (b->in(1)->Opcode() == Op_CmpI) {
103 Node* cmp = b->in(1);
104 if (cmp->in(1) == in(1) && phase->type(cmp->in(2))->isa_int()) {
105 const TypeInt* in2_t = phase->type(cmp->in(2))->is_int();
106 const Type* t = TypeInt::INT;
107 BoolTest test = b->as_Bool()->_test;
108 if (proj->is_IfFalse()) {
109 test = test.negate();
110 }
111 BoolTest::mask m = test._test;
149 }
150 }
151 }
152 }
153 }
154 return res;
155 }
156
157 #ifndef PRODUCT
158 void CastIINode::dump_spec(outputStream *st) const {
159 TypeNode::dump_spec(st);
160 if (_carry_dependency) {
161 st->print(" carry dependency");
162 }
163 }
164 #endif
165
166 //=============================================================================
167 //------------------------------Identity---------------------------------------
168 // If input is already higher or equal to cast type, then this is an identity.
169 Node *CheckCastPPNode::Identity( PhaseTransform *phase ) {
170 // Toned down to rescue meeting at a Phi 3 different oops all implementing
171 // the same interface. CompileTheWorld starting at 502, kd12rc1.zip.
172 return (phase->type(in(1)) == phase->type(this)) ? in(1) : this;
173 }
174
175 //------------------------------Value------------------------------------------
176 // Take 'join' of input and cast-up type, unless working with an Interface
177 const Type *CheckCastPPNode::Value( PhaseTransform *phase ) const {
178 if( in(0) && phase->type(in(0)) == Type::TOP ) return Type::TOP;
179
180 const Type *inn = phase->type(in(1));
181 if( inn == Type::TOP ) return Type::TOP; // No information yet
182
183 const TypePtr *in_type = inn->isa_ptr();
184 const TypePtr *my_type = _type->isa_ptr();
185 const Type *result = _type;
186 if( in_type != NULL && my_type != NULL ) {
187 TypePtr::PTR in_ptr = in_type->ptr();
188 if (in_ptr == TypePtr::Null) {
189 result = in_type;
190 } else if (in_ptr == TypePtr::Constant) {
191 const TypeOopPtr *jptr = my_type->isa_oopptr();
192 assert(jptr, "");
193 result = !in_type->higher_equal(_type)
194 ? my_type->cast_to_ptr_type(TypePtr::NotNull)
195 : in_type;
196 } else {
197 result = my_type->cast_to_ptr_type( my_type->join_ptr(in_ptr) );
247 // if( type_ptr == TypePtr::BotPTR || type_ptr == TypePtr::Null ||
248 // join_ptr == TypePtr::NotNull || join_ptr == TypePtr::Constant ) {
249 // return join;
250 // }
251 // // ELSE return same old type as before
252 // return _type;
253 // }
254 // // Not joining two pointers
255 // return join;
256 }
257
258 //------------------------------Ideal------------------------------------------
259 // Return a node which is more "ideal" than the current node. Strip out
260 // control copies
261 Node *CheckCastPPNode::Ideal(PhaseGVN *phase, bool can_reshape){
262 return (in(0) && remove_dead_region(phase, can_reshape)) ? this : NULL;
263 }
264
265 //=============================================================================
266 //------------------------------Value------------------------------------------
267 const Type *CastX2PNode::Value( PhaseTransform *phase ) const {
268 const Type* t = phase->type(in(1));
269 if (t == Type::TOP) return Type::TOP;
270 if (t->base() == Type_X && t->singleton()) {
271 uintptr_t bits = (uintptr_t) t->is_intptr_t()->get_con();
272 if (bits == 0) return TypePtr::NULL_PTR;
273 return TypeRawPtr::make((address) bits);
274 }
275 return CastX2PNode::bottom_type();
276 }
277
278 //------------------------------Idealize---------------------------------------
279 static inline bool fits_in_int(const Type* t, bool but_not_min_int = false) {
280 if (t == Type::TOP) return false;
281 const TypeX* tl = t->is_intptr_t();
282 jint lo = min_jint;
283 jint hi = max_jint;
284 if (but_not_min_int) ++lo; // caller wants to negate the value w/o overflow
285 return (tl->_lo >= lo) && (tl->_hi <= hi);
286 }
287
311 y = in(1)->in(2);
312 if (fits_in_int(phase->type(y), true)) {
313 return addP_of_X2P(phase, x, y, true);
314 }
315 break;
316 case Op_AddX:
317 x = in(1)->in(1);
318 y = in(1)->in(2);
319 if (fits_in_int(phase->type(y))) {
320 return addP_of_X2P(phase, x, y);
321 }
322 if (fits_in_int(phase->type(x))) {
323 return addP_of_X2P(phase, y, x);
324 }
325 break;
326 }
327 return NULL;
328 }
329
330 //------------------------------Identity---------------------------------------
331 Node *CastX2PNode::Identity( PhaseTransform *phase ) {
332 if (in(1)->Opcode() == Op_CastP2X) return in(1)->in(1);
333 return this;
334 }
335
336 //=============================================================================
337 //------------------------------Value------------------------------------------
338 const Type *CastP2XNode::Value( PhaseTransform *phase ) const {
339 const Type* t = phase->type(in(1));
340 if (t == Type::TOP) return Type::TOP;
341 if (t->base() == Type::RawPtr && t->singleton()) {
342 uintptr_t bits = (uintptr_t) t->is_rawptr()->get_con();
343 return TypeX::make(bits);
344 }
345 return CastP2XNode::bottom_type();
346 }
347
348 Node *CastP2XNode::Ideal(PhaseGVN *phase, bool can_reshape) {
349 return (in(0) && remove_dead_region(phase, can_reshape)) ? this : NULL;
350 }
351
352 //------------------------------Identity---------------------------------------
353 Node *CastP2XNode::Identity( PhaseTransform *phase ) {
354 if (in(1)->Opcode() == Op_CastX2P) return in(1)->in(1);
355 return this;
356 }
|
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "opto/addnode.hpp"
27 #include "opto/castnode.hpp"
28 #include "opto/connode.hpp"
29 #include "opto/matcher.hpp"
30 #include "opto/phaseX.hpp"
31 #include "opto/subnode.hpp"
32 #include "opto/type.hpp"
33
34 //=============================================================================
35 // If input is already higher or equal to cast type, then this is an identity.
36 Node* ConstraintCastNode::Identity(PhaseGVN* phase) {
37 return phase->type(in(1))->higher_equal_speculative(_type) ? in(1) : this;
38 }
39
40 //------------------------------Value------------------------------------------
41 // Take 'join' of input and cast-up type
42 const Type* ConstraintCastNode::Value(PhaseGVN* phase) const {
43 if( in(0) && phase->type(in(0)) == Type::TOP ) return Type::TOP;
44 const Type* ft = phase->type(in(1))->filter_speculative(_type);
45
46 #ifdef ASSERT
47 // Previous versions of this function had some special case logic,
48 // which is no longer necessary. Make sure of the required effects.
49 switch (Opcode()) {
50 case Op_CastII:
51 {
52 const Type* t1 = phase->type(in(1));
53 if( t1 == Type::TOP ) assert(ft == Type::TOP, "special case #1");
54 const Type* rt = t1->join_speculative(_type);
55 if (rt->empty()) assert(ft == Type::TOP, "special case #2");
56 break;
57 }
58 case Op_CastPP:
59 if (phase->type(in(1)) == TypePtr::NULL_PTR &&
60 _type->isa_ptr() && _type->is_ptr()->_ptr == TypePtr::NotNull)
61 assert(ft == Type::TOP, "special case #3");
62 break;
64 #endif //ASSERT
65
66 return ft;
67 }
68
69 //------------------------------Ideal------------------------------------------
70 // Return a node which is more "ideal" than the current node. Strip out
71 // control copies
72 Node *ConstraintCastNode::Ideal(PhaseGVN *phase, bool can_reshape){
73 return (in(0) && remove_dead_region(phase, can_reshape)) ? this : NULL;
74 }
75
76 uint CastIINode::size_of() const {
77 return sizeof(*this);
78 }
79
80 uint CastIINode::cmp(const Node &n) const {
81 return TypeNode::cmp(n) && ((CastIINode&)n)._carry_dependency == _carry_dependency;
82 }
83
84 Node* CastIINode::Identity(PhaseGVN* phase) {
85 if (_carry_dependency) {
86 return this;
87 }
88 return ConstraintCastNode::Identity(phase);
89 }
90
91 const Type* CastIINode::Value(PhaseGVN* phase) const {
92 const Type *res = ConstraintCastNode::Value(phase);
93
94 // Try to improve the type of the CastII if we recognize a CmpI/If
95 // pattern.
96 if (_carry_dependency) {
97 if (in(0) != NULL && in(0)->in(0) != NULL && in(0)->in(0)->is_If()) {
98 assert(in(0)->is_IfFalse() || in(0)->is_IfTrue(), "should be If proj");
99 Node* proj = in(0);
100 if (proj->in(0)->in(1)->is_Bool()) {
101 Node* b = proj->in(0)->in(1);
102 if (b->in(1)->Opcode() == Op_CmpI) {
103 Node* cmp = b->in(1);
104 if (cmp->in(1) == in(1) && phase->type(cmp->in(2))->isa_int()) {
105 const TypeInt* in2_t = phase->type(cmp->in(2))->is_int();
106 const Type* t = TypeInt::INT;
107 BoolTest test = b->as_Bool()->_test;
108 if (proj->is_IfFalse()) {
109 test = test.negate();
110 }
111 BoolTest::mask m = test._test;
149 }
150 }
151 }
152 }
153 }
154 return res;
155 }
156
157 #ifndef PRODUCT
158 void CastIINode::dump_spec(outputStream *st) const {
159 TypeNode::dump_spec(st);
160 if (_carry_dependency) {
161 st->print(" carry dependency");
162 }
163 }
164 #endif
165
166 //=============================================================================
167 //------------------------------Identity---------------------------------------
168 // If input is already higher or equal to cast type, then this is an identity.
169 Node* CheckCastPPNode::Identity(PhaseGVN* phase) {
170 // Toned down to rescue meeting at a Phi 3 different oops all implementing
171 // the same interface. CompileTheWorld starting at 502, kd12rc1.zip.
172 return (phase->type(in(1)) == phase->type(this)) ? in(1) : this;
173 }
174
175 //------------------------------Value------------------------------------------
176 // Take 'join' of input and cast-up type, unless working with an Interface
177 const Type* CheckCastPPNode::Value(PhaseGVN* phase) const {
178 if( in(0) && phase->type(in(0)) == Type::TOP ) return Type::TOP;
179
180 const Type *inn = phase->type(in(1));
181 if( inn == Type::TOP ) return Type::TOP; // No information yet
182
183 const TypePtr *in_type = inn->isa_ptr();
184 const TypePtr *my_type = _type->isa_ptr();
185 const Type *result = _type;
186 if( in_type != NULL && my_type != NULL ) {
187 TypePtr::PTR in_ptr = in_type->ptr();
188 if (in_ptr == TypePtr::Null) {
189 result = in_type;
190 } else if (in_ptr == TypePtr::Constant) {
191 const TypeOopPtr *jptr = my_type->isa_oopptr();
192 assert(jptr, "");
193 result = !in_type->higher_equal(_type)
194 ? my_type->cast_to_ptr_type(TypePtr::NotNull)
195 : in_type;
196 } else {
197 result = my_type->cast_to_ptr_type( my_type->join_ptr(in_ptr) );
247 // if( type_ptr == TypePtr::BotPTR || type_ptr == TypePtr::Null ||
248 // join_ptr == TypePtr::NotNull || join_ptr == TypePtr::Constant ) {
249 // return join;
250 // }
251 // // ELSE return same old type as before
252 // return _type;
253 // }
254 // // Not joining two pointers
255 // return join;
256 }
257
258 //------------------------------Ideal------------------------------------------
259 // Return a node which is more "ideal" than the current node. Strip out
260 // control copies
261 Node *CheckCastPPNode::Ideal(PhaseGVN *phase, bool can_reshape){
262 return (in(0) && remove_dead_region(phase, can_reshape)) ? this : NULL;
263 }
264
265 //=============================================================================
266 //------------------------------Value------------------------------------------
267 const Type* CastX2PNode::Value(PhaseGVN* phase) const {
268 const Type* t = phase->type(in(1));
269 if (t == Type::TOP) return Type::TOP;
270 if (t->base() == Type_X && t->singleton()) {
271 uintptr_t bits = (uintptr_t) t->is_intptr_t()->get_con();
272 if (bits == 0) return TypePtr::NULL_PTR;
273 return TypeRawPtr::make((address) bits);
274 }
275 return CastX2PNode::bottom_type();
276 }
277
278 //------------------------------Idealize---------------------------------------
279 static inline bool fits_in_int(const Type* t, bool but_not_min_int = false) {
280 if (t == Type::TOP) return false;
281 const TypeX* tl = t->is_intptr_t();
282 jint lo = min_jint;
283 jint hi = max_jint;
284 if (but_not_min_int) ++lo; // caller wants to negate the value w/o overflow
285 return (tl->_lo >= lo) && (tl->_hi <= hi);
286 }
287
311 y = in(1)->in(2);
312 if (fits_in_int(phase->type(y), true)) {
313 return addP_of_X2P(phase, x, y, true);
314 }
315 break;
316 case Op_AddX:
317 x = in(1)->in(1);
318 y = in(1)->in(2);
319 if (fits_in_int(phase->type(y))) {
320 return addP_of_X2P(phase, x, y);
321 }
322 if (fits_in_int(phase->type(x))) {
323 return addP_of_X2P(phase, y, x);
324 }
325 break;
326 }
327 return NULL;
328 }
329
330 //------------------------------Identity---------------------------------------
331 Node* CastX2PNode::Identity(PhaseGVN* phase) {
332 if (in(1)->Opcode() == Op_CastP2X) return in(1)->in(1);
333 return this;
334 }
335
336 //=============================================================================
337 //------------------------------Value------------------------------------------
338 const Type* CastP2XNode::Value(PhaseGVN* phase) const {
339 const Type* t = phase->type(in(1));
340 if (t == Type::TOP) return Type::TOP;
341 if (t->base() == Type::RawPtr && t->singleton()) {
342 uintptr_t bits = (uintptr_t) t->is_rawptr()->get_con();
343 return TypeX::make(bits);
344 }
345 return CastP2XNode::bottom_type();
346 }
347
348 Node *CastP2XNode::Ideal(PhaseGVN *phase, bool can_reshape) {
349 return (in(0) && remove_dead_region(phase, can_reshape)) ? this : NULL;
350 }
351
352 //------------------------------Identity---------------------------------------
353 Node* CastP2XNode::Identity(PhaseGVN* phase) {
354 if (in(1)->Opcode() == Op_CastX2P) return in(1)->in(1);
355 return this;
356 }
|