1 | /* |
2 | * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. |
3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 | * |
5 | * This code is free software; you can redistribute it and/or modify it |
6 | * under the terms of the GNU General Public License version 2 only, as |
7 | * published by the Free Software Foundation. |
8 | * |
9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
12 | * version 2 for more details (a copy is included in the LICENSE file that |
13 | * accompanied this code). |
14 | * |
15 | * You should have received a copy of the GNU General Public License version |
16 | * 2 along with this work; if not, write to the Free Software Foundation, |
17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
18 | * |
19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
20 | * or visit www.oracle.com if you need additional information or have any |
21 | * questions. |
22 | * |
23 | */ |
24 | |
25 | #include "precompiled.hpp" |
26 | #include "opto/addnode.hpp" |
27 | #include "opto/callnode.hpp" |
28 | #include "opto/castnode.hpp" |
29 | #include "opto/connode.hpp" |
30 | #include "opto/matcher.hpp" |
31 | #include "opto/phaseX.hpp" |
32 | #include "opto/subnode.hpp" |
33 | #include "opto/type.hpp" |
34 | |
35 | //============================================================================= |
36 | // If input is already higher or equal to cast type, then this is an identity. |
37 | Node* ConstraintCastNode::Identity(PhaseGVN* phase) { |
38 | Node* dom = dominating_cast(phase, phase); |
39 | if (dom != NULL) { |
40 | return dom; |
41 | } |
42 | if (_carry_dependency) { |
43 | return this; |
44 | } |
45 | return phase->type(in(1))->higher_equal_speculative(_type) ? in(1) : this; |
46 | } |
47 | |
48 | //------------------------------Value------------------------------------------ |
49 | // Take 'join' of input and cast-up type |
50 | const Type* ConstraintCastNode::Value(PhaseGVN* phase) const { |
51 | if (in(0) && phase->type(in(0)) == Type::TOP) return Type::TOP; |
52 | const Type* ft = phase->type(in(1))->filter_speculative(_type); |
53 | |
54 | #ifdef ASSERT |
55 | // Previous versions of this function had some special case logic, |
56 | // which is no longer necessary. Make sure of the required effects. |
57 | switch (Opcode()) { |
58 | case Op_CastII: |
59 | { |
60 | const Type* t1 = phase->type(in(1)); |
61 | if( t1 == Type::TOP ) assert(ft == Type::TOP, "special case #1" ); |
62 | const Type* rt = t1->join_speculative(_type); |
63 | if (rt->empty()) assert(ft == Type::TOP, "special case #2" ); |
64 | break; |
65 | } |
66 | case Op_CastPP: |
67 | if (phase->type(in(1)) == TypePtr::NULL_PTR && |
68 | _type->isa_ptr() && _type->is_ptr()->_ptr == TypePtr::NotNull) |
69 | assert(ft == Type::TOP, "special case #3" ); |
70 | break; |
71 | } |
72 | #endif //ASSERT |
73 | |
74 | return ft; |
75 | } |
76 | |
77 | //------------------------------Ideal------------------------------------------ |
78 | // Return a node which is more "ideal" than the current node. Strip out |
79 | // control copies |
80 | Node *ConstraintCastNode::Ideal(PhaseGVN *phase, bool can_reshape) { |
81 | return (in(0) && remove_dead_region(phase, can_reshape)) ? this : NULL; |
82 | } |
83 | |
84 | bool ConstraintCastNode::cmp(const Node &n) const { |
85 | return TypeNode::cmp(n) && ((ConstraintCastNode&)n)._carry_dependency == _carry_dependency; |
86 | } |
87 | |
88 | uint ConstraintCastNode::size_of() const { |
89 | return sizeof(*this); |
90 | } |
91 | |
92 | Node* ConstraintCastNode::make_cast(int opcode, Node* c, Node *n, const Type *t, bool carry_dependency) { |
93 | switch(opcode) { |
94 | case Op_CastII: { |
95 | Node* cast = new CastIINode(n, t, carry_dependency); |
96 | cast->set_req(0, c); |
97 | return cast; |
98 | } |
99 | case Op_CastPP: { |
100 | Node* cast = new CastPPNode(n, t, carry_dependency); |
101 | cast->set_req(0, c); |
102 | return cast; |
103 | } |
104 | case Op_CheckCastPP: return new CheckCastPPNode(c, n, t, carry_dependency); |
105 | default: |
106 | fatal("Bad opcode %d" , opcode); |
107 | } |
108 | return NULL; |
109 | } |
110 | |
111 | TypeNode* ConstraintCastNode::dominating_cast(PhaseGVN* gvn, PhaseTransform* pt) const { |
112 | Node* val = in(1); |
113 | Node* ctl = in(0); |
114 | int opc = Opcode(); |
115 | if (ctl == NULL) { |
116 | return NULL; |
117 | } |
118 | // Range check CastIIs may all end up under a single range check and |
119 | // in that case only the narrower CastII would be kept by the code |
120 | // below which would be incorrect. |
121 | if (is_CastII() && as_CastII()->has_range_check()) { |
122 | return NULL; |
123 | } |
124 | if (type()->isa_rawptr() && (gvn->type_or_null(val) == NULL || gvn->type(val)->isa_oopptr())) { |
125 | return NULL; |
126 | } |
127 | for (DUIterator_Fast imax, i = val->fast_outs(imax); i < imax; i++) { |
128 | Node* u = val->fast_out(i); |
129 | if (u != this && |
130 | u->outcnt() > 0 && |
131 | u->Opcode() == opc && |
132 | u->in(0) != NULL && |
133 | u->bottom_type()->higher_equal(type())) { |
134 | if (pt->is_dominator(u->in(0), ctl)) { |
135 | return u->as_Type(); |
136 | } |
137 | if (is_CheckCastPP() && u->in(1)->is_Proj() && u->in(1)->in(0)->is_Allocate() && |
138 | u->in(0)->is_Proj() && u->in(0)->in(0)->is_Initialize() && |
139 | u->in(1)->in(0)->as_Allocate()->initialization() == u->in(0)->in(0)) { |
140 | // CheckCastPP following an allocation always dominates all |
141 | // use of the allocation result |
142 | return u->as_Type(); |
143 | } |
144 | } |
145 | } |
146 | return NULL; |
147 | } |
148 | |
149 | #ifndef PRODUCT |
150 | void ConstraintCastNode::dump_spec(outputStream *st) const { |
151 | TypeNode::dump_spec(st); |
152 | if (_carry_dependency) { |
153 | st->print(" carry dependency" ); |
154 | } |
155 | } |
156 | #endif |
157 | |
158 | const Type* CastIINode::Value(PhaseGVN* phase) const { |
159 | const Type *res = ConstraintCastNode::Value(phase); |
160 | |
161 | // Try to improve the type of the CastII if we recognize a CmpI/If |
162 | // pattern. |
163 | if (_carry_dependency) { |
164 | if (in(0) != NULL && in(0)->in(0) != NULL && in(0)->in(0)->is_If()) { |
165 | assert(in(0)->is_IfFalse() || in(0)->is_IfTrue(), "should be If proj" ); |
166 | Node* proj = in(0); |
167 | if (proj->in(0)->in(1)->is_Bool()) { |
168 | Node* b = proj->in(0)->in(1); |
169 | if (b->in(1)->Opcode() == Op_CmpI) { |
170 | Node* cmp = b->in(1); |
171 | if (cmp->in(1) == in(1) && phase->type(cmp->in(2))->isa_int()) { |
172 | const TypeInt* in2_t = phase->type(cmp->in(2))->is_int(); |
173 | const Type* t = TypeInt::INT; |
174 | BoolTest test = b->as_Bool()->_test; |
175 | if (proj->is_IfFalse()) { |
176 | test = test.negate(); |
177 | } |
178 | BoolTest::mask m = test._test; |
179 | jlong lo_long = min_jint; |
180 | jlong hi_long = max_jint; |
181 | if (m == BoolTest::le || m == BoolTest::lt) { |
182 | hi_long = in2_t->_hi; |
183 | if (m == BoolTest::lt) { |
184 | hi_long -= 1; |
185 | } |
186 | } else if (m == BoolTest::ge || m == BoolTest::gt) { |
187 | lo_long = in2_t->_lo; |
188 | if (m == BoolTest::gt) { |
189 | lo_long += 1; |
190 | } |
191 | } else if (m == BoolTest::eq) { |
192 | lo_long = in2_t->_lo; |
193 | hi_long = in2_t->_hi; |
194 | } else if (m == BoolTest::ne) { |
195 | // can't do any better |
196 | } else { |
197 | stringStream ss; |
198 | test.dump_on(&ss); |
199 | fatal("unexpected comparison %s" , ss.as_string()); |
200 | } |
201 | int lo_int = (int)lo_long; |
202 | int hi_int = (int)hi_long; |
203 | |
204 | if (lo_long != (jlong)lo_int) { |
205 | lo_int = min_jint; |
206 | } |
207 | if (hi_long != (jlong)hi_int) { |
208 | hi_int = max_jint; |
209 | } |
210 | |
211 | t = TypeInt::make(lo_int, hi_int, Type::WidenMax); |
212 | |
213 | res = res->filter_speculative(t); |
214 | |
215 | return res; |
216 | } |
217 | } |
218 | } |
219 | } |
220 | } |
221 | return res; |
222 | } |
223 | |
224 | Node *CastIINode::Ideal(PhaseGVN *phase, bool can_reshape) { |
225 | Node* progress = ConstraintCastNode::Ideal(phase, can_reshape); |
226 | if (progress != NULL) { |
227 | return progress; |
228 | } |
229 | |
230 | // Similar to ConvI2LNode::Ideal() for the same reasons |
231 | // Do not narrow the type of range check dependent CastIINodes to |
232 | // avoid corruption of the graph if a CastII is replaced by TOP but |
233 | // the corresponding range check is not removed. |
234 | if (can_reshape && !_range_check_dependency && !phase->C->major_progress()) { |
235 | const TypeInt* this_type = this->type()->is_int(); |
236 | const TypeInt* in_type = phase->type(in(1))->isa_int(); |
237 | if (in_type != NULL && this_type != NULL && |
238 | (in_type->_lo != this_type->_lo || |
239 | in_type->_hi != this_type->_hi)) { |
240 | jint lo1 = this_type->_lo; |
241 | jint hi1 = this_type->_hi; |
242 | int w1 = this_type->_widen; |
243 | |
244 | if (lo1 >= 0) { |
245 | // Keep a range assertion of >=0. |
246 | lo1 = 0; hi1 = max_jint; |
247 | } else if (hi1 < 0) { |
248 | // Keep a range assertion of <0. |
249 | lo1 = min_jint; hi1 = -1; |
250 | } else { |
251 | lo1 = min_jint; hi1 = max_jint; |
252 | } |
253 | const TypeInt* wtype = TypeInt::make(MAX2(in_type->_lo, lo1), |
254 | MIN2(in_type->_hi, hi1), |
255 | MAX2((int)in_type->_widen, w1)); |
256 | if (wtype != type()) { |
257 | set_type(wtype); |
258 | return this; |
259 | } |
260 | } |
261 | } |
262 | return NULL; |
263 | } |
264 | |
265 | bool CastIINode::cmp(const Node &n) const { |
266 | return ConstraintCastNode::cmp(n) && ((CastIINode&)n)._range_check_dependency == _range_check_dependency; |
267 | } |
268 | |
269 | uint CastIINode::size_of() const { |
270 | return sizeof(*this); |
271 | } |
272 | |
273 | #ifndef PRODUCT |
274 | void CastIINode::dump_spec(outputStream* st) const { |
275 | ConstraintCastNode::dump_spec(st); |
276 | if (_range_check_dependency) { |
277 | st->print(" range check dependency" ); |
278 | } |
279 | } |
280 | #endif |
281 | |
282 | //============================================================================= |
283 | //------------------------------Identity--------------------------------------- |
284 | // If input is already higher or equal to cast type, then this is an identity. |
285 | Node* CheckCastPPNode::Identity(PhaseGVN* phase) { |
286 | Node* dom = dominating_cast(phase, phase); |
287 | if (dom != NULL) { |
288 | return dom; |
289 | } |
290 | if (_carry_dependency) { |
291 | return this; |
292 | } |
293 | // Toned down to rescue meeting at a Phi 3 different oops all implementing |
294 | // the same interface. |
295 | return (phase->type(in(1)) == phase->type(this)) ? in(1) : this; |
296 | } |
297 | |
298 | //------------------------------Value------------------------------------------ |
299 | // Take 'join' of input and cast-up type, unless working with an Interface |
300 | const Type* CheckCastPPNode::Value(PhaseGVN* phase) const { |
301 | if( in(0) && phase->type(in(0)) == Type::TOP ) return Type::TOP; |
302 | |
303 | const Type *inn = phase->type(in(1)); |
304 | if( inn == Type::TOP ) return Type::TOP; // No information yet |
305 | |
306 | const TypePtr *in_type = inn->isa_ptr(); |
307 | const TypePtr *my_type = _type->isa_ptr(); |
308 | const Type *result = _type; |
309 | if( in_type != NULL && my_type != NULL ) { |
310 | TypePtr::PTR in_ptr = in_type->ptr(); |
311 | if (in_ptr == TypePtr::Null) { |
312 | result = in_type; |
313 | } else if (in_ptr == TypePtr::Constant) { |
314 | if (my_type->isa_rawptr()) { |
315 | result = my_type; |
316 | } else { |
317 | const TypeOopPtr *jptr = my_type->isa_oopptr(); |
318 | assert(jptr, "" ); |
319 | result = !in_type->higher_equal(_type) |
320 | ? my_type->cast_to_ptr_type(TypePtr::NotNull) |
321 | : in_type; |
322 | } |
323 | } else { |
324 | result = my_type->cast_to_ptr_type( my_type->join_ptr(in_ptr) ); |
325 | } |
326 | } |
327 | |
328 | // This is the code from TypePtr::xmeet() that prevents us from |
329 | // having 2 ways to represent the same type. We have to replicate it |
330 | // here because we don't go through meet/join. |
331 | if (result->remove_speculative() == result->speculative()) { |
332 | result = result->remove_speculative(); |
333 | } |
334 | |
335 | // Same as above: because we don't go through meet/join, remove the |
336 | // speculative type if we know we won't use it. |
337 | return result->cleanup_speculative(); |
338 | |
339 | // JOIN NOT DONE HERE BECAUSE OF INTERFACE ISSUES. |
340 | // FIX THIS (DO THE JOIN) WHEN UNION TYPES APPEAR! |
341 | |
342 | // |
343 | // Remove this code after overnight run indicates no performance |
344 | // loss from not performing JOIN at CheckCastPPNode |
345 | // |
346 | // const TypeInstPtr *in_oop = in->isa_instptr(); |
347 | // const TypeInstPtr *my_oop = _type->isa_instptr(); |
348 | // // If either input is an 'interface', return destination type |
349 | // assert (in_oop == NULL || in_oop->klass() != NULL, ""); |
350 | // assert (my_oop == NULL || my_oop->klass() != NULL, ""); |
351 | // if( (in_oop && in_oop->klass()->is_interface()) |
352 | // ||(my_oop && my_oop->klass()->is_interface()) ) { |
353 | // TypePtr::PTR in_ptr = in->isa_ptr() ? in->is_ptr()->_ptr : TypePtr::BotPTR; |
354 | // // Preserve cast away nullness for interfaces |
355 | // if( in_ptr == TypePtr::NotNull && my_oop && my_oop->_ptr == TypePtr::BotPTR ) { |
356 | // return my_oop->cast_to_ptr_type(TypePtr::NotNull); |
357 | // } |
358 | // return _type; |
359 | // } |
360 | // |
361 | // // Neither the input nor the destination type is an interface, |
362 | // |
363 | // // history: JOIN used to cause weird corner case bugs |
364 | // // return (in == TypeOopPtr::NULL_PTR) ? in : _type; |
365 | // // JOIN picks up NotNull in common instance-of/check-cast idioms, both oops. |
366 | // // JOIN does not preserve NotNull in other cases, e.g. RawPtr vs InstPtr |
367 | // const Type *join = in->join(_type); |
368 | // // Check if join preserved NotNull'ness for pointers |
369 | // if( join->isa_ptr() && _type->isa_ptr() ) { |
370 | // TypePtr::PTR join_ptr = join->is_ptr()->_ptr; |
371 | // TypePtr::PTR type_ptr = _type->is_ptr()->_ptr; |
372 | // // If there isn't any NotNull'ness to preserve |
373 | // // OR if join preserved NotNull'ness then return it |
374 | // if( type_ptr == TypePtr::BotPTR || type_ptr == TypePtr::Null || |
375 | // join_ptr == TypePtr::NotNull || join_ptr == TypePtr::Constant ) { |
376 | // return join; |
377 | // } |
378 | // // ELSE return same old type as before |
379 | // return _type; |
380 | // } |
381 | // // Not joining two pointers |
382 | // return join; |
383 | } |
384 | |
385 | //============================================================================= |
386 | //------------------------------Value------------------------------------------ |
387 | const Type* CastX2PNode::Value(PhaseGVN* phase) const { |
388 | const Type* t = phase->type(in(1)); |
389 | if (t == Type::TOP) return Type::TOP; |
390 | if (t->base() == Type_X && t->singleton()) { |
391 | uintptr_t bits = (uintptr_t) t->is_intptr_t()->get_con(); |
392 | if (bits == 0) return TypePtr::NULL_PTR; |
393 | return TypeRawPtr::make((address) bits); |
394 | } |
395 | return CastX2PNode::bottom_type(); |
396 | } |
397 | |
398 | //------------------------------Idealize--------------------------------------- |
399 | static inline bool fits_in_int(const Type* t, bool but_not_min_int = false) { |
400 | if (t == Type::TOP) return false; |
401 | const TypeX* tl = t->is_intptr_t(); |
402 | jint lo = min_jint; |
403 | jint hi = max_jint; |
404 | if (but_not_min_int) ++lo; // caller wants to negate the value w/o overflow |
405 | return (tl->_lo >= lo) && (tl->_hi <= hi); |
406 | } |
407 | |
408 | static inline Node* addP_of_X2P(PhaseGVN *phase, |
409 | Node* base, |
410 | Node* dispX, |
411 | bool negate = false) { |
412 | if (negate) { |
413 | dispX = phase->transform(new SubXNode(phase->MakeConX(0), dispX)); |
414 | } |
415 | return new AddPNode(phase->C->top(), |
416 | phase->transform(new CastX2PNode(base)), |
417 | dispX); |
418 | } |
419 | |
420 | Node *CastX2PNode::Ideal(PhaseGVN *phase, bool can_reshape) { |
421 | // convert CastX2P(AddX(x, y)) to AddP(CastX2P(x), y) if y fits in an int |
422 | int op = in(1)->Opcode(); |
423 | Node* x; |
424 | Node* y; |
425 | switch (op) { |
426 | case Op_SubX: |
427 | x = in(1)->in(1); |
428 | // Avoid ideal transformations ping-pong between this and AddP for raw pointers. |
429 | if (phase->find_intptr_t_con(x, -1) == 0) |
430 | break; |
431 | y = in(1)->in(2); |
432 | if (fits_in_int(phase->type(y), true)) { |
433 | return addP_of_X2P(phase, x, y, true); |
434 | } |
435 | break; |
436 | case Op_AddX: |
437 | x = in(1)->in(1); |
438 | y = in(1)->in(2); |
439 | if (fits_in_int(phase->type(y))) { |
440 | return addP_of_X2P(phase, x, y); |
441 | } |
442 | if (fits_in_int(phase->type(x))) { |
443 | return addP_of_X2P(phase, y, x); |
444 | } |
445 | break; |
446 | } |
447 | return NULL; |
448 | } |
449 | |
450 | //------------------------------Identity--------------------------------------- |
451 | Node* CastX2PNode::Identity(PhaseGVN* phase) { |
452 | if (in(1)->Opcode() == Op_CastP2X) return in(1)->in(1); |
453 | return this; |
454 | } |
455 | |
456 | //============================================================================= |
457 | //------------------------------Value------------------------------------------ |
458 | const Type* CastP2XNode::Value(PhaseGVN* phase) const { |
459 | const Type* t = phase->type(in(1)); |
460 | if (t == Type::TOP) return Type::TOP; |
461 | if (t->base() == Type::RawPtr && t->singleton()) { |
462 | uintptr_t bits = (uintptr_t) t->is_rawptr()->get_con(); |
463 | return TypeX::make(bits); |
464 | } |
465 | return CastP2XNode::bottom_type(); |
466 | } |
467 | |
468 | Node *CastP2XNode::Ideal(PhaseGVN *phase, bool can_reshape) { |
469 | return (in(0) && remove_dead_region(phase, can_reshape)) ? this : NULL; |
470 | } |
471 | |
472 | //------------------------------Identity--------------------------------------- |
473 | Node* CastP2XNode::Identity(PhaseGVN* phase) { |
474 | if (in(1)->Opcode() == Op_CastX2P) return in(1)->in(1); |
475 | return this; |
476 | } |
477 | |