1 | /* |
2 | * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved. |
3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 | * |
5 | * This code is free software; you can redistribute it and/or modify it |
6 | * under the terms of the GNU General Public License version 2 only, as |
7 | * published by the Free Software Foundation. |
8 | * |
9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
12 | * version 2 for more details (a copy is included in the LICENSE file that |
13 | * accompanied this code). |
14 | * |
15 | * You should have received a copy of the GNU General Public License version |
16 | * 2 along with this work; if not, write to the Free Software Foundation, |
17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
18 | * |
19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
20 | * or visit www.oracle.com if you need additional information or have any |
21 | * questions. |
22 | * |
23 | */ |
24 | |
25 | #include "precompiled.hpp" |
26 | #include "ci/ciUtilities.hpp" |
27 | #include "compiler/compileLog.hpp" |
28 | #include "gc/shared/barrierSet.hpp" |
29 | #include "gc/shared/c2/barrierSetC2.hpp" |
30 | #include "interpreter/interpreter.hpp" |
31 | #include "memory/resourceArea.hpp" |
32 | #include "opto/addnode.hpp" |
33 | #include "opto/castnode.hpp" |
34 | #include "opto/convertnode.hpp" |
35 | #include "opto/graphKit.hpp" |
36 | #include "opto/idealKit.hpp" |
37 | #include "opto/intrinsicnode.hpp" |
38 | #include "opto/locknode.hpp" |
39 | #include "opto/machnode.hpp" |
40 | #include "opto/opaquenode.hpp" |
41 | #include "opto/parse.hpp" |
42 | #include "opto/rootnode.hpp" |
43 | #include "opto/runtime.hpp" |
44 | #include "runtime/deoptimization.hpp" |
45 | #include "runtime/sharedRuntime.hpp" |
46 | |
47 | //----------------------------GraphKit----------------------------------------- |
48 | // Main utility constructor. |
49 | GraphKit::GraphKit(JVMState* jvms) |
50 | : Phase(Phase::Parser), |
51 | _env(C->env()), |
52 | _gvn(*C->initial_gvn()), |
53 | _barrier_set(BarrierSet::barrier_set()->barrier_set_c2()) |
54 | { |
55 | _exceptions = jvms->map()->next_exception(); |
56 | if (_exceptions != NULL) jvms->map()->set_next_exception(NULL); |
57 | set_jvms(jvms); |
58 | } |
59 | |
60 | // Private constructor for parser. |
61 | GraphKit::GraphKit() |
62 | : Phase(Phase::Parser), |
63 | _env(C->env()), |
64 | _gvn(*C->initial_gvn()), |
65 | _barrier_set(BarrierSet::barrier_set()->barrier_set_c2()) |
66 | { |
67 | _exceptions = NULL; |
68 | set_map(NULL); |
69 | debug_only(_sp = -99); |
70 | debug_only(set_bci(-99)); |
71 | } |
72 | |
73 | |
74 | |
75 | //---------------------------clean_stack--------------------------------------- |
76 | // Clear away rubbish from the stack area of the JVM state. |
77 | // This destroys any arguments that may be waiting on the stack. |
78 | void GraphKit::clean_stack(int from_sp) { |
79 | SafePointNode* map = this->map(); |
80 | JVMState* jvms = this->jvms(); |
81 | int stk_size = jvms->stk_size(); |
82 | int stkoff = jvms->stkoff(); |
83 | Node* top = this->top(); |
84 | for (int i = from_sp; i < stk_size; i++) { |
85 | if (map->in(stkoff + i) != top) { |
86 | map->set_req(stkoff + i, top); |
87 | } |
88 | } |
89 | } |
90 | |
91 | |
92 | //--------------------------------sync_jvms----------------------------------- |
93 | // Make sure our current jvms agrees with our parse state. |
94 | JVMState* GraphKit::sync_jvms() const { |
95 | JVMState* jvms = this->jvms(); |
96 | jvms->set_bci(bci()); // Record the new bci in the JVMState |
97 | jvms->set_sp(sp()); // Record the new sp in the JVMState |
98 | assert(jvms_in_sync(), "jvms is now in sync" ); |
99 | return jvms; |
100 | } |
101 | |
102 | //--------------------------------sync_jvms_for_reexecute--------------------- |
103 | // Make sure our current jvms agrees with our parse state. This version |
104 | // uses the reexecute_sp for reexecuting bytecodes. |
105 | JVMState* GraphKit::sync_jvms_for_reexecute() { |
106 | JVMState* jvms = this->jvms(); |
107 | jvms->set_bci(bci()); // Record the new bci in the JVMState |
108 | jvms->set_sp(reexecute_sp()); // Record the new sp in the JVMState |
109 | return jvms; |
110 | } |
111 | |
112 | #ifdef ASSERT |
113 | bool GraphKit::jvms_in_sync() const { |
114 | Parse* parse = is_Parse(); |
115 | if (parse == NULL) { |
116 | if (bci() != jvms()->bci()) return false; |
117 | if (sp() != (int)jvms()->sp()) return false; |
118 | return true; |
119 | } |
120 | if (jvms()->method() != parse->method()) return false; |
121 | if (jvms()->bci() != parse->bci()) return false; |
122 | int jvms_sp = jvms()->sp(); |
123 | if (jvms_sp != parse->sp()) return false; |
124 | int jvms_depth = jvms()->depth(); |
125 | if (jvms_depth != parse->depth()) return false; |
126 | return true; |
127 | } |
128 | |
129 | // Local helper checks for special internal merge points |
130 | // used to accumulate and merge exception states. |
131 | // They are marked by the region's in(0) edge being the map itself. |
132 | // Such merge points must never "escape" into the parser at large, |
133 | // until they have been handed to gvn.transform. |
134 | static bool is_hidden_merge(Node* reg) { |
135 | if (reg == NULL) return false; |
136 | if (reg->is_Phi()) { |
137 | reg = reg->in(0); |
138 | if (reg == NULL) return false; |
139 | } |
140 | return reg->is_Region() && reg->in(0) != NULL && reg->in(0)->is_Root(); |
141 | } |
142 | |
143 | void GraphKit::verify_map() const { |
144 | if (map() == NULL) return; // null map is OK |
145 | assert(map()->req() <= jvms()->endoff(), "no extra garbage on map" ); |
146 | assert(!map()->has_exceptions(), "call add_exception_states_from 1st" ); |
147 | assert(!is_hidden_merge(control()), "call use_exception_state, not set_map" ); |
148 | } |
149 | |
150 | void GraphKit::verify_exception_state(SafePointNode* ex_map) { |
151 | assert(ex_map->next_exception() == NULL, "not already part of a chain" ); |
152 | assert(has_saved_ex_oop(ex_map), "every exception state has an ex_oop" ); |
153 | } |
154 | #endif |
155 | |
156 | //---------------------------stop_and_kill_map--------------------------------- |
157 | // Set _map to NULL, signalling a stop to further bytecode execution. |
158 | // First smash the current map's control to a constant, to mark it dead. |
159 | void GraphKit::stop_and_kill_map() { |
160 | SafePointNode* dead_map = stop(); |
161 | if (dead_map != NULL) { |
162 | dead_map->disconnect_inputs(NULL, C); // Mark the map as killed. |
163 | assert(dead_map->is_killed(), "must be so marked" ); |
164 | } |
165 | } |
166 | |
167 | |
168 | //--------------------------------stopped-------------------------------------- |
169 | // Tell if _map is NULL, or control is top. |
170 | bool GraphKit::stopped() { |
171 | if (map() == NULL) return true; |
172 | else if (control() == top()) return true; |
173 | else return false; |
174 | } |
175 | |
176 | |
177 | //-----------------------------has_ex_handler---------------------------------- |
178 | // Tell if this method or any caller method has exception handlers. |
179 | bool GraphKit::has_ex_handler() { |
180 | for (JVMState* jvmsp = jvms(); jvmsp != NULL; jvmsp = jvmsp->caller()) { |
181 | if (jvmsp->has_method() && jvmsp->method()->has_exception_handlers()) { |
182 | return true; |
183 | } |
184 | } |
185 | return false; |
186 | } |
187 | |
188 | //------------------------------save_ex_oop------------------------------------ |
189 | // Save an exception without blowing stack contents or other JVM state. |
190 | void GraphKit::set_saved_ex_oop(SafePointNode* ex_map, Node* ex_oop) { |
191 | assert(!has_saved_ex_oop(ex_map), "clear ex-oop before setting again" ); |
192 | ex_map->add_req(ex_oop); |
193 | debug_only(verify_exception_state(ex_map)); |
194 | } |
195 | |
196 | inline static Node* common_saved_ex_oop(SafePointNode* ex_map, bool clear_it) { |
197 | assert(GraphKit::has_saved_ex_oop(ex_map), "ex_oop must be there" ); |
198 | Node* ex_oop = ex_map->in(ex_map->req()-1); |
199 | if (clear_it) ex_map->del_req(ex_map->req()-1); |
200 | return ex_oop; |
201 | } |
202 | |
203 | //-----------------------------saved_ex_oop------------------------------------ |
204 | // Recover a saved exception from its map. |
205 | Node* GraphKit::saved_ex_oop(SafePointNode* ex_map) { |
206 | return common_saved_ex_oop(ex_map, false); |
207 | } |
208 | |
209 | //--------------------------clear_saved_ex_oop--------------------------------- |
210 | // Erase a previously saved exception from its map. |
211 | Node* GraphKit::clear_saved_ex_oop(SafePointNode* ex_map) { |
212 | return common_saved_ex_oop(ex_map, true); |
213 | } |
214 | |
215 | #ifdef ASSERT |
216 | //---------------------------has_saved_ex_oop---------------------------------- |
217 | // Erase a previously saved exception from its map. |
218 | bool GraphKit::has_saved_ex_oop(SafePointNode* ex_map) { |
219 | return ex_map->req() == ex_map->jvms()->endoff()+1; |
220 | } |
221 | #endif |
222 | |
223 | //-------------------------make_exception_state-------------------------------- |
224 | // Turn the current JVM state into an exception state, appending the ex_oop. |
225 | SafePointNode* GraphKit::make_exception_state(Node* ex_oop) { |
226 | sync_jvms(); |
227 | SafePointNode* ex_map = stop(); // do not manipulate this map any more |
228 | set_saved_ex_oop(ex_map, ex_oop); |
229 | return ex_map; |
230 | } |
231 | |
232 | |
233 | //--------------------------add_exception_state-------------------------------- |
234 | // Add an exception to my list of exceptions. |
235 | void GraphKit::add_exception_state(SafePointNode* ex_map) { |
236 | if (ex_map == NULL || ex_map->control() == top()) { |
237 | return; |
238 | } |
239 | #ifdef ASSERT |
240 | verify_exception_state(ex_map); |
241 | if (has_exceptions()) { |
242 | assert(ex_map->jvms()->same_calls_as(_exceptions->jvms()), "all collected exceptions must come from the same place" ); |
243 | } |
244 | #endif |
245 | |
246 | // If there is already an exception of exactly this type, merge with it. |
247 | // In particular, null-checks and other low-level exceptions common up here. |
248 | Node* ex_oop = saved_ex_oop(ex_map); |
249 | const Type* ex_type = _gvn.type(ex_oop); |
250 | if (ex_oop == top()) { |
251 | // No action needed. |
252 | return; |
253 | } |
254 | assert(ex_type->isa_instptr(), "exception must be an instance" ); |
255 | for (SafePointNode* e2 = _exceptions; e2 != NULL; e2 = e2->next_exception()) { |
256 | const Type* ex_type2 = _gvn.type(saved_ex_oop(e2)); |
257 | // We check sp also because call bytecodes can generate exceptions |
258 | // both before and after arguments are popped! |
259 | if (ex_type2 == ex_type |
260 | && e2->_jvms->sp() == ex_map->_jvms->sp()) { |
261 | combine_exception_states(ex_map, e2); |
262 | return; |
263 | } |
264 | } |
265 | |
266 | // No pre-existing exception of the same type. Chain it on the list. |
267 | push_exception_state(ex_map); |
268 | } |
269 | |
270 | //-----------------------add_exception_states_from----------------------------- |
271 | void GraphKit::add_exception_states_from(JVMState* jvms) { |
272 | SafePointNode* ex_map = jvms->map()->next_exception(); |
273 | if (ex_map != NULL) { |
274 | jvms->map()->set_next_exception(NULL); |
275 | for (SafePointNode* next_map; ex_map != NULL; ex_map = next_map) { |
276 | next_map = ex_map->next_exception(); |
277 | ex_map->set_next_exception(NULL); |
278 | add_exception_state(ex_map); |
279 | } |
280 | } |
281 | } |
282 | |
283 | //-----------------------transfer_exceptions_into_jvms------------------------- |
284 | JVMState* GraphKit::transfer_exceptions_into_jvms() { |
285 | if (map() == NULL) { |
286 | // We need a JVMS to carry the exceptions, but the map has gone away. |
287 | // Create a scratch JVMS, cloned from any of the exception states... |
288 | if (has_exceptions()) { |
289 | _map = _exceptions; |
290 | _map = clone_map(); |
291 | _map->set_next_exception(NULL); |
292 | clear_saved_ex_oop(_map); |
293 | debug_only(verify_map()); |
294 | } else { |
295 | // ...or created from scratch |
296 | JVMState* jvms = new (C) JVMState(_method, NULL); |
297 | jvms->set_bci(_bci); |
298 | jvms->set_sp(_sp); |
299 | jvms->set_map(new SafePointNode(TypeFunc::Parms, jvms)); |
300 | set_jvms(jvms); |
301 | for (uint i = 0; i < map()->req(); i++) map()->init_req(i, top()); |
302 | set_all_memory(top()); |
303 | while (map()->req() < jvms->endoff()) map()->add_req(top()); |
304 | } |
305 | // (This is a kludge, in case you didn't notice.) |
306 | set_control(top()); |
307 | } |
308 | JVMState* jvms = sync_jvms(); |
309 | assert(!jvms->map()->has_exceptions(), "no exceptions on this map yet" ); |
310 | jvms->map()->set_next_exception(_exceptions); |
311 | _exceptions = NULL; // done with this set of exceptions |
312 | return jvms; |
313 | } |
314 | |
315 | static inline void add_n_reqs(Node* dstphi, Node* srcphi) { |
316 | assert(is_hidden_merge(dstphi), "must be a special merge node" ); |
317 | assert(is_hidden_merge(srcphi), "must be a special merge node" ); |
318 | uint limit = srcphi->req(); |
319 | for (uint i = PhiNode::Input; i < limit; i++) { |
320 | dstphi->add_req(srcphi->in(i)); |
321 | } |
322 | } |
323 | static inline void add_one_req(Node* dstphi, Node* src) { |
324 | assert(is_hidden_merge(dstphi), "must be a special merge node" ); |
325 | assert(!is_hidden_merge(src), "must not be a special merge node" ); |
326 | dstphi->add_req(src); |
327 | } |
328 | |
329 | //-----------------------combine_exception_states------------------------------ |
330 | // This helper function combines exception states by building phis on a |
331 | // specially marked state-merging region. These regions and phis are |
332 | // untransformed, and can build up gradually. The region is marked by |
333 | // having a control input of its exception map, rather than NULL. Such |
334 | // regions do not appear except in this function, and in use_exception_state. |
335 | void GraphKit::combine_exception_states(SafePointNode* ex_map, SafePointNode* phi_map) { |
336 | if (failing()) return; // dying anyway... |
337 | JVMState* ex_jvms = ex_map->_jvms; |
338 | assert(ex_jvms->same_calls_as(phi_map->_jvms), "consistent call chains" ); |
339 | assert(ex_jvms->stkoff() == phi_map->_jvms->stkoff(), "matching locals" ); |
340 | assert(ex_jvms->sp() == phi_map->_jvms->sp(), "matching stack sizes" ); |
341 | assert(ex_jvms->monoff() == phi_map->_jvms->monoff(), "matching JVMS" ); |
342 | assert(ex_jvms->scloff() == phi_map->_jvms->scloff(), "matching scalar replaced objects" ); |
343 | assert(ex_map->req() == phi_map->req(), "matching maps" ); |
344 | uint tos = ex_jvms->stkoff() + ex_jvms->sp(); |
345 | Node* hidden_merge_mark = root(); |
346 | Node* region = phi_map->control(); |
347 | MergeMemNode* phi_mem = phi_map->merged_memory(); |
348 | MergeMemNode* ex_mem = ex_map->merged_memory(); |
349 | if (region->in(0) != hidden_merge_mark) { |
350 | // The control input is not (yet) a specially-marked region in phi_map. |
351 | // Make it so, and build some phis. |
352 | region = new RegionNode(2); |
353 | _gvn.set_type(region, Type::CONTROL); |
354 | region->set_req(0, hidden_merge_mark); // marks an internal ex-state |
355 | region->init_req(1, phi_map->control()); |
356 | phi_map->set_control(region); |
357 | Node* io_phi = PhiNode::make(region, phi_map->i_o(), Type::ABIO); |
358 | record_for_igvn(io_phi); |
359 | _gvn.set_type(io_phi, Type::ABIO); |
360 | phi_map->set_i_o(io_phi); |
361 | for (MergeMemStream mms(phi_mem); mms.next_non_empty(); ) { |
362 | Node* m = mms.memory(); |
363 | Node* m_phi = PhiNode::make(region, m, Type::MEMORY, mms.adr_type(C)); |
364 | record_for_igvn(m_phi); |
365 | _gvn.set_type(m_phi, Type::MEMORY); |
366 | mms.set_memory(m_phi); |
367 | } |
368 | } |
369 | |
370 | // Either or both of phi_map and ex_map might already be converted into phis. |
371 | Node* ex_control = ex_map->control(); |
372 | // if there is special marking on ex_map also, we add multiple edges from src |
373 | bool add_multiple = (ex_control->in(0) == hidden_merge_mark); |
374 | // how wide was the destination phi_map, originally? |
375 | uint orig_width = region->req(); |
376 | |
377 | if (add_multiple) { |
378 | add_n_reqs(region, ex_control); |
379 | add_n_reqs(phi_map->i_o(), ex_map->i_o()); |
380 | } else { |
381 | // ex_map has no merges, so we just add single edges everywhere |
382 | add_one_req(region, ex_control); |
383 | add_one_req(phi_map->i_o(), ex_map->i_o()); |
384 | } |
385 | for (MergeMemStream mms(phi_mem, ex_mem); mms.next_non_empty2(); ) { |
386 | if (mms.is_empty()) { |
387 | // get a copy of the base memory, and patch some inputs into it |
388 | const TypePtr* adr_type = mms.adr_type(C); |
389 | Node* phi = mms.force_memory()->as_Phi()->slice_memory(adr_type); |
390 | assert(phi->as_Phi()->region() == mms.base_memory()->in(0), "" ); |
391 | mms.set_memory(phi); |
392 | // Prepare to append interesting stuff onto the newly sliced phi: |
393 | while (phi->req() > orig_width) phi->del_req(phi->req()-1); |
394 | } |
395 | // Append stuff from ex_map: |
396 | if (add_multiple) { |
397 | add_n_reqs(mms.memory(), mms.memory2()); |
398 | } else { |
399 | add_one_req(mms.memory(), mms.memory2()); |
400 | } |
401 | } |
402 | uint limit = ex_map->req(); |
403 | for (uint i = TypeFunc::Parms; i < limit; i++) { |
404 | // Skip everything in the JVMS after tos. (The ex_oop follows.) |
405 | if (i == tos) i = ex_jvms->monoff(); |
406 | Node* src = ex_map->in(i); |
407 | Node* dst = phi_map->in(i); |
408 | if (src != dst) { |
409 | PhiNode* phi; |
410 | if (dst->in(0) != region) { |
411 | dst = phi = PhiNode::make(region, dst, _gvn.type(dst)); |
412 | record_for_igvn(phi); |
413 | _gvn.set_type(phi, phi->type()); |
414 | phi_map->set_req(i, dst); |
415 | // Prepare to append interesting stuff onto the new phi: |
416 | while (dst->req() > orig_width) dst->del_req(dst->req()-1); |
417 | } else { |
418 | assert(dst->is_Phi(), "nobody else uses a hidden region" ); |
419 | phi = dst->as_Phi(); |
420 | } |
421 | if (add_multiple && src->in(0) == ex_control) { |
422 | // Both are phis. |
423 | add_n_reqs(dst, src); |
424 | } else { |
425 | while (dst->req() < region->req()) add_one_req(dst, src); |
426 | } |
427 | const Type* srctype = _gvn.type(src); |
428 | if (phi->type() != srctype) { |
429 | const Type* dsttype = phi->type()->meet_speculative(srctype); |
430 | if (phi->type() != dsttype) { |
431 | phi->set_type(dsttype); |
432 | _gvn.set_type(phi, dsttype); |
433 | } |
434 | } |
435 | } |
436 | } |
437 | phi_map->merge_replaced_nodes_with(ex_map); |
438 | } |
439 | |
440 | //--------------------------use_exception_state-------------------------------- |
441 | Node* GraphKit::use_exception_state(SafePointNode* phi_map) { |
442 | if (failing()) { stop(); return top(); } |
443 | Node* region = phi_map->control(); |
444 | Node* hidden_merge_mark = root(); |
445 | assert(phi_map->jvms()->map() == phi_map, "sanity: 1-1 relation" ); |
446 | Node* ex_oop = clear_saved_ex_oop(phi_map); |
447 | if (region->in(0) == hidden_merge_mark) { |
448 | // Special marking for internal ex-states. Process the phis now. |
449 | region->set_req(0, region); // now it's an ordinary region |
450 | set_jvms(phi_map->jvms()); // ...so now we can use it as a map |
451 | // Note: Setting the jvms also sets the bci and sp. |
452 | set_control(_gvn.transform(region)); |
453 | uint tos = jvms()->stkoff() + sp(); |
454 | for (uint i = 1; i < tos; i++) { |
455 | Node* x = phi_map->in(i); |
456 | if (x->in(0) == region) { |
457 | assert(x->is_Phi(), "expected a special phi" ); |
458 | phi_map->set_req(i, _gvn.transform(x)); |
459 | } |
460 | } |
461 | for (MergeMemStream mms(merged_memory()); mms.next_non_empty(); ) { |
462 | Node* x = mms.memory(); |
463 | if (x->in(0) == region) { |
464 | assert(x->is_Phi(), "nobody else uses a hidden region" ); |
465 | mms.set_memory(_gvn.transform(x)); |
466 | } |
467 | } |
468 | if (ex_oop->in(0) == region) { |
469 | assert(ex_oop->is_Phi(), "expected a special phi" ); |
470 | ex_oop = _gvn.transform(ex_oop); |
471 | } |
472 | } else { |
473 | set_jvms(phi_map->jvms()); |
474 | } |
475 | |
476 | assert(!is_hidden_merge(phi_map->control()), "hidden ex. states cleared" ); |
477 | assert(!is_hidden_merge(phi_map->i_o()), "hidden ex. states cleared" ); |
478 | return ex_oop; |
479 | } |
480 | |
481 | //---------------------------------java_bc------------------------------------- |
482 | Bytecodes::Code GraphKit::java_bc() const { |
483 | ciMethod* method = this->method(); |
484 | int bci = this->bci(); |
485 | if (method != NULL && bci != InvocationEntryBci) |
486 | return method->java_code_at_bci(bci); |
487 | else |
488 | return Bytecodes::_illegal; |
489 | } |
490 | |
491 | void GraphKit::uncommon_trap_if_should_post_on_exceptions(Deoptimization::DeoptReason reason, |
492 | bool must_throw) { |
493 | // if the exception capability is set, then we will generate code |
494 | // to check the JavaThread.should_post_on_exceptions flag to see |
495 | // if we actually need to report exception events (for this |
496 | // thread). If we don't need to report exception events, we will |
497 | // take the normal fast path provided by add_exception_events. If |
498 | // exception event reporting is enabled for this thread, we will |
499 | // take the uncommon_trap in the BuildCutout below. |
500 | |
501 | // first must access the should_post_on_exceptions_flag in this thread's JavaThread |
502 | Node* jthread = _gvn.transform(new ThreadLocalNode()); |
503 | Node* adr = basic_plus_adr(top(), jthread, in_bytes(JavaThread::should_post_on_exceptions_flag_offset())); |
504 | Node* should_post_flag = make_load(control(), adr, TypeInt::INT, T_INT, Compile::AliasIdxRaw, MemNode::unordered); |
505 | |
506 | // Test the should_post_on_exceptions_flag vs. 0 |
507 | Node* chk = _gvn.transform( new CmpINode(should_post_flag, intcon(0)) ); |
508 | Node* tst = _gvn.transform( new BoolNode(chk, BoolTest::eq) ); |
509 | |
510 | // Branch to slow_path if should_post_on_exceptions_flag was true |
511 | { BuildCutout unless(this, tst, PROB_MAX); |
512 | // Do not try anything fancy if we're notifying the VM on every throw. |
513 | // Cf. case Bytecodes::_athrow in parse2.cpp. |
514 | uncommon_trap(reason, Deoptimization::Action_none, |
515 | (ciKlass*)NULL, (char*)NULL, must_throw); |
516 | } |
517 | |
518 | } |
519 | |
520 | //------------------------------builtin_throw---------------------------------- |
521 | void GraphKit::builtin_throw(Deoptimization::DeoptReason reason, Node* arg) { |
522 | bool must_throw = true; |
523 | |
524 | if (env()->jvmti_can_post_on_exceptions()) { |
525 | // check if we must post exception events, take uncommon trap if so |
526 | uncommon_trap_if_should_post_on_exceptions(reason, must_throw); |
527 | // here if should_post_on_exceptions is false |
528 | // continue on with the normal codegen |
529 | } |
530 | |
531 | // If this particular condition has not yet happened at this |
532 | // bytecode, then use the uncommon trap mechanism, and allow for |
533 | // a future recompilation if several traps occur here. |
534 | // If the throw is hot, try to use a more complicated inline mechanism |
535 | // which keeps execution inside the compiled code. |
536 | bool treat_throw_as_hot = false; |
537 | ciMethodData* md = method()->method_data(); |
538 | |
539 | if (ProfileTraps) { |
540 | if (too_many_traps(reason)) { |
541 | treat_throw_as_hot = true; |
542 | } |
543 | // (If there is no MDO at all, assume it is early in |
544 | // execution, and that any deopts are part of the |
545 | // startup transient, and don't need to be remembered.) |
546 | |
547 | // Also, if there is a local exception handler, treat all throws |
548 | // as hot if there has been at least one in this method. |
549 | if (C->trap_count(reason) != 0 |
550 | && method()->method_data()->trap_count(reason) != 0 |
551 | && has_ex_handler()) { |
552 | treat_throw_as_hot = true; |
553 | } |
554 | } |
555 | |
556 | // If this throw happens frequently, an uncommon trap might cause |
557 | // a performance pothole. If there is a local exception handler, |
558 | // and if this particular bytecode appears to be deoptimizing often, |
559 | // let us handle the throw inline, with a preconstructed instance. |
560 | // Note: If the deopt count has blown up, the uncommon trap |
561 | // runtime is going to flush this nmethod, not matter what. |
562 | if (treat_throw_as_hot |
563 | && (!StackTraceInThrowable || OmitStackTraceInFastThrow)) { |
564 | // If the throw is local, we use a pre-existing instance and |
565 | // punt on the backtrace. This would lead to a missing backtrace |
566 | // (a repeat of 4292742) if the backtrace object is ever asked |
567 | // for its backtrace. |
568 | // Fixing this remaining case of 4292742 requires some flavor of |
569 | // escape analysis. Leave that for the future. |
570 | ciInstance* ex_obj = NULL; |
571 | switch (reason) { |
572 | case Deoptimization::Reason_null_check: |
573 | ex_obj = env()->NullPointerException_instance(); |
574 | break; |
575 | case Deoptimization::Reason_div0_check: |
576 | ex_obj = env()->ArithmeticException_instance(); |
577 | break; |
578 | case Deoptimization::Reason_range_check: |
579 | ex_obj = env()->ArrayIndexOutOfBoundsException_instance(); |
580 | break; |
581 | case Deoptimization::Reason_class_check: |
582 | if (java_bc() == Bytecodes::_aastore) { |
583 | ex_obj = env()->ArrayStoreException_instance(); |
584 | } else { |
585 | ex_obj = env()->ClassCastException_instance(); |
586 | } |
587 | break; |
588 | default: |
589 | break; |
590 | } |
591 | if (failing()) { stop(); return; } // exception allocation might fail |
592 | if (ex_obj != NULL) { |
593 | // Cheat with a preallocated exception object. |
594 | if (C->log() != NULL) |
595 | C->log()->elem("hot_throw preallocated='1' reason='%s'" , |
596 | Deoptimization::trap_reason_name(reason)); |
597 | const TypeInstPtr* ex_con = TypeInstPtr::make(ex_obj); |
598 | Node* ex_node = _gvn.transform(ConNode::make(ex_con)); |
599 | |
600 | // Clear the detail message of the preallocated exception object. |
601 | // Weblogic sometimes mutates the detail message of exceptions |
602 | // using reflection. |
603 | int offset = java_lang_Throwable::get_detailMessage_offset(); |
604 | const TypePtr* adr_typ = ex_con->add_offset(offset); |
605 | |
606 | Node *adr = basic_plus_adr(ex_node, ex_node, offset); |
607 | const TypeOopPtr* val_type = TypeOopPtr::make_from_klass(env()->String_klass()); |
608 | Node *store = access_store_at(ex_node, adr, adr_typ, null(), val_type, T_OBJECT, IN_HEAP); |
609 | |
610 | add_exception_state(make_exception_state(ex_node)); |
611 | return; |
612 | } |
613 | } |
614 | |
615 | // %%% Maybe add entry to OptoRuntime which directly throws the exc.? |
616 | // It won't be much cheaper than bailing to the interp., since we'll |
617 | // have to pass up all the debug-info, and the runtime will have to |
618 | // create the stack trace. |
619 | |
620 | // Usual case: Bail to interpreter. |
621 | // Reserve the right to recompile if we haven't seen anything yet. |
622 | |
623 | ciMethod* m = Deoptimization::reason_is_speculate(reason) ? C->method() : NULL; |
624 | Deoptimization::DeoptAction action = Deoptimization::Action_maybe_recompile; |
625 | if (treat_throw_as_hot |
626 | && (method()->method_data()->trap_recompiled_at(bci(), m) |
627 | || C->too_many_traps(reason))) { |
628 | // We cannot afford to take more traps here. Suffer in the interpreter. |
629 | if (C->log() != NULL) |
630 | C->log()->elem("hot_throw preallocated='0' reason='%s' mcount='%d'" , |
631 | Deoptimization::trap_reason_name(reason), |
632 | C->trap_count(reason)); |
633 | action = Deoptimization::Action_none; |
634 | } |
635 | |
636 | // "must_throw" prunes the JVM state to include only the stack, if there |
637 | // are no local exception handlers. This should cut down on register |
638 | // allocation time and code size, by drastically reducing the number |
639 | // of in-edges on the call to the uncommon trap. |
640 | |
641 | uncommon_trap(reason, action, (ciKlass*)NULL, (char*)NULL, must_throw); |
642 | } |
643 | |
644 | |
645 | //----------------------------PreserveJVMState--------------------------------- |
646 | PreserveJVMState::PreserveJVMState(GraphKit* kit, bool clone_map) { |
647 | debug_only(kit->verify_map()); |
648 | _kit = kit; |
649 | _map = kit->map(); // preserve the map |
650 | _sp = kit->sp(); |
651 | kit->set_map(clone_map ? kit->clone_map() : NULL); |
652 | #ifdef ASSERT |
653 | _bci = kit->bci(); |
654 | Parse* parser = kit->is_Parse(); |
655 | int block = (parser == NULL || parser->block() == NULL) ? -1 : parser->block()->rpo(); |
656 | _block = block; |
657 | #endif |
658 | } |
659 | PreserveJVMState::~PreserveJVMState() { |
660 | GraphKit* kit = _kit; |
661 | #ifdef ASSERT |
662 | assert(kit->bci() == _bci, "bci must not shift" ); |
663 | Parse* parser = kit->is_Parse(); |
664 | int block = (parser == NULL || parser->block() == NULL) ? -1 : parser->block()->rpo(); |
665 | assert(block == _block, "block must not shift" ); |
666 | #endif |
667 | kit->set_map(_map); |
668 | kit->set_sp(_sp); |
669 | } |
670 | |
671 | |
672 | //-----------------------------BuildCutout------------------------------------- |
673 | BuildCutout::BuildCutout(GraphKit* kit, Node* p, float prob, float cnt) |
674 | : PreserveJVMState(kit) |
675 | { |
676 | assert(p->is_Con() || p->is_Bool(), "test must be a bool" ); |
677 | SafePointNode* outer_map = _map; // preserved map is caller's |
678 | SafePointNode* inner_map = kit->map(); |
679 | IfNode* iff = kit->create_and_map_if(outer_map->control(), p, prob, cnt); |
680 | outer_map->set_control(kit->gvn().transform( new IfTrueNode(iff) )); |
681 | inner_map->set_control(kit->gvn().transform( new IfFalseNode(iff) )); |
682 | } |
683 | BuildCutout::~BuildCutout() { |
684 | GraphKit* kit = _kit; |
685 | assert(kit->stopped(), "cutout code must stop, throw, return, etc." ); |
686 | } |
687 | |
688 | //---------------------------PreserveReexecuteState---------------------------- |
689 | PreserveReexecuteState::PreserveReexecuteState(GraphKit* kit) { |
690 | assert(!kit->stopped(), "must call stopped() before" ); |
691 | _kit = kit; |
692 | _sp = kit->sp(); |
693 | _reexecute = kit->jvms()->_reexecute; |
694 | } |
695 | PreserveReexecuteState::~PreserveReexecuteState() { |
696 | if (_kit->stopped()) return; |
697 | _kit->jvms()->_reexecute = _reexecute; |
698 | _kit->set_sp(_sp); |
699 | } |
700 | |
701 | //------------------------------clone_map-------------------------------------- |
702 | // Implementation of PreserveJVMState |
703 | // |
704 | // Only clone_map(...) here. If this function is only used in the |
705 | // PreserveJVMState class we may want to get rid of this extra |
706 | // function eventually and do it all there. |
707 | |
708 | SafePointNode* GraphKit::clone_map() { |
709 | if (map() == NULL) return NULL; |
710 | |
711 | // Clone the memory edge first |
712 | Node* mem = MergeMemNode::make(map()->memory()); |
713 | gvn().set_type_bottom(mem); |
714 | |
715 | SafePointNode *clonemap = (SafePointNode*)map()->clone(); |
716 | JVMState* jvms = this->jvms(); |
717 | JVMState* clonejvms = jvms->clone_shallow(C); |
718 | clonemap->set_memory(mem); |
719 | clonemap->set_jvms(clonejvms); |
720 | clonejvms->set_map(clonemap); |
721 | record_for_igvn(clonemap); |
722 | gvn().set_type_bottom(clonemap); |
723 | return clonemap; |
724 | } |
725 | |
726 | |
727 | //-----------------------------set_map_clone----------------------------------- |
728 | void GraphKit::set_map_clone(SafePointNode* m) { |
729 | _map = m; |
730 | _map = clone_map(); |
731 | _map->set_next_exception(NULL); |
732 | debug_only(verify_map()); |
733 | } |
734 | |
735 | |
736 | //----------------------------kill_dead_locals--------------------------------- |
737 | // Detect any locals which are known to be dead, and force them to top. |
738 | void GraphKit::kill_dead_locals() { |
739 | // Consult the liveness information for the locals. If any |
740 | // of them are unused, then they can be replaced by top(). This |
741 | // should help register allocation time and cut down on the size |
742 | // of the deoptimization information. |
743 | |
744 | // This call is made from many of the bytecode handling |
745 | // subroutines called from the Big Switch in do_one_bytecode. |
746 | // Every bytecode which might include a slow path is responsible |
747 | // for killing its dead locals. The more consistent we |
748 | // are about killing deads, the fewer useless phis will be |
749 | // constructed for them at various merge points. |
750 | |
751 | // bci can be -1 (InvocationEntryBci). We return the entry |
752 | // liveness for the method. |
753 | |
754 | if (method() == NULL || method()->code_size() == 0) { |
755 | // We are building a graph for a call to a native method. |
756 | // All locals are live. |
757 | return; |
758 | } |
759 | |
760 | ResourceMark rm; |
761 | |
762 | // Consult the liveness information for the locals. If any |
763 | // of them are unused, then they can be replaced by top(). This |
764 | // should help register allocation time and cut down on the size |
765 | // of the deoptimization information. |
766 | MethodLivenessResult live_locals = method()->liveness_at_bci(bci()); |
767 | |
768 | int len = (int)live_locals.size(); |
769 | assert(len <= jvms()->loc_size(), "too many live locals" ); |
770 | for (int local = 0; local < len; local++) { |
771 | if (!live_locals.at(local)) { |
772 | set_local(local, top()); |
773 | } |
774 | } |
775 | } |
776 | |
777 | #ifdef ASSERT |
778 | //-------------------------dead_locals_are_killed------------------------------ |
779 | // Return true if all dead locals are set to top in the map. |
780 | // Used to assert "clean" debug info at various points. |
781 | bool GraphKit::dead_locals_are_killed() { |
782 | if (method() == NULL || method()->code_size() == 0) { |
783 | // No locals need to be dead, so all is as it should be. |
784 | return true; |
785 | } |
786 | |
787 | // Make sure somebody called kill_dead_locals upstream. |
788 | ResourceMark rm; |
789 | for (JVMState* jvms = this->jvms(); jvms != NULL; jvms = jvms->caller()) { |
790 | if (jvms->loc_size() == 0) continue; // no locals to consult |
791 | SafePointNode* map = jvms->map(); |
792 | ciMethod* method = jvms->method(); |
793 | int bci = jvms->bci(); |
794 | if (jvms == this->jvms()) { |
795 | bci = this->bci(); // it might not yet be synched |
796 | } |
797 | MethodLivenessResult live_locals = method->liveness_at_bci(bci); |
798 | int len = (int)live_locals.size(); |
799 | if (!live_locals.is_valid() || len == 0) |
800 | // This method is trivial, or is poisoned by a breakpoint. |
801 | return true; |
802 | assert(len == jvms->loc_size(), "live map consistent with locals map" ); |
803 | for (int local = 0; local < len; local++) { |
804 | if (!live_locals.at(local) && map->local(jvms, local) != top()) { |
805 | if (PrintMiscellaneous && (Verbose || WizardMode)) { |
806 | tty->print_cr("Zombie local %d: " , local); |
807 | jvms->dump(); |
808 | } |
809 | return false; |
810 | } |
811 | } |
812 | } |
813 | return true; |
814 | } |
815 | |
816 | #endif //ASSERT |
817 | |
818 | // Helper function for enforcing certain bytecodes to reexecute if |
819 | // deoptimization happens |
820 | static bool should_reexecute_implied_by_bytecode(JVMState *jvms, bool is_anewarray) { |
821 | ciMethod* cur_method = jvms->method(); |
822 | int cur_bci = jvms->bci(); |
823 | if (cur_method != NULL && cur_bci != InvocationEntryBci) { |
824 | Bytecodes::Code code = cur_method->java_code_at_bci(cur_bci); |
825 | return Interpreter::bytecode_should_reexecute(code) || |
826 | (is_anewarray && code == Bytecodes::_multianewarray); |
827 | // Reexecute _multianewarray bytecode which was replaced with |
828 | // sequence of [a]newarray. See Parse::do_multianewarray(). |
829 | // |
830 | // Note: interpreter should not have it set since this optimization |
831 | // is limited by dimensions and guarded by flag so in some cases |
832 | // multianewarray() runtime calls will be generated and |
833 | // the bytecode should not be reexecutes (stack will not be reset). |
834 | } else |
835 | return false; |
836 | } |
837 | |
838 | // Helper function for adding JVMState and debug information to node |
839 | void GraphKit::add_safepoint_edges(SafePointNode* call, bool must_throw) { |
840 | // Add the safepoint edges to the call (or other safepoint). |
841 | |
842 | // Make sure dead locals are set to top. This |
843 | // should help register allocation time and cut down on the size |
844 | // of the deoptimization information. |
845 | assert(dead_locals_are_killed(), "garbage in debug info before safepoint" ); |
846 | |
847 | // Walk the inline list to fill in the correct set of JVMState's |
848 | // Also fill in the associated edges for each JVMState. |
849 | |
850 | // If the bytecode needs to be reexecuted we need to put |
851 | // the arguments back on the stack. |
852 | const bool should_reexecute = jvms()->should_reexecute(); |
853 | JVMState* youngest_jvms = should_reexecute ? sync_jvms_for_reexecute() : sync_jvms(); |
854 | |
855 | // NOTE: set_bci (called from sync_jvms) might reset the reexecute bit to |
856 | // undefined if the bci is different. This is normal for Parse but it |
857 | // should not happen for LibraryCallKit because only one bci is processed. |
858 | assert(!is_LibraryCallKit() || (jvms()->should_reexecute() == should_reexecute), |
859 | "in LibraryCallKit the reexecute bit should not change" ); |
860 | |
861 | // If we are guaranteed to throw, we can prune everything but the |
862 | // input to the current bytecode. |
863 | bool can_prune_locals = false; |
864 | uint stack_slots_not_pruned = 0; |
865 | int inputs = 0, depth = 0; |
866 | if (must_throw) { |
867 | assert(method() == youngest_jvms->method(), "sanity" ); |
868 | if (compute_stack_effects(inputs, depth)) { |
869 | can_prune_locals = true; |
870 | stack_slots_not_pruned = inputs; |
871 | } |
872 | } |
873 | |
874 | if (env()->should_retain_local_variables()) { |
875 | // At any safepoint, this method can get breakpointed, which would |
876 | // then require an immediate deoptimization. |
877 | can_prune_locals = false; // do not prune locals |
878 | stack_slots_not_pruned = 0; |
879 | } |
880 | |
881 | // do not scribble on the input jvms |
882 | JVMState* out_jvms = youngest_jvms->clone_deep(C); |
883 | call->set_jvms(out_jvms); // Start jvms list for call node |
884 | |
885 | // For a known set of bytecodes, the interpreter should reexecute them if |
886 | // deoptimization happens. We set the reexecute state for them here |
887 | if (out_jvms->is_reexecute_undefined() && //don't change if already specified |
888 | should_reexecute_implied_by_bytecode(out_jvms, call->is_AllocateArray())) { |
889 | out_jvms->set_should_reexecute(true); //NOTE: youngest_jvms not changed |
890 | } |
891 | |
892 | // Presize the call: |
893 | DEBUG_ONLY(uint non_debug_edges = call->req()); |
894 | call->add_req_batch(top(), youngest_jvms->debug_depth()); |
895 | assert(call->req() == non_debug_edges + youngest_jvms->debug_depth(), "" ); |
896 | |
897 | // Set up edges so that the call looks like this: |
898 | // Call [state:] ctl io mem fptr retadr |
899 | // [parms:] parm0 ... parmN |
900 | // [root:] loc0 ... locN stk0 ... stkSP mon0 obj0 ... monN objN |
901 | // [...mid:] loc0 ... locN stk0 ... stkSP mon0 obj0 ... monN objN [...] |
902 | // [young:] loc0 ... locN stk0 ... stkSP mon0 obj0 ... monN objN |
903 | // Note that caller debug info precedes callee debug info. |
904 | |
905 | // Fill pointer walks backwards from "young:" to "root:" in the diagram above: |
906 | uint debug_ptr = call->req(); |
907 | |
908 | // Loop over the map input edges associated with jvms, add them |
909 | // to the call node, & reset all offsets to match call node array. |
910 | for (JVMState* in_jvms = youngest_jvms; in_jvms != NULL; ) { |
911 | uint debug_end = debug_ptr; |
912 | uint debug_start = debug_ptr - in_jvms->debug_size(); |
913 | debug_ptr = debug_start; // back up the ptr |
914 | |
915 | uint p = debug_start; // walks forward in [debug_start, debug_end) |
916 | uint j, k, l; |
917 | SafePointNode* in_map = in_jvms->map(); |
918 | out_jvms->set_map(call); |
919 | |
920 | if (can_prune_locals) { |
921 | assert(in_jvms->method() == out_jvms->method(), "sanity" ); |
922 | // If the current throw can reach an exception handler in this JVMS, |
923 | // then we must keep everything live that can reach that handler. |
924 | // As a quick and dirty approximation, we look for any handlers at all. |
925 | if (in_jvms->method()->has_exception_handlers()) { |
926 | can_prune_locals = false; |
927 | } |
928 | } |
929 | |
930 | // Add the Locals |
931 | k = in_jvms->locoff(); |
932 | l = in_jvms->loc_size(); |
933 | out_jvms->set_locoff(p); |
934 | if (!can_prune_locals) { |
935 | for (j = 0; j < l; j++) |
936 | call->set_req(p++, in_map->in(k+j)); |
937 | } else { |
938 | p += l; // already set to top above by add_req_batch |
939 | } |
940 | |
941 | // Add the Expression Stack |
942 | k = in_jvms->stkoff(); |
943 | l = in_jvms->sp(); |
944 | out_jvms->set_stkoff(p); |
945 | if (!can_prune_locals) { |
946 | for (j = 0; j < l; j++) |
947 | call->set_req(p++, in_map->in(k+j)); |
948 | } else if (can_prune_locals && stack_slots_not_pruned != 0) { |
949 | // Divide stack into {S0,...,S1}, where S0 is set to top. |
950 | uint s1 = stack_slots_not_pruned; |
951 | stack_slots_not_pruned = 0; // for next iteration |
952 | if (s1 > l) s1 = l; |
953 | uint s0 = l - s1; |
954 | p += s0; // skip the tops preinstalled by add_req_batch |
955 | for (j = s0; j < l; j++) |
956 | call->set_req(p++, in_map->in(k+j)); |
957 | } else { |
958 | p += l; // already set to top above by add_req_batch |
959 | } |
960 | |
961 | // Add the Monitors |
962 | k = in_jvms->monoff(); |
963 | l = in_jvms->mon_size(); |
964 | out_jvms->set_monoff(p); |
965 | for (j = 0; j < l; j++) |
966 | call->set_req(p++, in_map->in(k+j)); |
967 | |
968 | // Copy any scalar object fields. |
969 | k = in_jvms->scloff(); |
970 | l = in_jvms->scl_size(); |
971 | out_jvms->set_scloff(p); |
972 | for (j = 0; j < l; j++) |
973 | call->set_req(p++, in_map->in(k+j)); |
974 | |
975 | // Finish the new jvms. |
976 | out_jvms->set_endoff(p); |
977 | |
978 | assert(out_jvms->endoff() == debug_end, "fill ptr must match" ); |
979 | assert(out_jvms->depth() == in_jvms->depth(), "depth must match" ); |
980 | assert(out_jvms->loc_size() == in_jvms->loc_size(), "size must match" ); |
981 | assert(out_jvms->mon_size() == in_jvms->mon_size(), "size must match" ); |
982 | assert(out_jvms->scl_size() == in_jvms->scl_size(), "size must match" ); |
983 | assert(out_jvms->debug_size() == in_jvms->debug_size(), "size must match" ); |
984 | |
985 | // Update the two tail pointers in parallel. |
986 | out_jvms = out_jvms->caller(); |
987 | in_jvms = in_jvms->caller(); |
988 | } |
989 | |
990 | assert(debug_ptr == non_debug_edges, "debug info must fit exactly" ); |
991 | |
992 | // Test the correctness of JVMState::debug_xxx accessors: |
993 | assert(call->jvms()->debug_start() == non_debug_edges, "" ); |
994 | assert(call->jvms()->debug_end() == call->req(), "" ); |
995 | assert(call->jvms()->debug_depth() == call->req() - non_debug_edges, "" ); |
996 | } |
997 | |
998 | bool GraphKit::compute_stack_effects(int& inputs, int& depth) { |
999 | Bytecodes::Code code = java_bc(); |
1000 | if (code == Bytecodes::_wide) { |
1001 | code = method()->java_code_at_bci(bci() + 1); |
1002 | } |
1003 | |
1004 | BasicType rtype = T_ILLEGAL; |
1005 | int rsize = 0; |
1006 | |
1007 | if (code != Bytecodes::_illegal) { |
1008 | depth = Bytecodes::depth(code); // checkcast=0, athrow=-1 |
1009 | rtype = Bytecodes::result_type(code); // checkcast=P, athrow=V |
1010 | if (rtype < T_CONFLICT) |
1011 | rsize = type2size[rtype]; |
1012 | } |
1013 | |
1014 | switch (code) { |
1015 | case Bytecodes::_illegal: |
1016 | return false; |
1017 | |
1018 | case Bytecodes::_ldc: |
1019 | case Bytecodes::_ldc_w: |
1020 | case Bytecodes::_ldc2_w: |
1021 | inputs = 0; |
1022 | break; |
1023 | |
1024 | case Bytecodes::_dup: inputs = 1; break; |
1025 | case Bytecodes::_dup_x1: inputs = 2; break; |
1026 | case Bytecodes::_dup_x2: inputs = 3; break; |
1027 | case Bytecodes::_dup2: inputs = 2; break; |
1028 | case Bytecodes::_dup2_x1: inputs = 3; break; |
1029 | case Bytecodes::_dup2_x2: inputs = 4; break; |
1030 | case Bytecodes::_swap: inputs = 2; break; |
1031 | case Bytecodes::_arraylength: inputs = 1; break; |
1032 | |
1033 | case Bytecodes::_getstatic: |
1034 | case Bytecodes::_putstatic: |
1035 | case Bytecodes::_getfield: |
1036 | case Bytecodes::_putfield: |
1037 | { |
1038 | bool ignored_will_link; |
1039 | ciField* field = method()->get_field_at_bci(bci(), ignored_will_link); |
1040 | int size = field->type()->size(); |
1041 | bool is_get = (depth >= 0), is_static = (depth & 1); |
1042 | inputs = (is_static ? 0 : 1); |
1043 | if (is_get) { |
1044 | depth = size - inputs; |
1045 | } else { |
1046 | inputs += size; // putxxx pops the value from the stack |
1047 | depth = - inputs; |
1048 | } |
1049 | } |
1050 | break; |
1051 | |
1052 | case Bytecodes::_invokevirtual: |
1053 | case Bytecodes::_invokespecial: |
1054 | case Bytecodes::_invokestatic: |
1055 | case Bytecodes::_invokedynamic: |
1056 | case Bytecodes::_invokeinterface: |
1057 | { |
1058 | bool ignored_will_link; |
1059 | ciSignature* declared_signature = NULL; |
1060 | ciMethod* ignored_callee = method()->get_method_at_bci(bci(), ignored_will_link, &declared_signature); |
1061 | assert(declared_signature != NULL, "cannot be null" ); |
1062 | inputs = declared_signature->arg_size_for_bc(code); |
1063 | int size = declared_signature->return_type()->size(); |
1064 | depth = size - inputs; |
1065 | } |
1066 | break; |
1067 | |
1068 | case Bytecodes::_multianewarray: |
1069 | { |
1070 | ciBytecodeStream iter(method()); |
1071 | iter.reset_to_bci(bci()); |
1072 | iter.next(); |
1073 | inputs = iter.get_dimensions(); |
1074 | assert(rsize == 1, "" ); |
1075 | depth = rsize - inputs; |
1076 | } |
1077 | break; |
1078 | |
1079 | case Bytecodes::_ireturn: |
1080 | case Bytecodes::_lreturn: |
1081 | case Bytecodes::_freturn: |
1082 | case Bytecodes::_dreturn: |
1083 | case Bytecodes::_areturn: |
1084 | assert(rsize == -depth, "" ); |
1085 | inputs = rsize; |
1086 | break; |
1087 | |
1088 | case Bytecodes::_jsr: |
1089 | case Bytecodes::_jsr_w: |
1090 | inputs = 0; |
1091 | depth = 1; // S.B. depth=1, not zero |
1092 | break; |
1093 | |
1094 | default: |
1095 | // bytecode produces a typed result |
1096 | inputs = rsize - depth; |
1097 | assert(inputs >= 0, "" ); |
1098 | break; |
1099 | } |
1100 | |
1101 | #ifdef ASSERT |
1102 | // spot check |
1103 | int outputs = depth + inputs; |
1104 | assert(outputs >= 0, "sanity" ); |
1105 | switch (code) { |
1106 | case Bytecodes::_checkcast: assert(inputs == 1 && outputs == 1, "" ); break; |
1107 | case Bytecodes::_athrow: assert(inputs == 1 && outputs == 0, "" ); break; |
1108 | case Bytecodes::_aload_0: assert(inputs == 0 && outputs == 1, "" ); break; |
1109 | case Bytecodes::_return: assert(inputs == 0 && outputs == 0, "" ); break; |
1110 | case Bytecodes::_drem: assert(inputs == 4 && outputs == 2, "" ); break; |
1111 | default: break; |
1112 | } |
1113 | #endif //ASSERT |
1114 | |
1115 | return true; |
1116 | } |
1117 | |
1118 | |
1119 | |
1120 | //------------------------------basic_plus_adr--------------------------------- |
1121 | Node* GraphKit::basic_plus_adr(Node* base, Node* ptr, Node* offset) { |
1122 | // short-circuit a common case |
1123 | if (offset == intcon(0)) return ptr; |
1124 | return _gvn.transform( new AddPNode(base, ptr, offset) ); |
1125 | } |
1126 | |
1127 | Node* GraphKit::ConvI2L(Node* offset) { |
1128 | // short-circuit a common case |
1129 | jint offset_con = find_int_con(offset, Type::OffsetBot); |
1130 | if (offset_con != Type::OffsetBot) { |
1131 | return longcon((jlong) offset_con); |
1132 | } |
1133 | return _gvn.transform( new ConvI2LNode(offset)); |
1134 | } |
1135 | |
1136 | Node* GraphKit::ConvI2UL(Node* offset) { |
1137 | juint offset_con = (juint) find_int_con(offset, Type::OffsetBot); |
1138 | if (offset_con != (juint) Type::OffsetBot) { |
1139 | return longcon((julong) offset_con); |
1140 | } |
1141 | Node* conv = _gvn.transform( new ConvI2LNode(offset)); |
1142 | Node* mask = _gvn.transform(ConLNode::make((julong) max_juint)); |
1143 | return _gvn.transform( new AndLNode(conv, mask) ); |
1144 | } |
1145 | |
1146 | Node* GraphKit::ConvL2I(Node* offset) { |
1147 | // short-circuit a common case |
1148 | jlong offset_con = find_long_con(offset, (jlong)Type::OffsetBot); |
1149 | if (offset_con != (jlong)Type::OffsetBot) { |
1150 | return intcon((int) offset_con); |
1151 | } |
1152 | return _gvn.transform( new ConvL2INode(offset)); |
1153 | } |
1154 | |
1155 | //-------------------------load_object_klass----------------------------------- |
1156 | Node* GraphKit::load_object_klass(Node* obj) { |
1157 | // Special-case a fresh allocation to avoid building nodes: |
1158 | Node* akls = AllocateNode::Ideal_klass(obj, &_gvn); |
1159 | if (akls != NULL) return akls; |
1160 | Node* k_adr = basic_plus_adr(obj, oopDesc::klass_offset_in_bytes()); |
1161 | return _gvn.transform(LoadKlassNode::make(_gvn, NULL, immutable_memory(), k_adr, TypeInstPtr::KLASS)); |
1162 | } |
1163 | |
1164 | //-------------------------load_array_length----------------------------------- |
1165 | Node* GraphKit::load_array_length(Node* array) { |
1166 | // Special-case a fresh allocation to avoid building nodes: |
1167 | AllocateArrayNode* alloc = AllocateArrayNode::Ideal_array_allocation(array, &_gvn); |
1168 | Node *alen; |
1169 | if (alloc == NULL) { |
1170 | Node *r_adr = basic_plus_adr(array, arrayOopDesc::length_offset_in_bytes()); |
1171 | alen = _gvn.transform( new LoadRangeNode(0, immutable_memory(), r_adr, TypeInt::POS)); |
1172 | } else { |
1173 | alen = alloc->Ideal_length(); |
1174 | Node* ccast = alloc->make_ideal_length(_gvn.type(array)->is_oopptr(), &_gvn); |
1175 | if (ccast != alen) { |
1176 | alen = _gvn.transform(ccast); |
1177 | } |
1178 | } |
1179 | return alen; |
1180 | } |
1181 | |
1182 | //------------------------------do_null_check---------------------------------- |
1183 | // Helper function to do a NULL pointer check. Returned value is |
1184 | // the incoming address with NULL casted away. You are allowed to use the |
1185 | // not-null value only if you are control dependent on the test. |
1186 | #ifndef PRODUCT |
1187 | extern int explicit_null_checks_inserted, |
1188 | explicit_null_checks_elided; |
1189 | #endif |
1190 | Node* GraphKit::null_check_common(Node* value, BasicType type, |
1191 | // optional arguments for variations: |
1192 | bool assert_null, |
1193 | Node* *null_control, |
1194 | bool speculative) { |
1195 | assert(!assert_null || null_control == NULL, "not both at once" ); |
1196 | if (stopped()) return top(); |
1197 | NOT_PRODUCT(explicit_null_checks_inserted++); |
1198 | |
1199 | // Construct NULL check |
1200 | Node *chk = NULL; |
1201 | switch(type) { |
1202 | case T_LONG : chk = new CmpLNode(value, _gvn.zerocon(T_LONG)); break; |
1203 | case T_INT : chk = new CmpINode(value, _gvn.intcon(0)); break; |
1204 | case T_ARRAY : // fall through |
1205 | type = T_OBJECT; // simplify further tests |
1206 | case T_OBJECT : { |
1207 | const Type *t = _gvn.type( value ); |
1208 | |
1209 | const TypeOopPtr* tp = t->isa_oopptr(); |
1210 | if (tp != NULL && tp->klass() != NULL && !tp->klass()->is_loaded() |
1211 | // Only for do_null_check, not any of its siblings: |
1212 | && !assert_null && null_control == NULL) { |
1213 | // Usually, any field access or invocation on an unloaded oop type |
1214 | // will simply fail to link, since the statically linked class is |
1215 | // likely also to be unloaded. However, in -Xcomp mode, sometimes |
1216 | // the static class is loaded but the sharper oop type is not. |
1217 | // Rather than checking for this obscure case in lots of places, |
1218 | // we simply observe that a null check on an unloaded class |
1219 | // will always be followed by a nonsense operation, so we |
1220 | // can just issue the uncommon trap here. |
1221 | // Our access to the unloaded class will only be correct |
1222 | // after it has been loaded and initialized, which requires |
1223 | // a trip through the interpreter. |
1224 | #ifndef PRODUCT |
1225 | if (WizardMode) { tty->print("Null check of unloaded " ); tp->klass()->print(); tty->cr(); } |
1226 | #endif |
1227 | uncommon_trap(Deoptimization::Reason_unloaded, |
1228 | Deoptimization::Action_reinterpret, |
1229 | tp->klass(), "!loaded" ); |
1230 | return top(); |
1231 | } |
1232 | |
1233 | if (assert_null) { |
1234 | // See if the type is contained in NULL_PTR. |
1235 | // If so, then the value is already null. |
1236 | if (t->higher_equal(TypePtr::NULL_PTR)) { |
1237 | NOT_PRODUCT(explicit_null_checks_elided++); |
1238 | return value; // Elided null assert quickly! |
1239 | } |
1240 | } else { |
1241 | // See if mixing in the NULL pointer changes type. |
1242 | // If so, then the NULL pointer was not allowed in the original |
1243 | // type. In other words, "value" was not-null. |
1244 | if (t->meet(TypePtr::NULL_PTR) != t->remove_speculative()) { |
1245 | // same as: if (!TypePtr::NULL_PTR->higher_equal(t)) ... |
1246 | NOT_PRODUCT(explicit_null_checks_elided++); |
1247 | return value; // Elided null check quickly! |
1248 | } |
1249 | } |
1250 | chk = new CmpPNode( value, null() ); |
1251 | break; |
1252 | } |
1253 | |
1254 | default: |
1255 | fatal("unexpected type: %s" , type2name(type)); |
1256 | } |
1257 | assert(chk != NULL, "sanity check" ); |
1258 | chk = _gvn.transform(chk); |
1259 | |
1260 | BoolTest::mask btest = assert_null ? BoolTest::eq : BoolTest::ne; |
1261 | BoolNode *btst = new BoolNode( chk, btest); |
1262 | Node *tst = _gvn.transform( btst ); |
1263 | |
1264 | //----------- |
1265 | // if peephole optimizations occurred, a prior test existed. |
1266 | // If a prior test existed, maybe it dominates as we can avoid this test. |
1267 | if (tst != btst && type == T_OBJECT) { |
1268 | // At this point we want to scan up the CFG to see if we can |
1269 | // find an identical test (and so avoid this test altogether). |
1270 | Node *cfg = control(); |
1271 | int depth = 0; |
1272 | while( depth < 16 ) { // Limit search depth for speed |
1273 | if( cfg->Opcode() == Op_IfTrue && |
1274 | cfg->in(0)->in(1) == tst ) { |
1275 | // Found prior test. Use "cast_not_null" to construct an identical |
1276 | // CastPP (and hence hash to) as already exists for the prior test. |
1277 | // Return that casted value. |
1278 | if (assert_null) { |
1279 | replace_in_map(value, null()); |
1280 | return null(); // do not issue the redundant test |
1281 | } |
1282 | Node *oldcontrol = control(); |
1283 | set_control(cfg); |
1284 | Node *res = cast_not_null(value); |
1285 | set_control(oldcontrol); |
1286 | NOT_PRODUCT(explicit_null_checks_elided++); |
1287 | return res; |
1288 | } |
1289 | cfg = IfNode::up_one_dom(cfg, /*linear_only=*/ true); |
1290 | if (cfg == NULL) break; // Quit at region nodes |
1291 | depth++; |
1292 | } |
1293 | } |
1294 | |
1295 | //----------- |
1296 | // Branch to failure if null |
1297 | float ok_prob = PROB_MAX; // a priori estimate: nulls never happen |
1298 | Deoptimization::DeoptReason reason; |
1299 | if (assert_null) { |
1300 | reason = Deoptimization::reason_null_assert(speculative); |
1301 | } else if (type == T_OBJECT) { |
1302 | reason = Deoptimization::reason_null_check(speculative); |
1303 | } else { |
1304 | reason = Deoptimization::Reason_div0_check; |
1305 | } |
1306 | // %%% Since Reason_unhandled is not recorded on a per-bytecode basis, |
1307 | // ciMethodData::has_trap_at will return a conservative -1 if any |
1308 | // must-be-null assertion has failed. This could cause performance |
1309 | // problems for a method after its first do_null_assert failure. |
1310 | // Consider using 'Reason_class_check' instead? |
1311 | |
1312 | // To cause an implicit null check, we set the not-null probability |
1313 | // to the maximum (PROB_MAX). For an explicit check the probability |
1314 | // is set to a smaller value. |
1315 | if (null_control != NULL || too_many_traps(reason)) { |
1316 | // probability is less likely |
1317 | ok_prob = PROB_LIKELY_MAG(3); |
1318 | } else if (!assert_null && |
1319 | (ImplicitNullCheckThreshold > 0) && |
1320 | method() != NULL && |
1321 | (method()->method_data()->trap_count(reason) |
1322 | >= (uint)ImplicitNullCheckThreshold)) { |
1323 | ok_prob = PROB_LIKELY_MAG(3); |
1324 | } |
1325 | |
1326 | if (null_control != NULL) { |
1327 | IfNode* iff = create_and_map_if(control(), tst, ok_prob, COUNT_UNKNOWN); |
1328 | Node* null_true = _gvn.transform( new IfFalseNode(iff)); |
1329 | set_control( _gvn.transform( new IfTrueNode(iff))); |
1330 | #ifndef PRODUCT |
1331 | if (null_true == top()) { |
1332 | explicit_null_checks_elided++; |
1333 | } |
1334 | #endif |
1335 | (*null_control) = null_true; |
1336 | } else { |
1337 | BuildCutout unless(this, tst, ok_prob); |
1338 | // Check for optimizer eliding test at parse time |
1339 | if (stopped()) { |
1340 | // Failure not possible; do not bother making uncommon trap. |
1341 | NOT_PRODUCT(explicit_null_checks_elided++); |
1342 | } else if (assert_null) { |
1343 | uncommon_trap(reason, |
1344 | Deoptimization::Action_make_not_entrant, |
1345 | NULL, "assert_null" ); |
1346 | } else { |
1347 | replace_in_map(value, zerocon(type)); |
1348 | builtin_throw(reason); |
1349 | } |
1350 | } |
1351 | |
1352 | // Must throw exception, fall-thru not possible? |
1353 | if (stopped()) { |
1354 | return top(); // No result |
1355 | } |
1356 | |
1357 | if (assert_null) { |
1358 | // Cast obj to null on this path. |
1359 | replace_in_map(value, zerocon(type)); |
1360 | return zerocon(type); |
1361 | } |
1362 | |
1363 | // Cast obj to not-null on this path, if there is no null_control. |
1364 | // (If there is a null_control, a non-null value may come back to haunt us.) |
1365 | if (type == T_OBJECT) { |
1366 | Node* cast = cast_not_null(value, false); |
1367 | if (null_control == NULL || (*null_control) == top()) |
1368 | replace_in_map(value, cast); |
1369 | value = cast; |
1370 | } |
1371 | |
1372 | return value; |
1373 | } |
1374 | |
1375 | |
1376 | //------------------------------cast_not_null---------------------------------- |
1377 | // Cast obj to not-null on this path |
1378 | Node* GraphKit::cast_not_null(Node* obj, bool do_replace_in_map) { |
1379 | const Type *t = _gvn.type(obj); |
1380 | const Type *t_not_null = t->join_speculative(TypePtr::NOTNULL); |
1381 | // Object is already not-null? |
1382 | if( t == t_not_null ) return obj; |
1383 | |
1384 | Node *cast = new CastPPNode(obj,t_not_null); |
1385 | cast->init_req(0, control()); |
1386 | cast = _gvn.transform( cast ); |
1387 | |
1388 | // Scan for instances of 'obj' in the current JVM mapping. |
1389 | // These instances are known to be not-null after the test. |
1390 | if (do_replace_in_map) |
1391 | replace_in_map(obj, cast); |
1392 | |
1393 | return cast; // Return casted value |
1394 | } |
1395 | |
1396 | // Sometimes in intrinsics, we implicitly know an object is not null |
1397 | // (there's no actual null check) so we can cast it to not null. In |
1398 | // the course of optimizations, the input to the cast can become null. |
1399 | // In that case that data path will die and we need the control path |
1400 | // to become dead as well to keep the graph consistent. So we have to |
1401 | // add a check for null for which one branch can't be taken. It uses |
1402 | // an Opaque4 node that will cause the check to be removed after loop |
1403 | // opts so the test goes away and the compiled code doesn't execute a |
1404 | // useless check. |
1405 | Node* GraphKit::must_be_not_null(Node* value, bool do_replace_in_map) { |
1406 | Node* chk = _gvn.transform(new CmpPNode(value, null())); |
1407 | Node *tst = _gvn.transform(new BoolNode(chk, BoolTest::ne)); |
1408 | Node* opaq = _gvn.transform(new Opaque4Node(C, tst, intcon(1))); |
1409 | IfNode *iff = new IfNode(control(), opaq, PROB_MAX, COUNT_UNKNOWN); |
1410 | _gvn.set_type(iff, iff->Value(&_gvn)); |
1411 | Node *if_f = _gvn.transform(new IfFalseNode(iff)); |
1412 | Node *frame = _gvn.transform(new ParmNode(C->start(), TypeFunc::FramePtr)); |
1413 | Node *halt = _gvn.transform(new HaltNode(if_f, frame)); |
1414 | C->root()->add_req(halt); |
1415 | Node *if_t = _gvn.transform(new IfTrueNode(iff)); |
1416 | set_control(if_t); |
1417 | return cast_not_null(value, do_replace_in_map); |
1418 | } |
1419 | |
1420 | |
1421 | //--------------------------replace_in_map------------------------------------- |
1422 | void GraphKit::replace_in_map(Node* old, Node* neww) { |
1423 | if (old == neww) { |
1424 | return; |
1425 | } |
1426 | |
1427 | map()->replace_edge(old, neww); |
1428 | |
1429 | // Note: This operation potentially replaces any edge |
1430 | // on the map. This includes locals, stack, and monitors |
1431 | // of the current (innermost) JVM state. |
1432 | |
1433 | // don't let inconsistent types from profiling escape this |
1434 | // method |
1435 | |
1436 | const Type* told = _gvn.type(old); |
1437 | const Type* tnew = _gvn.type(neww); |
1438 | |
1439 | if (!tnew->higher_equal(told)) { |
1440 | return; |
1441 | } |
1442 | |
1443 | map()->record_replaced_node(old, neww); |
1444 | } |
1445 | |
1446 | |
1447 | //============================================================================= |
1448 | //--------------------------------memory--------------------------------------- |
1449 | Node* GraphKit::memory(uint alias_idx) { |
1450 | MergeMemNode* mem = merged_memory(); |
1451 | Node* p = mem->memory_at(alias_idx); |
1452 | _gvn.set_type(p, Type::MEMORY); // must be mapped |
1453 | return p; |
1454 | } |
1455 | |
1456 | //-----------------------------reset_memory------------------------------------ |
1457 | Node* GraphKit::reset_memory() { |
1458 | Node* mem = map()->memory(); |
1459 | // do not use this node for any more parsing! |
1460 | debug_only( map()->set_memory((Node*)NULL) ); |
1461 | return _gvn.transform( mem ); |
1462 | } |
1463 | |
1464 | //------------------------------set_all_memory--------------------------------- |
1465 | void GraphKit::set_all_memory(Node* newmem) { |
1466 | Node* mergemem = MergeMemNode::make(newmem); |
1467 | gvn().set_type_bottom(mergemem); |
1468 | map()->set_memory(mergemem); |
1469 | } |
1470 | |
1471 | //------------------------------set_all_memory_call---------------------------- |
1472 | void GraphKit::set_all_memory_call(Node* call, bool separate_io_proj) { |
1473 | Node* newmem = _gvn.transform( new ProjNode(call, TypeFunc::Memory, separate_io_proj) ); |
1474 | set_all_memory(newmem); |
1475 | } |
1476 | |
1477 | //============================================================================= |
1478 | // |
1479 | // parser factory methods for MemNodes |
1480 | // |
1481 | // These are layered on top of the factory methods in LoadNode and StoreNode, |
1482 | // and integrate with the parser's memory state and _gvn engine. |
1483 | // |
1484 | |
1485 | // factory methods in "int adr_idx" |
1486 | Node* GraphKit::make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, |
1487 | int adr_idx, |
1488 | MemNode::MemOrd mo, |
1489 | LoadNode::ControlDependency control_dependency, |
1490 | bool require_atomic_access, |
1491 | bool unaligned, |
1492 | bool mismatched, |
1493 | bool unsafe) { |
1494 | assert(adr_idx != Compile::AliasIdxTop, "use other make_load factory" ); |
1495 | const TypePtr* adr_type = NULL; // debug-mode-only argument |
1496 | debug_only(adr_type = C->get_adr_type(adr_idx)); |
1497 | Node* mem = memory(adr_idx); |
1498 | Node* ld; |
1499 | if (require_atomic_access && bt == T_LONG) { |
1500 | ld = LoadLNode::make_atomic(ctl, mem, adr, adr_type, t, mo, control_dependency, unaligned, mismatched, unsafe); |
1501 | } else if (require_atomic_access && bt == T_DOUBLE) { |
1502 | ld = LoadDNode::make_atomic(ctl, mem, adr, adr_type, t, mo, control_dependency, unaligned, mismatched, unsafe); |
1503 | } else { |
1504 | ld = LoadNode::make(_gvn, ctl, mem, adr, adr_type, t, bt, mo, control_dependency, unaligned, mismatched, unsafe); |
1505 | } |
1506 | ld = _gvn.transform(ld); |
1507 | if (((bt == T_OBJECT) && C->do_escape_analysis()) || C->eliminate_boxing()) { |
1508 | // Improve graph before escape analysis and boxing elimination. |
1509 | record_for_igvn(ld); |
1510 | } |
1511 | return ld; |
1512 | } |
1513 | |
1514 | Node* GraphKit::store_to_memory(Node* ctl, Node* adr, Node *val, BasicType bt, |
1515 | int adr_idx, |
1516 | MemNode::MemOrd mo, |
1517 | bool require_atomic_access, |
1518 | bool unaligned, |
1519 | bool mismatched, |
1520 | bool unsafe) { |
1521 | assert(adr_idx != Compile::AliasIdxTop, "use other store_to_memory factory" ); |
1522 | const TypePtr* adr_type = NULL; |
1523 | debug_only(adr_type = C->get_adr_type(adr_idx)); |
1524 | Node *mem = memory(adr_idx); |
1525 | Node* st; |
1526 | if (require_atomic_access && bt == T_LONG) { |
1527 | st = StoreLNode::make_atomic(ctl, mem, adr, adr_type, val, mo); |
1528 | } else if (require_atomic_access && bt == T_DOUBLE) { |
1529 | st = StoreDNode::make_atomic(ctl, mem, adr, adr_type, val, mo); |
1530 | } else { |
1531 | st = StoreNode::make(_gvn, ctl, mem, adr, adr_type, val, bt, mo); |
1532 | } |
1533 | if (unaligned) { |
1534 | st->as_Store()->set_unaligned_access(); |
1535 | } |
1536 | if (mismatched) { |
1537 | st->as_Store()->set_mismatched_access(); |
1538 | } |
1539 | if (unsafe) { |
1540 | st->as_Store()->set_unsafe_access(); |
1541 | } |
1542 | st = _gvn.transform(st); |
1543 | set_memory(st, adr_idx); |
1544 | // Back-to-back stores can only remove intermediate store with DU info |
1545 | // so push on worklist for optimizer. |
1546 | if (mem->req() > MemNode::Address && adr == mem->in(MemNode::Address)) |
1547 | record_for_igvn(st); |
1548 | |
1549 | return st; |
1550 | } |
1551 | |
1552 | Node* GraphKit::access_store_at(Node* obj, |
1553 | Node* adr, |
1554 | const TypePtr* adr_type, |
1555 | Node* val, |
1556 | const Type* val_type, |
1557 | BasicType bt, |
1558 | DecoratorSet decorators) { |
1559 | // Transformation of a value which could be NULL pointer (CastPP #NULL) |
1560 | // could be delayed during Parse (for example, in adjust_map_after_if()). |
1561 | // Execute transformation here to avoid barrier generation in such case. |
1562 | if (_gvn.type(val) == TypePtr::NULL_PTR) { |
1563 | val = _gvn.makecon(TypePtr::NULL_PTR); |
1564 | } |
1565 | |
1566 | if (stopped()) { |
1567 | return top(); // Dead path ? |
1568 | } |
1569 | |
1570 | assert(val != NULL, "not dead path" ); |
1571 | |
1572 | C2AccessValuePtr addr(adr, adr_type); |
1573 | C2AccessValue value(val, val_type); |
1574 | C2ParseAccess access(this, decorators | C2_WRITE_ACCESS, bt, obj, addr); |
1575 | if (access.is_raw()) { |
1576 | return _barrier_set->BarrierSetC2::store_at(access, value); |
1577 | } else { |
1578 | return _barrier_set->store_at(access, value); |
1579 | } |
1580 | } |
1581 | |
1582 | Node* GraphKit::access_load_at(Node* obj, // containing obj |
1583 | Node* adr, // actual adress to store val at |
1584 | const TypePtr* adr_type, |
1585 | const Type* val_type, |
1586 | BasicType bt, |
1587 | DecoratorSet decorators) { |
1588 | if (stopped()) { |
1589 | return top(); // Dead path ? |
1590 | } |
1591 | |
1592 | C2AccessValuePtr addr(adr, adr_type); |
1593 | C2ParseAccess access(this, decorators | C2_READ_ACCESS, bt, obj, addr); |
1594 | if (access.is_raw()) { |
1595 | return _barrier_set->BarrierSetC2::load_at(access, val_type); |
1596 | } else { |
1597 | return _barrier_set->load_at(access, val_type); |
1598 | } |
1599 | } |
1600 | |
1601 | Node* GraphKit::access_load(Node* adr, // actual adress to load val at |
1602 | const Type* val_type, |
1603 | BasicType bt, |
1604 | DecoratorSet decorators) { |
1605 | if (stopped()) { |
1606 | return top(); // Dead path ? |
1607 | } |
1608 | |
1609 | C2AccessValuePtr addr(adr, NULL); |
1610 | C2ParseAccess access(this, decorators | C2_READ_ACCESS, bt, NULL, addr); |
1611 | if (access.is_raw()) { |
1612 | return _barrier_set->BarrierSetC2::load_at(access, val_type); |
1613 | } else { |
1614 | return _barrier_set->load_at(access, val_type); |
1615 | } |
1616 | } |
1617 | |
1618 | Node* GraphKit::access_atomic_cmpxchg_val_at(Node* obj, |
1619 | Node* adr, |
1620 | const TypePtr* adr_type, |
1621 | int alias_idx, |
1622 | Node* expected_val, |
1623 | Node* new_val, |
1624 | const Type* value_type, |
1625 | BasicType bt, |
1626 | DecoratorSet decorators) { |
1627 | C2AccessValuePtr addr(adr, adr_type); |
1628 | C2AtomicParseAccess access(this, decorators | C2_READ_ACCESS | C2_WRITE_ACCESS, |
1629 | bt, obj, addr, alias_idx); |
1630 | if (access.is_raw()) { |
1631 | return _barrier_set->BarrierSetC2::atomic_cmpxchg_val_at(access, expected_val, new_val, value_type); |
1632 | } else { |
1633 | return _barrier_set->atomic_cmpxchg_val_at(access, expected_val, new_val, value_type); |
1634 | } |
1635 | } |
1636 | |
1637 | Node* GraphKit::access_atomic_cmpxchg_bool_at(Node* obj, |
1638 | Node* adr, |
1639 | const TypePtr* adr_type, |
1640 | int alias_idx, |
1641 | Node* expected_val, |
1642 | Node* new_val, |
1643 | const Type* value_type, |
1644 | BasicType bt, |
1645 | DecoratorSet decorators) { |
1646 | C2AccessValuePtr addr(adr, adr_type); |
1647 | C2AtomicParseAccess access(this, decorators | C2_READ_ACCESS | C2_WRITE_ACCESS, |
1648 | bt, obj, addr, alias_idx); |
1649 | if (access.is_raw()) { |
1650 | return _barrier_set->BarrierSetC2::atomic_cmpxchg_bool_at(access, expected_val, new_val, value_type); |
1651 | } else { |
1652 | return _barrier_set->atomic_cmpxchg_bool_at(access, expected_val, new_val, value_type); |
1653 | } |
1654 | } |
1655 | |
1656 | Node* GraphKit::access_atomic_xchg_at(Node* obj, |
1657 | Node* adr, |
1658 | const TypePtr* adr_type, |
1659 | int alias_idx, |
1660 | Node* new_val, |
1661 | const Type* value_type, |
1662 | BasicType bt, |
1663 | DecoratorSet decorators) { |
1664 | C2AccessValuePtr addr(adr, adr_type); |
1665 | C2AtomicParseAccess access(this, decorators | C2_READ_ACCESS | C2_WRITE_ACCESS, |
1666 | bt, obj, addr, alias_idx); |
1667 | if (access.is_raw()) { |
1668 | return _barrier_set->BarrierSetC2::atomic_xchg_at(access, new_val, value_type); |
1669 | } else { |
1670 | return _barrier_set->atomic_xchg_at(access, new_val, value_type); |
1671 | } |
1672 | } |
1673 | |
1674 | Node* GraphKit::access_atomic_add_at(Node* obj, |
1675 | Node* adr, |
1676 | const TypePtr* adr_type, |
1677 | int alias_idx, |
1678 | Node* new_val, |
1679 | const Type* value_type, |
1680 | BasicType bt, |
1681 | DecoratorSet decorators) { |
1682 | C2AccessValuePtr addr(adr, adr_type); |
1683 | C2AtomicParseAccess access(this, decorators | C2_READ_ACCESS | C2_WRITE_ACCESS, bt, obj, addr, alias_idx); |
1684 | if (access.is_raw()) { |
1685 | return _barrier_set->BarrierSetC2::atomic_add_at(access, new_val, value_type); |
1686 | } else { |
1687 | return _barrier_set->atomic_add_at(access, new_val, value_type); |
1688 | } |
1689 | } |
1690 | |
1691 | void GraphKit::access_clone(Node* src, Node* dst, Node* size, bool is_array) { |
1692 | return _barrier_set->clone(this, src, dst, size, is_array); |
1693 | } |
1694 | |
1695 | Node* GraphKit::access_resolve(Node* n, DecoratorSet decorators) { |
1696 | // Use stronger ACCESS_WRITE|ACCESS_READ by default. |
1697 | if ((decorators & (ACCESS_READ | ACCESS_WRITE)) == 0) { |
1698 | decorators |= ACCESS_READ | ACCESS_WRITE; |
1699 | } |
1700 | return _barrier_set->resolve(this, n, decorators); |
1701 | } |
1702 | |
1703 | //-------------------------array_element_address------------------------- |
1704 | Node* GraphKit::array_element_address(Node* ary, Node* idx, BasicType elembt, |
1705 | const TypeInt* sizetype, Node* ctrl) { |
1706 | uint shift = exact_log2(type2aelembytes(elembt)); |
1707 | uint = arrayOopDesc::base_offset_in_bytes(elembt); |
1708 | |
1709 | // short-circuit a common case (saves lots of confusing waste motion) |
1710 | jint idx_con = find_int_con(idx, -1); |
1711 | if (idx_con >= 0) { |
1712 | intptr_t offset = header + ((intptr_t)idx_con << shift); |
1713 | return basic_plus_adr(ary, offset); |
1714 | } |
1715 | |
1716 | // must be correct type for alignment purposes |
1717 | Node* base = basic_plus_adr(ary, header); |
1718 | idx = Compile::conv_I2X_index(&_gvn, idx, sizetype, ctrl); |
1719 | Node* scale = _gvn.transform( new LShiftXNode(idx, intcon(shift)) ); |
1720 | return basic_plus_adr(ary, base, scale); |
1721 | } |
1722 | |
1723 | //-------------------------load_array_element------------------------- |
1724 | Node* GraphKit::load_array_element(Node* ctl, Node* ary, Node* idx, const TypeAryPtr* arytype) { |
1725 | const Type* elemtype = arytype->elem(); |
1726 | BasicType elembt = elemtype->array_element_basic_type(); |
1727 | Node* adr = array_element_address(ary, idx, elembt, arytype->size()); |
1728 | if (elembt == T_NARROWOOP) { |
1729 | elembt = T_OBJECT; // To satisfy switch in LoadNode::make() |
1730 | } |
1731 | Node* ld = make_load(ctl, adr, elemtype, elembt, arytype, MemNode::unordered); |
1732 | return ld; |
1733 | } |
1734 | |
1735 | //-------------------------set_arguments_for_java_call------------------------- |
1736 | // Arguments (pre-popped from the stack) are taken from the JVMS. |
1737 | void GraphKit::set_arguments_for_java_call(CallJavaNode* call) { |
1738 | // Add the call arguments: |
1739 | uint nargs = call->method()->arg_size(); |
1740 | for (uint i = 0; i < nargs; i++) { |
1741 | Node* arg = argument(i); |
1742 | call->init_req(i + TypeFunc::Parms, arg); |
1743 | } |
1744 | } |
1745 | |
1746 | //---------------------------set_edges_for_java_call--------------------------- |
1747 | // Connect a newly created call into the current JVMS. |
1748 | // A return value node (if any) is returned from set_edges_for_java_call. |
1749 | void GraphKit::set_edges_for_java_call(CallJavaNode* call, bool must_throw, bool separate_io_proj) { |
1750 | |
1751 | // Add the predefined inputs: |
1752 | call->init_req( TypeFunc::Control, control() ); |
1753 | call->init_req( TypeFunc::I_O , i_o() ); |
1754 | call->init_req( TypeFunc::Memory , reset_memory() ); |
1755 | call->init_req( TypeFunc::FramePtr, frameptr() ); |
1756 | call->init_req( TypeFunc::ReturnAdr, top() ); |
1757 | |
1758 | add_safepoint_edges(call, must_throw); |
1759 | |
1760 | Node* xcall = _gvn.transform(call); |
1761 | |
1762 | if (xcall == top()) { |
1763 | set_control(top()); |
1764 | return; |
1765 | } |
1766 | assert(xcall == call, "call identity is stable" ); |
1767 | |
1768 | // Re-use the current map to produce the result. |
1769 | |
1770 | set_control(_gvn.transform(new ProjNode(call, TypeFunc::Control))); |
1771 | set_i_o( _gvn.transform(new ProjNode(call, TypeFunc::I_O , separate_io_proj))); |
1772 | set_all_memory_call(xcall, separate_io_proj); |
1773 | |
1774 | //return xcall; // no need, caller already has it |
1775 | } |
1776 | |
1777 | Node* GraphKit::set_results_for_java_call(CallJavaNode* call, bool separate_io_proj, bool deoptimize) { |
1778 | if (stopped()) return top(); // maybe the call folded up? |
1779 | |
1780 | // Capture the return value, if any. |
1781 | Node* ret; |
1782 | if (call->method() == NULL || |
1783 | call->method()->return_type()->basic_type() == T_VOID) |
1784 | ret = top(); |
1785 | else ret = _gvn.transform(new ProjNode(call, TypeFunc::Parms)); |
1786 | |
1787 | // Note: Since any out-of-line call can produce an exception, |
1788 | // we always insert an I_O projection from the call into the result. |
1789 | |
1790 | make_slow_call_ex(call, env()->Throwable_klass(), separate_io_proj, deoptimize); |
1791 | |
1792 | if (separate_io_proj) { |
1793 | // The caller requested separate projections be used by the fall |
1794 | // through and exceptional paths, so replace the projections for |
1795 | // the fall through path. |
1796 | set_i_o(_gvn.transform( new ProjNode(call, TypeFunc::I_O) )); |
1797 | set_all_memory(_gvn.transform( new ProjNode(call, TypeFunc::Memory) )); |
1798 | } |
1799 | return ret; |
1800 | } |
1801 | |
1802 | //--------------------set_predefined_input_for_runtime_call-------------------- |
1803 | // Reading and setting the memory state is way conservative here. |
1804 | // The real problem is that I am not doing real Type analysis on memory, |
1805 | // so I cannot distinguish card mark stores from other stores. Across a GC |
1806 | // point the Store Barrier and the card mark memory has to agree. I cannot |
1807 | // have a card mark store and its barrier split across the GC point from |
1808 | // either above or below. Here I get that to happen by reading ALL of memory. |
1809 | // A better answer would be to separate out card marks from other memory. |
1810 | // For now, return the input memory state, so that it can be reused |
1811 | // after the call, if this call has restricted memory effects. |
1812 | Node* GraphKit::set_predefined_input_for_runtime_call(SafePointNode* call, Node* narrow_mem) { |
1813 | // Set fixed predefined input arguments |
1814 | Node* memory = reset_memory(); |
1815 | Node* m = narrow_mem == NULL ? memory : narrow_mem; |
1816 | call->init_req( TypeFunc::Control, control() ); |
1817 | call->init_req( TypeFunc::I_O, top() ); // does no i/o |
1818 | call->init_req( TypeFunc::Memory, m ); // may gc ptrs |
1819 | call->init_req( TypeFunc::FramePtr, frameptr() ); |
1820 | call->init_req( TypeFunc::ReturnAdr, top() ); |
1821 | return memory; |
1822 | } |
1823 | |
1824 | //-------------------set_predefined_output_for_runtime_call-------------------- |
1825 | // Set control and memory (not i_o) from the call. |
1826 | // If keep_mem is not NULL, use it for the output state, |
1827 | // except for the RawPtr output of the call, if hook_mem is TypeRawPtr::BOTTOM. |
1828 | // If hook_mem is NULL, this call produces no memory effects at all. |
1829 | // If hook_mem is a Java-visible memory slice (such as arraycopy operands), |
1830 | // then only that memory slice is taken from the call. |
1831 | // In the last case, we must put an appropriate memory barrier before |
1832 | // the call, so as to create the correct anti-dependencies on loads |
1833 | // preceding the call. |
1834 | void GraphKit::set_predefined_output_for_runtime_call(Node* call, |
1835 | Node* keep_mem, |
1836 | const TypePtr* hook_mem) { |
1837 | // no i/o |
1838 | set_control(_gvn.transform( new ProjNode(call,TypeFunc::Control) )); |
1839 | if (keep_mem) { |
1840 | // First clone the existing memory state |
1841 | set_all_memory(keep_mem); |
1842 | if (hook_mem != NULL) { |
1843 | // Make memory for the call |
1844 | Node* mem = _gvn.transform( new ProjNode(call, TypeFunc::Memory) ); |
1845 | // Set the RawPtr memory state only. This covers all the heap top/GC stuff |
1846 | // We also use hook_mem to extract specific effects from arraycopy stubs. |
1847 | set_memory(mem, hook_mem); |
1848 | } |
1849 | // ...else the call has NO memory effects. |
1850 | |
1851 | // Make sure the call advertises its memory effects precisely. |
1852 | // This lets us build accurate anti-dependences in gcm.cpp. |
1853 | assert(C->alias_type(call->adr_type()) == C->alias_type(hook_mem), |
1854 | "call node must be constructed correctly" ); |
1855 | } else { |
1856 | assert(hook_mem == NULL, "" ); |
1857 | // This is not a "slow path" call; all memory comes from the call. |
1858 | set_all_memory_call(call); |
1859 | } |
1860 | } |
1861 | |
1862 | // Keep track of MergeMems feeding into other MergeMems |
1863 | static void add_mergemem_users_to_worklist(Unique_Node_List& wl, Node* mem) { |
1864 | if (!mem->is_MergeMem()) { |
1865 | return; |
1866 | } |
1867 | for (SimpleDUIterator i(mem); i.has_next(); i.next()) { |
1868 | Node* use = i.get(); |
1869 | if (use->is_MergeMem()) { |
1870 | wl.push(use); |
1871 | } |
1872 | } |
1873 | } |
1874 | |
1875 | // Replace the call with the current state of the kit. |
1876 | void GraphKit::replace_call(CallNode* call, Node* result, bool do_replaced_nodes) { |
1877 | JVMState* ejvms = NULL; |
1878 | if (has_exceptions()) { |
1879 | ejvms = transfer_exceptions_into_jvms(); |
1880 | } |
1881 | |
1882 | ReplacedNodes replaced_nodes = map()->replaced_nodes(); |
1883 | ReplacedNodes replaced_nodes_exception; |
1884 | Node* ex_ctl = top(); |
1885 | |
1886 | SafePointNode* final_state = stop(); |
1887 | |
1888 | // Find all the needed outputs of this call |
1889 | CallProjections callprojs; |
1890 | call->extract_projections(&callprojs, true); |
1891 | |
1892 | Unique_Node_List wl; |
1893 | Node* init_mem = call->in(TypeFunc::Memory); |
1894 | Node* final_mem = final_state->in(TypeFunc::Memory); |
1895 | Node* final_ctl = final_state->in(TypeFunc::Control); |
1896 | Node* final_io = final_state->in(TypeFunc::I_O); |
1897 | |
1898 | // Replace all the old call edges with the edges from the inlining result |
1899 | if (callprojs.fallthrough_catchproj != NULL) { |
1900 | C->gvn_replace_by(callprojs.fallthrough_catchproj, final_ctl); |
1901 | } |
1902 | if (callprojs.fallthrough_memproj != NULL) { |
1903 | if (final_mem->is_MergeMem()) { |
1904 | // Parser's exits MergeMem was not transformed but may be optimized |
1905 | final_mem = _gvn.transform(final_mem); |
1906 | } |
1907 | C->gvn_replace_by(callprojs.fallthrough_memproj, final_mem); |
1908 | add_mergemem_users_to_worklist(wl, final_mem); |
1909 | } |
1910 | if (callprojs.fallthrough_ioproj != NULL) { |
1911 | C->gvn_replace_by(callprojs.fallthrough_ioproj, final_io); |
1912 | } |
1913 | |
1914 | // Replace the result with the new result if it exists and is used |
1915 | if (callprojs.resproj != NULL && result != NULL) { |
1916 | C->gvn_replace_by(callprojs.resproj, result); |
1917 | } |
1918 | |
1919 | if (ejvms == NULL) { |
1920 | // No exception edges to simply kill off those paths |
1921 | if (callprojs.catchall_catchproj != NULL) { |
1922 | C->gvn_replace_by(callprojs.catchall_catchproj, C->top()); |
1923 | } |
1924 | if (callprojs.catchall_memproj != NULL) { |
1925 | C->gvn_replace_by(callprojs.catchall_memproj, C->top()); |
1926 | } |
1927 | if (callprojs.catchall_ioproj != NULL) { |
1928 | C->gvn_replace_by(callprojs.catchall_ioproj, C->top()); |
1929 | } |
1930 | // Replace the old exception object with top |
1931 | if (callprojs.exobj != NULL) { |
1932 | C->gvn_replace_by(callprojs.exobj, C->top()); |
1933 | } |
1934 | } else { |
1935 | GraphKit ekit(ejvms); |
1936 | |
1937 | // Load my combined exception state into the kit, with all phis transformed: |
1938 | SafePointNode* ex_map = ekit.combine_and_pop_all_exception_states(); |
1939 | replaced_nodes_exception = ex_map->replaced_nodes(); |
1940 | |
1941 | Node* ex_oop = ekit.use_exception_state(ex_map); |
1942 | |
1943 | if (callprojs.catchall_catchproj != NULL) { |
1944 | C->gvn_replace_by(callprojs.catchall_catchproj, ekit.control()); |
1945 | ex_ctl = ekit.control(); |
1946 | } |
1947 | if (callprojs.catchall_memproj != NULL) { |
1948 | Node* ex_mem = ekit.reset_memory(); |
1949 | C->gvn_replace_by(callprojs.catchall_memproj, ex_mem); |
1950 | add_mergemem_users_to_worklist(wl, ex_mem); |
1951 | } |
1952 | if (callprojs.catchall_ioproj != NULL) { |
1953 | C->gvn_replace_by(callprojs.catchall_ioproj, ekit.i_o()); |
1954 | } |
1955 | |
1956 | // Replace the old exception object with the newly created one |
1957 | if (callprojs.exobj != NULL) { |
1958 | C->gvn_replace_by(callprojs.exobj, ex_oop); |
1959 | } |
1960 | } |
1961 | |
1962 | // Disconnect the call from the graph |
1963 | call->disconnect_inputs(NULL, C); |
1964 | C->gvn_replace_by(call, C->top()); |
1965 | |
1966 | // Clean up any MergeMems that feed other MergeMems since the |
1967 | // optimizer doesn't like that. |
1968 | while (wl.size() > 0) { |
1969 | _gvn.transform(wl.pop()); |
1970 | } |
1971 | |
1972 | if (callprojs.fallthrough_catchproj != NULL && !final_ctl->is_top() && do_replaced_nodes) { |
1973 | replaced_nodes.apply(C, final_ctl); |
1974 | } |
1975 | if (!ex_ctl->is_top() && do_replaced_nodes) { |
1976 | replaced_nodes_exception.apply(C, ex_ctl); |
1977 | } |
1978 | } |
1979 | |
1980 | |
1981 | //------------------------------increment_counter------------------------------ |
1982 | // for statistics: increment a VM counter by 1 |
1983 | |
1984 | void GraphKit::increment_counter(address counter_addr) { |
1985 | Node* adr1 = makecon(TypeRawPtr::make(counter_addr)); |
1986 | increment_counter(adr1); |
1987 | } |
1988 | |
1989 | void GraphKit::increment_counter(Node* counter_addr) { |
1990 | int adr_type = Compile::AliasIdxRaw; |
1991 | Node* ctrl = control(); |
1992 | Node* cnt = make_load(ctrl, counter_addr, TypeInt::INT, T_INT, adr_type, MemNode::unordered); |
1993 | Node* incr = _gvn.transform(new AddINode(cnt, _gvn.intcon(1))); |
1994 | store_to_memory(ctrl, counter_addr, incr, T_INT, adr_type, MemNode::unordered); |
1995 | } |
1996 | |
1997 | |
1998 | //------------------------------uncommon_trap---------------------------------- |
1999 | // Bail out to the interpreter in mid-method. Implemented by calling the |
2000 | // uncommon_trap blob. This helper function inserts a runtime call with the |
2001 | // right debug info. |
2002 | void GraphKit::uncommon_trap(int trap_request, |
2003 | ciKlass* klass, const char* , |
2004 | bool must_throw, |
2005 | bool keep_exact_action) { |
2006 | if (failing()) stop(); |
2007 | if (stopped()) return; // trap reachable? |
2008 | |
2009 | // Note: If ProfileTraps is true, and if a deopt. actually |
2010 | // occurs here, the runtime will make sure an MDO exists. There is |
2011 | // no need to call method()->ensure_method_data() at this point. |
2012 | |
2013 | // Set the stack pointer to the right value for reexecution: |
2014 | set_sp(reexecute_sp()); |
2015 | |
2016 | #ifdef ASSERT |
2017 | if (!must_throw) { |
2018 | // Make sure the stack has at least enough depth to execute |
2019 | // the current bytecode. |
2020 | int inputs, ignored_depth; |
2021 | if (compute_stack_effects(inputs, ignored_depth)) { |
2022 | assert(sp() >= inputs, "must have enough JVMS stack to execute %s: sp=%d, inputs=%d" , |
2023 | Bytecodes::name(java_bc()), sp(), inputs); |
2024 | } |
2025 | } |
2026 | #endif |
2027 | |
2028 | Deoptimization::DeoptReason reason = Deoptimization::trap_request_reason(trap_request); |
2029 | Deoptimization::DeoptAction action = Deoptimization::trap_request_action(trap_request); |
2030 | |
2031 | switch (action) { |
2032 | case Deoptimization::Action_maybe_recompile: |
2033 | case Deoptimization::Action_reinterpret: |
2034 | // Temporary fix for 6529811 to allow virtual calls to be sure they |
2035 | // get the chance to go from mono->bi->mega |
2036 | if (!keep_exact_action && |
2037 | Deoptimization::trap_request_index(trap_request) < 0 && |
2038 | too_many_recompiles(reason)) { |
2039 | // This BCI is causing too many recompilations. |
2040 | if (C->log() != NULL) { |
2041 | C->log()->elem("observe that='trap_action_change' reason='%s' from='%s' to='none'" , |
2042 | Deoptimization::trap_reason_name(reason), |
2043 | Deoptimization::trap_action_name(action)); |
2044 | } |
2045 | action = Deoptimization::Action_none; |
2046 | trap_request = Deoptimization::make_trap_request(reason, action); |
2047 | } else { |
2048 | C->set_trap_can_recompile(true); |
2049 | } |
2050 | break; |
2051 | case Deoptimization::Action_make_not_entrant: |
2052 | C->set_trap_can_recompile(true); |
2053 | break; |
2054 | case Deoptimization::Action_none: |
2055 | case Deoptimization::Action_make_not_compilable: |
2056 | break; |
2057 | default: |
2058 | #ifdef ASSERT |
2059 | fatal("unknown action %d: %s" , action, Deoptimization::trap_action_name(action)); |
2060 | #endif |
2061 | break; |
2062 | } |
2063 | |
2064 | if (TraceOptoParse) { |
2065 | char buf[100]; |
2066 | tty->print_cr("Uncommon trap %s at bci:%d" , |
2067 | Deoptimization::format_trap_request(buf, sizeof(buf), |
2068 | trap_request), bci()); |
2069 | } |
2070 | |
2071 | CompileLog* log = C->log(); |
2072 | if (log != NULL) { |
2073 | int kid = (klass == NULL)? -1: log->identify(klass); |
2074 | log->begin_elem("uncommon_trap bci='%d'" , bci()); |
2075 | char buf[100]; |
2076 | log->print(" %s" , Deoptimization::format_trap_request(buf, sizeof(buf), |
2077 | trap_request)); |
2078 | if (kid >= 0) log->print(" klass='%d'" , kid); |
2079 | if (comment != NULL) log->print(" comment='%s'" , comment); |
2080 | log->end_elem(); |
2081 | } |
2082 | |
2083 | // Make sure any guarding test views this path as very unlikely |
2084 | Node *i0 = control()->in(0); |
2085 | if (i0 != NULL && i0->is_If()) { // Found a guarding if test? |
2086 | IfNode *iff = i0->as_If(); |
2087 | float f = iff->_prob; // Get prob |
2088 | if (control()->Opcode() == Op_IfTrue) { |
2089 | if (f > PROB_UNLIKELY_MAG(4)) |
2090 | iff->_prob = PROB_MIN; |
2091 | } else { |
2092 | if (f < PROB_LIKELY_MAG(4)) |
2093 | iff->_prob = PROB_MAX; |
2094 | } |
2095 | } |
2096 | |
2097 | // Clear out dead values from the debug info. |
2098 | kill_dead_locals(); |
2099 | |
2100 | // Now insert the uncommon trap subroutine call |
2101 | address call_addr = SharedRuntime::uncommon_trap_blob()->entry_point(); |
2102 | const TypePtr* no_memory_effects = NULL; |
2103 | // Pass the index of the class to be loaded |
2104 | Node* call = make_runtime_call(RC_NO_LEAF | RC_UNCOMMON | |
2105 | (must_throw ? RC_MUST_THROW : 0), |
2106 | OptoRuntime::uncommon_trap_Type(), |
2107 | call_addr, "uncommon_trap" , no_memory_effects, |
2108 | intcon(trap_request)); |
2109 | assert(call->as_CallStaticJava()->uncommon_trap_request() == trap_request, |
2110 | "must extract request correctly from the graph" ); |
2111 | assert(trap_request != 0, "zero value reserved by uncommon_trap_request" ); |
2112 | |
2113 | call->set_req(TypeFunc::ReturnAdr, returnadr()); |
2114 | // The debug info is the only real input to this call. |
2115 | |
2116 | // Halt-and-catch fire here. The above call should never return! |
2117 | HaltNode* halt = new HaltNode(control(), frameptr()); |
2118 | _gvn.set_type_bottom(halt); |
2119 | root()->add_req(halt); |
2120 | |
2121 | stop_and_kill_map(); |
2122 | } |
2123 | |
2124 | |
2125 | //--------------------------just_allocated_object------------------------------ |
2126 | // Report the object that was just allocated. |
2127 | // It must be the case that there are no intervening safepoints. |
2128 | // We use this to determine if an object is so "fresh" that |
2129 | // it does not require card marks. |
2130 | Node* GraphKit::just_allocated_object(Node* current_control) { |
2131 | Node* ctrl = current_control; |
2132 | // Object::<init> is invoked after allocation, most of invoke nodes |
2133 | // will be reduced, but a region node is kept in parse time, we check |
2134 | // the pattern and skip the region node if it degraded to a copy. |
2135 | if (ctrl != NULL && ctrl->is_Region() && ctrl->req() == 2 && |
2136 | ctrl->as_Region()->is_copy()) { |
2137 | ctrl = ctrl->as_Region()->is_copy(); |
2138 | } |
2139 | if (C->recent_alloc_ctl() == ctrl) { |
2140 | return C->recent_alloc_obj(); |
2141 | } |
2142 | return NULL; |
2143 | } |
2144 | |
2145 | |
2146 | void GraphKit::round_double_arguments(ciMethod* dest_method) { |
2147 | // (Note: TypeFunc::make has a cache that makes this fast.) |
2148 | const TypeFunc* tf = TypeFunc::make(dest_method); |
2149 | int nargs = tf->domain()->cnt() - TypeFunc::Parms; |
2150 | for (int j = 0; j < nargs; j++) { |
2151 | const Type *targ = tf->domain()->field_at(j + TypeFunc::Parms); |
2152 | if( targ->basic_type() == T_DOUBLE ) { |
2153 | // If any parameters are doubles, they must be rounded before |
2154 | // the call, dstore_rounding does gvn.transform |
2155 | Node *arg = argument(j); |
2156 | arg = dstore_rounding(arg); |
2157 | set_argument(j, arg); |
2158 | } |
2159 | } |
2160 | } |
2161 | |
2162 | /** |
2163 | * Record profiling data exact_kls for Node n with the type system so |
2164 | * that it can propagate it (speculation) |
2165 | * |
2166 | * @param n node that the type applies to |
2167 | * @param exact_kls type from profiling |
2168 | * @param maybe_null did profiling see null? |
2169 | * |
2170 | * @return node with improved type |
2171 | */ |
2172 | Node* GraphKit::record_profile_for_speculation(Node* n, ciKlass* exact_kls, ProfilePtrKind ptr_kind) { |
2173 | const Type* current_type = _gvn.type(n); |
2174 | assert(UseTypeSpeculation, "type speculation must be on" ); |
2175 | |
2176 | const TypePtr* speculative = current_type->speculative(); |
2177 | |
2178 | // Should the klass from the profile be recorded in the speculative type? |
2179 | if (current_type->would_improve_type(exact_kls, jvms()->depth())) { |
2180 | const TypeKlassPtr* tklass = TypeKlassPtr::make(exact_kls); |
2181 | const TypeOopPtr* xtype = tklass->as_instance_type(); |
2182 | assert(xtype->klass_is_exact(), "Should be exact" ); |
2183 | // Any reason to believe n is not null (from this profiling or a previous one)? |
2184 | assert(ptr_kind != ProfileAlwaysNull, "impossible here" ); |
2185 | const TypePtr* ptr = (ptr_kind == ProfileMaybeNull && current_type->speculative_maybe_null()) ? TypePtr::BOTTOM : TypePtr::NOTNULL; |
2186 | // record the new speculative type's depth |
2187 | speculative = xtype->cast_to_ptr_type(ptr->ptr())->is_ptr(); |
2188 | speculative = speculative->with_inline_depth(jvms()->depth()); |
2189 | } else if (current_type->would_improve_ptr(ptr_kind)) { |
2190 | // Profiling report that null was never seen so we can change the |
2191 | // speculative type to non null ptr. |
2192 | if (ptr_kind == ProfileAlwaysNull) { |
2193 | speculative = TypePtr::NULL_PTR; |
2194 | } else { |
2195 | assert(ptr_kind == ProfileNeverNull, "nothing else is an improvement" ); |
2196 | const TypePtr* ptr = TypePtr::NOTNULL; |
2197 | if (speculative != NULL) { |
2198 | speculative = speculative->cast_to_ptr_type(ptr->ptr())->is_ptr(); |
2199 | } else { |
2200 | speculative = ptr; |
2201 | } |
2202 | } |
2203 | } |
2204 | |
2205 | if (speculative != current_type->speculative()) { |
2206 | // Build a type with a speculative type (what we think we know |
2207 | // about the type but will need a guard when we use it) |
2208 | const TypeOopPtr* spec_type = TypeOopPtr::make(TypePtr::BotPTR, Type::OffsetBot, TypeOopPtr::InstanceBot, speculative); |
2209 | // We're changing the type, we need a new CheckCast node to carry |
2210 | // the new type. The new type depends on the control: what |
2211 | // profiling tells us is only valid from here as far as we can |
2212 | // tell. |
2213 | Node* cast = new CheckCastPPNode(control(), n, current_type->remove_speculative()->join_speculative(spec_type)); |
2214 | cast = _gvn.transform(cast); |
2215 | replace_in_map(n, cast); |
2216 | n = cast; |
2217 | } |
2218 | |
2219 | return n; |
2220 | } |
2221 | |
2222 | /** |
2223 | * Record profiling data from receiver profiling at an invoke with the |
2224 | * type system so that it can propagate it (speculation) |
2225 | * |
2226 | * @param n receiver node |
2227 | * |
2228 | * @return node with improved type |
2229 | */ |
2230 | Node* GraphKit::record_profiled_receiver_for_speculation(Node* n) { |
2231 | if (!UseTypeSpeculation) { |
2232 | return n; |
2233 | } |
2234 | ciKlass* exact_kls = profile_has_unique_klass(); |
2235 | ProfilePtrKind ptr_kind = ProfileMaybeNull; |
2236 | if ((java_bc() == Bytecodes::_checkcast || |
2237 | java_bc() == Bytecodes::_instanceof || |
2238 | java_bc() == Bytecodes::_aastore) && |
2239 | method()->method_data()->is_mature()) { |
2240 | ciProfileData* data = method()->method_data()->bci_to_data(bci()); |
2241 | if (data != NULL) { |
2242 | if (!data->as_BitData()->null_seen()) { |
2243 | ptr_kind = ProfileNeverNull; |
2244 | } else { |
2245 | assert(data->is_ReceiverTypeData(), "bad profile data type" ); |
2246 | ciReceiverTypeData* call = (ciReceiverTypeData*)data->as_ReceiverTypeData(); |
2247 | uint i = 0; |
2248 | for (; i < call->row_limit(); i++) { |
2249 | ciKlass* receiver = call->receiver(i); |
2250 | if (receiver != NULL) { |
2251 | break; |
2252 | } |
2253 | } |
2254 | ptr_kind = (i == call->row_limit()) ? ProfileAlwaysNull : ProfileMaybeNull; |
2255 | } |
2256 | } |
2257 | } |
2258 | return record_profile_for_speculation(n, exact_kls, ptr_kind); |
2259 | } |
2260 | |
2261 | /** |
2262 | * Record profiling data from argument profiling at an invoke with the |
2263 | * type system so that it can propagate it (speculation) |
2264 | * |
2265 | * @param dest_method target method for the call |
2266 | * @param bc what invoke bytecode is this? |
2267 | */ |
2268 | void GraphKit::record_profiled_arguments_for_speculation(ciMethod* dest_method, Bytecodes::Code bc) { |
2269 | if (!UseTypeSpeculation) { |
2270 | return; |
2271 | } |
2272 | const TypeFunc* tf = TypeFunc::make(dest_method); |
2273 | int nargs = tf->domain()->cnt() - TypeFunc::Parms; |
2274 | int skip = Bytecodes::has_receiver(bc) ? 1 : 0; |
2275 | for (int j = skip, i = 0; j < nargs && i < TypeProfileArgsLimit; j++) { |
2276 | const Type *targ = tf->domain()->field_at(j + TypeFunc::Parms); |
2277 | if (targ->basic_type() == T_OBJECT || targ->basic_type() == T_ARRAY) { |
2278 | ProfilePtrKind ptr_kind = ProfileMaybeNull; |
2279 | ciKlass* better_type = NULL; |
2280 | if (method()->argument_profiled_type(bci(), i, better_type, ptr_kind)) { |
2281 | record_profile_for_speculation(argument(j), better_type, ptr_kind); |
2282 | } |
2283 | i++; |
2284 | } |
2285 | } |
2286 | } |
2287 | |
2288 | /** |
2289 | * Record profiling data from parameter profiling at an invoke with |
2290 | * the type system so that it can propagate it (speculation) |
2291 | */ |
2292 | void GraphKit::record_profiled_parameters_for_speculation() { |
2293 | if (!UseTypeSpeculation) { |
2294 | return; |
2295 | } |
2296 | for (int i = 0, j = 0; i < method()->arg_size() ; i++) { |
2297 | if (_gvn.type(local(i))->isa_oopptr()) { |
2298 | ProfilePtrKind ptr_kind = ProfileMaybeNull; |
2299 | ciKlass* better_type = NULL; |
2300 | if (method()->parameter_profiled_type(j, better_type, ptr_kind)) { |
2301 | record_profile_for_speculation(local(i), better_type, ptr_kind); |
2302 | } |
2303 | j++; |
2304 | } |
2305 | } |
2306 | } |
2307 | |
2308 | /** |
2309 | * Record profiling data from return value profiling at an invoke with |
2310 | * the type system so that it can propagate it (speculation) |
2311 | */ |
2312 | void GraphKit::record_profiled_return_for_speculation() { |
2313 | if (!UseTypeSpeculation) { |
2314 | return; |
2315 | } |
2316 | ProfilePtrKind ptr_kind = ProfileMaybeNull; |
2317 | ciKlass* better_type = NULL; |
2318 | if (method()->return_profiled_type(bci(), better_type, ptr_kind)) { |
2319 | // If profiling reports a single type for the return value, |
2320 | // feed it to the type system so it can propagate it as a |
2321 | // speculative type |
2322 | record_profile_for_speculation(stack(sp()-1), better_type, ptr_kind); |
2323 | } |
2324 | } |
2325 | |
2326 | void GraphKit::round_double_result(ciMethod* dest_method) { |
2327 | // A non-strict method may return a double value which has an extended |
2328 | // exponent, but this must not be visible in a caller which is 'strict' |
2329 | // If a strict caller invokes a non-strict callee, round a double result |
2330 | |
2331 | BasicType result_type = dest_method->return_type()->basic_type(); |
2332 | assert( method() != NULL, "must have caller context" ); |
2333 | if( result_type == T_DOUBLE && method()->is_strict() && !dest_method->is_strict() ) { |
2334 | // Destination method's return value is on top of stack |
2335 | // dstore_rounding() does gvn.transform |
2336 | Node *result = pop_pair(); |
2337 | result = dstore_rounding(result); |
2338 | push_pair(result); |
2339 | } |
2340 | } |
2341 | |
2342 | // rounding for strict float precision conformance |
2343 | Node* GraphKit::precision_rounding(Node* n) { |
2344 | return UseStrictFP && _method->flags().is_strict() |
2345 | && UseSSE == 0 && Matcher::strict_fp_requires_explicit_rounding |
2346 | ? _gvn.transform( new RoundFloatNode(0, n) ) |
2347 | : n; |
2348 | } |
2349 | |
2350 | // rounding for strict double precision conformance |
2351 | Node* GraphKit::dprecision_rounding(Node *n) { |
2352 | return UseStrictFP && _method->flags().is_strict() |
2353 | && UseSSE <= 1 && Matcher::strict_fp_requires_explicit_rounding |
2354 | ? _gvn.transform( new RoundDoubleNode(0, n) ) |
2355 | : n; |
2356 | } |
2357 | |
2358 | // rounding for non-strict double stores |
2359 | Node* GraphKit::dstore_rounding(Node* n) { |
2360 | return Matcher::strict_fp_requires_explicit_rounding |
2361 | && UseSSE <= 1 |
2362 | ? _gvn.transform( new RoundDoubleNode(0, n) ) |
2363 | : n; |
2364 | } |
2365 | |
2366 | //============================================================================= |
2367 | // Generate a fast path/slow path idiom. Graph looks like: |
2368 | // [foo] indicates that 'foo' is a parameter |
2369 | // |
2370 | // [in] NULL |
2371 | // \ / |
2372 | // CmpP |
2373 | // Bool ne |
2374 | // If |
2375 | // / \ |
2376 | // True False-<2> |
2377 | // / | |
2378 | // / cast_not_null |
2379 | // Load | | ^ |
2380 | // [fast_test] | | |
2381 | // gvn to opt_test | | |
2382 | // / \ | <1> |
2383 | // True False | |
2384 | // | \\ | |
2385 | // [slow_call] \[fast_result] |
2386 | // Ctl Val \ \ |
2387 | // | \ \ |
2388 | // Catch <1> \ \ |
2389 | // / \ ^ \ \ |
2390 | // Ex No_Ex | \ \ |
2391 | // | \ \ | \ <2> \ |
2392 | // ... \ [slow_res] | | \ [null_result] |
2393 | // \ \--+--+--- | | |
2394 | // \ | / \ | / |
2395 | // --------Region Phi |
2396 | // |
2397 | //============================================================================= |
2398 | // Code is structured as a series of driver functions all called 'do_XXX' that |
2399 | // call a set of helper functions. Helper functions first, then drivers. |
2400 | |
2401 | //------------------------------null_check_oop--------------------------------- |
2402 | // Null check oop. Set null-path control into Region in slot 3. |
2403 | // Make a cast-not-nullness use the other not-null control. Return cast. |
2404 | Node* GraphKit::null_check_oop(Node* value, Node* *null_control, |
2405 | bool never_see_null, |
2406 | bool safe_for_replace, |
2407 | bool speculative) { |
2408 | // Initial NULL check taken path |
2409 | (*null_control) = top(); |
2410 | Node* cast = null_check_common(value, T_OBJECT, false, null_control, speculative); |
2411 | |
2412 | // Generate uncommon_trap: |
2413 | if (never_see_null && (*null_control) != top()) { |
2414 | // If we see an unexpected null at a check-cast we record it and force a |
2415 | // recompile; the offending check-cast will be compiled to handle NULLs. |
2416 | // If we see more than one offending BCI, then all checkcasts in the |
2417 | // method will be compiled to handle NULLs. |
2418 | PreserveJVMState pjvms(this); |
2419 | set_control(*null_control); |
2420 | replace_in_map(value, null()); |
2421 | Deoptimization::DeoptReason reason = Deoptimization::reason_null_check(speculative); |
2422 | uncommon_trap(reason, |
2423 | Deoptimization::Action_make_not_entrant); |
2424 | (*null_control) = top(); // NULL path is dead |
2425 | } |
2426 | if ((*null_control) == top() && safe_for_replace) { |
2427 | replace_in_map(value, cast); |
2428 | } |
2429 | |
2430 | // Cast away null-ness on the result |
2431 | return cast; |
2432 | } |
2433 | |
2434 | //------------------------------opt_iff---------------------------------------- |
2435 | // Optimize the fast-check IfNode. Set the fast-path region slot 2. |
2436 | // Return slow-path control. |
2437 | Node* GraphKit::opt_iff(Node* region, Node* iff) { |
2438 | IfNode *opt_iff = _gvn.transform(iff)->as_If(); |
2439 | |
2440 | // Fast path taken; set region slot 2 |
2441 | Node *fast_taken = _gvn.transform( new IfFalseNode(opt_iff) ); |
2442 | region->init_req(2,fast_taken); // Capture fast-control |
2443 | |
2444 | // Fast path not-taken, i.e. slow path |
2445 | Node *slow_taken = _gvn.transform( new IfTrueNode(opt_iff) ); |
2446 | return slow_taken; |
2447 | } |
2448 | |
2449 | //-----------------------------make_runtime_call------------------------------- |
2450 | Node* GraphKit::make_runtime_call(int flags, |
2451 | const TypeFunc* call_type, address call_addr, |
2452 | const char* call_name, |
2453 | const TypePtr* adr_type, |
2454 | // The following parms are all optional. |
2455 | // The first NULL ends the list. |
2456 | Node* parm0, Node* parm1, |
2457 | Node* parm2, Node* parm3, |
2458 | Node* parm4, Node* parm5, |
2459 | Node* parm6, Node* parm7) { |
2460 | assert(call_addr != NULL, "must not call NULL targets" ); |
2461 | |
2462 | // Slow-path call |
2463 | bool is_leaf = !(flags & RC_NO_LEAF); |
2464 | bool has_io = (!is_leaf && !(flags & RC_NO_IO)); |
2465 | if (call_name == NULL) { |
2466 | assert(!is_leaf, "must supply name for leaf" ); |
2467 | call_name = OptoRuntime::stub_name(call_addr); |
2468 | } |
2469 | CallNode* call; |
2470 | if (!is_leaf) { |
2471 | call = new CallStaticJavaNode(call_type, call_addr, call_name, |
2472 | bci(), adr_type); |
2473 | } else if (flags & RC_NO_FP) { |
2474 | call = new CallLeafNoFPNode(call_type, call_addr, call_name, adr_type); |
2475 | } else { |
2476 | call = new CallLeafNode(call_type, call_addr, call_name, adr_type); |
2477 | } |
2478 | |
2479 | // The following is similar to set_edges_for_java_call, |
2480 | // except that the memory effects of the call are restricted to AliasIdxRaw. |
2481 | |
2482 | // Slow path call has no side-effects, uses few values |
2483 | bool wide_in = !(flags & RC_NARROW_MEM); |
2484 | bool wide_out = (C->get_alias_index(adr_type) == Compile::AliasIdxBot); |
2485 | |
2486 | Node* prev_mem = NULL; |
2487 | if (wide_in) { |
2488 | prev_mem = set_predefined_input_for_runtime_call(call); |
2489 | } else { |
2490 | assert(!wide_out, "narrow in => narrow out" ); |
2491 | Node* narrow_mem = memory(adr_type); |
2492 | prev_mem = set_predefined_input_for_runtime_call(call, narrow_mem); |
2493 | } |
2494 | |
2495 | // Hook each parm in order. Stop looking at the first NULL. |
2496 | if (parm0 != NULL) { call->init_req(TypeFunc::Parms+0, parm0); |
2497 | if (parm1 != NULL) { call->init_req(TypeFunc::Parms+1, parm1); |
2498 | if (parm2 != NULL) { call->init_req(TypeFunc::Parms+2, parm2); |
2499 | if (parm3 != NULL) { call->init_req(TypeFunc::Parms+3, parm3); |
2500 | if (parm4 != NULL) { call->init_req(TypeFunc::Parms+4, parm4); |
2501 | if (parm5 != NULL) { call->init_req(TypeFunc::Parms+5, parm5); |
2502 | if (parm6 != NULL) { call->init_req(TypeFunc::Parms+6, parm6); |
2503 | if (parm7 != NULL) { call->init_req(TypeFunc::Parms+7, parm7); |
2504 | /* close each nested if ===> */ } } } } } } } } |
2505 | assert(call->in(call->req()-1) != NULL, "must initialize all parms" ); |
2506 | |
2507 | if (!is_leaf) { |
2508 | // Non-leaves can block and take safepoints: |
2509 | add_safepoint_edges(call, ((flags & RC_MUST_THROW) != 0)); |
2510 | } |
2511 | // Non-leaves can throw exceptions: |
2512 | if (has_io) { |
2513 | call->set_req(TypeFunc::I_O, i_o()); |
2514 | } |
2515 | |
2516 | if (flags & RC_UNCOMMON) { |
2517 | // Set the count to a tiny probability. Cf. Estimate_Block_Frequency. |
2518 | // (An "if" probability corresponds roughly to an unconditional count. |
2519 | // Sort of.) |
2520 | call->set_cnt(PROB_UNLIKELY_MAG(4)); |
2521 | } |
2522 | |
2523 | Node* c = _gvn.transform(call); |
2524 | assert(c == call, "cannot disappear" ); |
2525 | |
2526 | if (wide_out) { |
2527 | // Slow path call has full side-effects. |
2528 | set_predefined_output_for_runtime_call(call); |
2529 | } else { |
2530 | // Slow path call has few side-effects, and/or sets few values. |
2531 | set_predefined_output_for_runtime_call(call, prev_mem, adr_type); |
2532 | } |
2533 | |
2534 | if (has_io) { |
2535 | set_i_o(_gvn.transform(new ProjNode(call, TypeFunc::I_O))); |
2536 | } |
2537 | return call; |
2538 | |
2539 | } |
2540 | |
2541 | //------------------------------merge_memory----------------------------------- |
2542 | // Merge memory from one path into the current memory state. |
2543 | void GraphKit::merge_memory(Node* new_mem, Node* region, int new_path) { |
2544 | for (MergeMemStream mms(merged_memory(), new_mem->as_MergeMem()); mms.next_non_empty2(); ) { |
2545 | Node* old_slice = mms.force_memory(); |
2546 | Node* new_slice = mms.memory2(); |
2547 | if (old_slice != new_slice) { |
2548 | PhiNode* phi; |
2549 | if (old_slice->is_Phi() && old_slice->as_Phi()->region() == region) { |
2550 | if (mms.is_empty()) { |
2551 | // clone base memory Phi's inputs for this memory slice |
2552 | assert(old_slice == mms.base_memory(), "sanity" ); |
2553 | phi = PhiNode::make(region, NULL, Type::MEMORY, mms.adr_type(C)); |
2554 | _gvn.set_type(phi, Type::MEMORY); |
2555 | for (uint i = 1; i < phi->req(); i++) { |
2556 | phi->init_req(i, old_slice->in(i)); |
2557 | } |
2558 | } else { |
2559 | phi = old_slice->as_Phi(); // Phi was generated already |
2560 | } |
2561 | } else { |
2562 | phi = PhiNode::make(region, old_slice, Type::MEMORY, mms.adr_type(C)); |
2563 | _gvn.set_type(phi, Type::MEMORY); |
2564 | } |
2565 | phi->set_req(new_path, new_slice); |
2566 | mms.set_memory(phi); |
2567 | } |
2568 | } |
2569 | } |
2570 | |
2571 | //------------------------------make_slow_call_ex------------------------------ |
2572 | // Make the exception handler hookups for the slow call |
2573 | void GraphKit::make_slow_call_ex(Node* call, ciInstanceKlass* ex_klass, bool separate_io_proj, bool deoptimize) { |
2574 | if (stopped()) return; |
2575 | |
2576 | // Make a catch node with just two handlers: fall-through and catch-all |
2577 | Node* i_o = _gvn.transform( new ProjNode(call, TypeFunc::I_O, separate_io_proj) ); |
2578 | Node* catc = _gvn.transform( new CatchNode(control(), i_o, 2) ); |
2579 | Node* norm = _gvn.transform( new CatchProjNode(catc, CatchProjNode::fall_through_index, CatchProjNode::no_handler_bci) ); |
2580 | Node* excp = _gvn.transform( new CatchProjNode(catc, CatchProjNode::catch_all_index, CatchProjNode::no_handler_bci) ); |
2581 | |
2582 | { PreserveJVMState pjvms(this); |
2583 | set_control(excp); |
2584 | set_i_o(i_o); |
2585 | |
2586 | if (excp != top()) { |
2587 | if (deoptimize) { |
2588 | // Deoptimize if an exception is caught. Don't construct exception state in this case. |
2589 | uncommon_trap(Deoptimization::Reason_unhandled, |
2590 | Deoptimization::Action_none); |
2591 | } else { |
2592 | // Create an exception state also. |
2593 | // Use an exact type if the caller has a specific exception. |
2594 | const Type* ex_type = TypeOopPtr::make_from_klass_unique(ex_klass)->cast_to_ptr_type(TypePtr::NotNull); |
2595 | Node* ex_oop = new CreateExNode(ex_type, control(), i_o); |
2596 | add_exception_state(make_exception_state(_gvn.transform(ex_oop))); |
2597 | } |
2598 | } |
2599 | } |
2600 | |
2601 | // Get the no-exception control from the CatchNode. |
2602 | set_control(norm); |
2603 | } |
2604 | |
2605 | static IfNode* gen_subtype_check_compare(Node* ctrl, Node* in1, Node* in2, BoolTest::mask test, float p, PhaseGVN* gvn, BasicType bt) { |
2606 | Node* cmp = NULL; |
2607 | switch(bt) { |
2608 | case T_INT: cmp = new CmpINode(in1, in2); break; |
2609 | case T_ADDRESS: cmp = new CmpPNode(in1, in2); break; |
2610 | default: fatal("unexpected comparison type %s" , type2name(bt)); |
2611 | } |
2612 | gvn->transform(cmp); |
2613 | Node* bol = gvn->transform(new BoolNode(cmp, test)); |
2614 | IfNode* iff = new IfNode(ctrl, bol, p, COUNT_UNKNOWN); |
2615 | gvn->transform(iff); |
2616 | if (!bol->is_Con()) gvn->record_for_igvn(iff); |
2617 | return iff; |
2618 | } |
2619 | |
2620 | |
2621 | //-------------------------------gen_subtype_check----------------------------- |
2622 | // Generate a subtyping check. Takes as input the subtype and supertype. |
2623 | // Returns 2 values: sets the default control() to the true path and returns |
2624 | // the false path. Only reads invariant memory; sets no (visible) memory. |
2625 | // The PartialSubtypeCheckNode sets the hidden 1-word cache in the encoding |
2626 | // but that's not exposed to the optimizer. This call also doesn't take in an |
2627 | // Object; if you wish to check an Object you need to load the Object's class |
2628 | // prior to coming here. |
2629 | Node* Phase::gen_subtype_check(Node* subklass, Node* superklass, Node** ctrl, MergeMemNode* mem, PhaseGVN* gvn) { |
2630 | Compile* C = gvn->C; |
2631 | |
2632 | if ((*ctrl)->is_top()) { |
2633 | return C->top(); |
2634 | } |
2635 | |
2636 | // Fast check for identical types, perhaps identical constants. |
2637 | // The types can even be identical non-constants, in cases |
2638 | // involving Array.newInstance, Object.clone, etc. |
2639 | if (subklass == superklass) |
2640 | return C->top(); // false path is dead; no test needed. |
2641 | |
2642 | if (gvn->type(superklass)->singleton()) { |
2643 | ciKlass* superk = gvn->type(superklass)->is_klassptr()->klass(); |
2644 | ciKlass* subk = gvn->type(subklass)->is_klassptr()->klass(); |
2645 | |
2646 | // In the common case of an exact superklass, try to fold up the |
2647 | // test before generating code. You may ask, why not just generate |
2648 | // the code and then let it fold up? The answer is that the generated |
2649 | // code will necessarily include null checks, which do not always |
2650 | // completely fold away. If they are also needless, then they turn |
2651 | // into a performance loss. Example: |
2652 | // Foo[] fa = blah(); Foo x = fa[0]; fa[1] = x; |
2653 | // Here, the type of 'fa' is often exact, so the store check |
2654 | // of fa[1]=x will fold up, without testing the nullness of x. |
2655 | switch (C->static_subtype_check(superk, subk)) { |
2656 | case Compile::SSC_always_false: |
2657 | { |
2658 | Node* always_fail = *ctrl; |
2659 | *ctrl = gvn->C->top(); |
2660 | return always_fail; |
2661 | } |
2662 | case Compile::SSC_always_true: |
2663 | return C->top(); |
2664 | case Compile::SSC_easy_test: |
2665 | { |
2666 | // Just do a direct pointer compare and be done. |
2667 | IfNode* iff = gen_subtype_check_compare(*ctrl, subklass, superklass, BoolTest::eq, PROB_STATIC_FREQUENT, gvn, T_ADDRESS); |
2668 | *ctrl = gvn->transform(new IfTrueNode(iff)); |
2669 | return gvn->transform(new IfFalseNode(iff)); |
2670 | } |
2671 | case Compile::SSC_full_test: |
2672 | break; |
2673 | default: |
2674 | ShouldNotReachHere(); |
2675 | } |
2676 | } |
2677 | |
2678 | // %%% Possible further optimization: Even if the superklass is not exact, |
2679 | // if the subklass is the unique subtype of the superklass, the check |
2680 | // will always succeed. We could leave a dependency behind to ensure this. |
2681 | |
2682 | // First load the super-klass's check-offset |
2683 | Node *p1 = gvn->transform(new AddPNode(superklass, superklass, gvn->MakeConX(in_bytes(Klass::super_check_offset_offset())))); |
2684 | Node* m = mem->memory_at(C->get_alias_index(gvn->type(p1)->is_ptr())); |
2685 | Node *chk_off = gvn->transform(new LoadINode(NULL, m, p1, gvn->type(p1)->is_ptr(), TypeInt::INT, MemNode::unordered)); |
2686 | int cacheoff_con = in_bytes(Klass::secondary_super_cache_offset()); |
2687 | bool might_be_cache = (gvn->find_int_con(chk_off, cacheoff_con) == cacheoff_con); |
2688 | |
2689 | // Load from the sub-klass's super-class display list, or a 1-word cache of |
2690 | // the secondary superclass list, or a failing value with a sentinel offset |
2691 | // if the super-klass is an interface or exceptionally deep in the Java |
2692 | // hierarchy and we have to scan the secondary superclass list the hard way. |
2693 | // Worst-case type is a little odd: NULL is allowed as a result (usually |
2694 | // klass loads can never produce a NULL). |
2695 | Node *chk_off_X = chk_off; |
2696 | #ifdef _LP64 |
2697 | chk_off_X = gvn->transform(new ConvI2LNode(chk_off_X)); |
2698 | #endif |
2699 | Node *p2 = gvn->transform(new AddPNode(subklass,subklass,chk_off_X)); |
2700 | // For some types like interfaces the following loadKlass is from a 1-word |
2701 | // cache which is mutable so can't use immutable memory. Other |
2702 | // types load from the super-class display table which is immutable. |
2703 | m = mem->memory_at(C->get_alias_index(gvn->type(p2)->is_ptr())); |
2704 | Node *kmem = might_be_cache ? m : C->immutable_memory(); |
2705 | Node *nkls = gvn->transform(LoadKlassNode::make(*gvn, NULL, kmem, p2, gvn->type(p2)->is_ptr(), TypeKlassPtr::OBJECT_OR_NULL)); |
2706 | |
2707 | // Compile speed common case: ARE a subtype and we canNOT fail |
2708 | if( superklass == nkls ) |
2709 | return C->top(); // false path is dead; no test needed. |
2710 | |
2711 | // See if we get an immediate positive hit. Happens roughly 83% of the |
2712 | // time. Test to see if the value loaded just previously from the subklass |
2713 | // is exactly the superklass. |
2714 | IfNode *iff1 = gen_subtype_check_compare(*ctrl, superklass, nkls, BoolTest::eq, PROB_LIKELY(0.83f), gvn, T_ADDRESS); |
2715 | Node *iftrue1 = gvn->transform( new IfTrueNode (iff1)); |
2716 | *ctrl = gvn->transform(new IfFalseNode(iff1)); |
2717 | |
2718 | // Compile speed common case: Check for being deterministic right now. If |
2719 | // chk_off is a constant and not equal to cacheoff then we are NOT a |
2720 | // subklass. In this case we need exactly the 1 test above and we can |
2721 | // return those results immediately. |
2722 | if (!might_be_cache) { |
2723 | Node* not_subtype_ctrl = *ctrl; |
2724 | *ctrl = iftrue1; // We need exactly the 1 test above |
2725 | return not_subtype_ctrl; |
2726 | } |
2727 | |
2728 | // Gather the various success & failures here |
2729 | RegionNode *r_ok_subtype = new RegionNode(4); |
2730 | gvn->record_for_igvn(r_ok_subtype); |
2731 | RegionNode *r_not_subtype = new RegionNode(3); |
2732 | gvn->record_for_igvn(r_not_subtype); |
2733 | |
2734 | r_ok_subtype->init_req(1, iftrue1); |
2735 | |
2736 | // Check for immediate negative hit. Happens roughly 11% of the time (which |
2737 | // is roughly 63% of the remaining cases). Test to see if the loaded |
2738 | // check-offset points into the subklass display list or the 1-element |
2739 | // cache. If it points to the display (and NOT the cache) and the display |
2740 | // missed then it's not a subtype. |
2741 | Node *cacheoff = gvn->intcon(cacheoff_con); |
2742 | IfNode *iff2 = gen_subtype_check_compare(*ctrl, chk_off, cacheoff, BoolTest::ne, PROB_LIKELY(0.63f), gvn, T_INT); |
2743 | r_not_subtype->init_req(1, gvn->transform(new IfTrueNode (iff2))); |
2744 | *ctrl = gvn->transform(new IfFalseNode(iff2)); |
2745 | |
2746 | // Check for self. Very rare to get here, but it is taken 1/3 the time. |
2747 | // No performance impact (too rare) but allows sharing of secondary arrays |
2748 | // which has some footprint reduction. |
2749 | IfNode *iff3 = gen_subtype_check_compare(*ctrl, subklass, superklass, BoolTest::eq, PROB_LIKELY(0.36f), gvn, T_ADDRESS); |
2750 | r_ok_subtype->init_req(2, gvn->transform(new IfTrueNode(iff3))); |
2751 | *ctrl = gvn->transform(new IfFalseNode(iff3)); |
2752 | |
2753 | // -- Roads not taken here: -- |
2754 | // We could also have chosen to perform the self-check at the beginning |
2755 | // of this code sequence, as the assembler does. This would not pay off |
2756 | // the same way, since the optimizer, unlike the assembler, can perform |
2757 | // static type analysis to fold away many successful self-checks. |
2758 | // Non-foldable self checks work better here in second position, because |
2759 | // the initial primary superclass check subsumes a self-check for most |
2760 | // types. An exception would be a secondary type like array-of-interface, |
2761 | // which does not appear in its own primary supertype display. |
2762 | // Finally, we could have chosen to move the self-check into the |
2763 | // PartialSubtypeCheckNode, and from there out-of-line in a platform |
2764 | // dependent manner. But it is worthwhile to have the check here, |
2765 | // where it can be perhaps be optimized. The cost in code space is |
2766 | // small (register compare, branch). |
2767 | |
2768 | // Now do a linear scan of the secondary super-klass array. Again, no real |
2769 | // performance impact (too rare) but it's gotta be done. |
2770 | // Since the code is rarely used, there is no penalty for moving it |
2771 | // out of line, and it can only improve I-cache density. |
2772 | // The decision to inline or out-of-line this final check is platform |
2773 | // dependent, and is found in the AD file definition of PartialSubtypeCheck. |
2774 | Node* psc = gvn->transform( |
2775 | new PartialSubtypeCheckNode(*ctrl, subklass, superklass)); |
2776 | |
2777 | IfNode *iff4 = gen_subtype_check_compare(*ctrl, psc, gvn->zerocon(T_OBJECT), BoolTest::ne, PROB_FAIR, gvn, T_ADDRESS); |
2778 | r_not_subtype->init_req(2, gvn->transform(new IfTrueNode (iff4))); |
2779 | r_ok_subtype ->init_req(3, gvn->transform(new IfFalseNode(iff4))); |
2780 | |
2781 | // Return false path; set default control to true path. |
2782 | *ctrl = gvn->transform(r_ok_subtype); |
2783 | return gvn->transform(r_not_subtype); |
2784 | } |
2785 | |
2786 | // Profile-driven exact type check: |
2787 | Node* GraphKit::type_check_receiver(Node* receiver, ciKlass* klass, |
2788 | float prob, |
2789 | Node* *casted_receiver) { |
2790 | const TypeKlassPtr* tklass = TypeKlassPtr::make(klass); |
2791 | Node* recv_klass = load_object_klass(receiver); |
2792 | Node* want_klass = makecon(tklass); |
2793 | Node* cmp = _gvn.transform( new CmpPNode(recv_klass, want_klass) ); |
2794 | Node* bol = _gvn.transform( new BoolNode(cmp, BoolTest::eq) ); |
2795 | IfNode* iff = create_and_xform_if(control(), bol, prob, COUNT_UNKNOWN); |
2796 | set_control( _gvn.transform( new IfTrueNode (iff) )); |
2797 | Node* fail = _gvn.transform( new IfFalseNode(iff) ); |
2798 | |
2799 | const TypeOopPtr* recv_xtype = tklass->as_instance_type(); |
2800 | assert(recv_xtype->klass_is_exact(), "" ); |
2801 | |
2802 | // Subsume downstream occurrences of receiver with a cast to |
2803 | // recv_xtype, since now we know what the type will be. |
2804 | Node* cast = new CheckCastPPNode(control(), receiver, recv_xtype); |
2805 | (*casted_receiver) = _gvn.transform(cast); |
2806 | // (User must make the replace_in_map call.) |
2807 | |
2808 | return fail; |
2809 | } |
2810 | |
2811 | //------------------------------subtype_check_receiver------------------------- |
2812 | Node* GraphKit::subtype_check_receiver(Node* receiver, ciKlass* klass, |
2813 | Node** casted_receiver) { |
2814 | const TypeKlassPtr* tklass = TypeKlassPtr::make(klass); |
2815 | Node* recv_klass = load_object_klass(receiver); |
2816 | Node* want_klass = makecon(tklass); |
2817 | |
2818 | Node* slow_ctl = gen_subtype_check(recv_klass, want_klass); |
2819 | |
2820 | // Cast receiver after successful check |
2821 | const TypeOopPtr* recv_type = tklass->cast_to_exactness(false)->is_klassptr()->as_instance_type(); |
2822 | Node* cast = new CheckCastPPNode(control(), receiver, recv_type); |
2823 | (*casted_receiver) = _gvn.transform(cast); |
2824 | |
2825 | return slow_ctl; |
2826 | } |
2827 | |
2828 | //------------------------------seems_never_null------------------------------- |
2829 | // Use null_seen information if it is available from the profile. |
2830 | // If we see an unexpected null at a type check we record it and force a |
2831 | // recompile; the offending check will be recompiled to handle NULLs. |
2832 | // If we see several offending BCIs, then all checks in the |
2833 | // method will be recompiled. |
2834 | bool GraphKit::seems_never_null(Node* obj, ciProfileData* data, bool& speculating) { |
2835 | speculating = !_gvn.type(obj)->speculative_maybe_null(); |
2836 | Deoptimization::DeoptReason reason = Deoptimization::reason_null_check(speculating); |
2837 | if (UncommonNullCast // Cutout for this technique |
2838 | && obj != null() // And not the -Xcomp stupid case? |
2839 | && !too_many_traps(reason) |
2840 | ) { |
2841 | if (speculating) { |
2842 | return true; |
2843 | } |
2844 | if (data == NULL) |
2845 | // Edge case: no mature data. Be optimistic here. |
2846 | return true; |
2847 | // If the profile has not seen a null, assume it won't happen. |
2848 | assert(java_bc() == Bytecodes::_checkcast || |
2849 | java_bc() == Bytecodes::_instanceof || |
2850 | java_bc() == Bytecodes::_aastore, "MDO must collect null_seen bit here" ); |
2851 | return !data->as_BitData()->null_seen(); |
2852 | } |
2853 | speculating = false; |
2854 | return false; |
2855 | } |
2856 | |
2857 | void GraphKit::guard_klass_being_initialized(Node* klass) { |
2858 | int init_state_off = in_bytes(InstanceKlass::init_state_offset()); |
2859 | Node* adr = basic_plus_adr(top(), klass, init_state_off); |
2860 | Node* init_state = LoadNode::make(_gvn, NULL, immutable_memory(), adr, |
2861 | adr->bottom_type()->is_ptr(), TypeInt::BYTE, |
2862 | T_BYTE, MemNode::unordered); |
2863 | init_state = _gvn.transform(init_state); |
2864 | |
2865 | Node* being_initialized_state = makecon(TypeInt::make(InstanceKlass::being_initialized)); |
2866 | |
2867 | Node* chk = _gvn.transform(new CmpINode(being_initialized_state, init_state)); |
2868 | Node* tst = _gvn.transform(new BoolNode(chk, BoolTest::eq)); |
2869 | |
2870 | { BuildCutout unless(this, tst, PROB_MAX); |
2871 | uncommon_trap(Deoptimization::Reason_initialized, Deoptimization::Action_reinterpret); |
2872 | } |
2873 | } |
2874 | |
2875 | void GraphKit::guard_init_thread(Node* klass) { |
2876 | int init_thread_off = in_bytes(InstanceKlass::init_thread_offset()); |
2877 | Node* adr = basic_plus_adr(top(), klass, init_thread_off); |
2878 | |
2879 | Node* init_thread = LoadNode::make(_gvn, NULL, immutable_memory(), adr, |
2880 | adr->bottom_type()->is_ptr(), TypePtr::NOTNULL, |
2881 | T_ADDRESS, MemNode::unordered); |
2882 | init_thread = _gvn.transform(init_thread); |
2883 | |
2884 | Node* cur_thread = _gvn.transform(new ThreadLocalNode()); |
2885 | |
2886 | Node* chk = _gvn.transform(new CmpPNode(cur_thread, init_thread)); |
2887 | Node* tst = _gvn.transform(new BoolNode(chk, BoolTest::eq)); |
2888 | |
2889 | { BuildCutout unless(this, tst, PROB_MAX); |
2890 | uncommon_trap(Deoptimization::Reason_uninitialized, Deoptimization::Action_none); |
2891 | } |
2892 | } |
2893 | |
2894 | void GraphKit::clinit_barrier(ciInstanceKlass* ik, ciMethod* context) { |
2895 | if (ik->is_being_initialized()) { |
2896 | if (C->needs_clinit_barrier(ik, context)) { |
2897 | Node* klass = makecon(TypeKlassPtr::make(ik)); |
2898 | guard_klass_being_initialized(klass); |
2899 | guard_init_thread(klass); |
2900 | insert_mem_bar(Op_MemBarCPUOrder); |
2901 | } |
2902 | } else if (ik->is_initialized()) { |
2903 | return; // no barrier needed |
2904 | } else { |
2905 | uncommon_trap(Deoptimization::Reason_uninitialized, |
2906 | Deoptimization::Action_reinterpret, |
2907 | NULL); |
2908 | } |
2909 | } |
2910 | |
2911 | //------------------------maybe_cast_profiled_receiver------------------------- |
2912 | // If the profile has seen exactly one type, narrow to exactly that type. |
2913 | // Subsequent type checks will always fold up. |
2914 | Node* GraphKit::maybe_cast_profiled_receiver(Node* not_null_obj, |
2915 | ciKlass* require_klass, |
2916 | ciKlass* spec_klass, |
2917 | bool safe_for_replace) { |
2918 | if (!UseTypeProfile || !TypeProfileCasts) return NULL; |
2919 | |
2920 | Deoptimization::DeoptReason reason = Deoptimization::reason_class_check(spec_klass != NULL); |
2921 | |
2922 | // Make sure we haven't already deoptimized from this tactic. |
2923 | if (too_many_traps_or_recompiles(reason)) |
2924 | return NULL; |
2925 | |
2926 | // (No, this isn't a call, but it's enough like a virtual call |
2927 | // to use the same ciMethod accessor to get the profile info...) |
2928 | // If we have a speculative type use it instead of profiling (which |
2929 | // may not help us) |
2930 | ciKlass* exact_kls = spec_klass == NULL ? profile_has_unique_klass() : spec_klass; |
2931 | if (exact_kls != NULL) {// no cast failures here |
2932 | if (require_klass == NULL || |
2933 | C->static_subtype_check(require_klass, exact_kls) == Compile::SSC_always_true) { |
2934 | // If we narrow the type to match what the type profile sees or |
2935 | // the speculative type, we can then remove the rest of the |
2936 | // cast. |
2937 | // This is a win, even if the exact_kls is very specific, |
2938 | // because downstream operations, such as method calls, |
2939 | // will often benefit from the sharper type. |
2940 | Node* exact_obj = not_null_obj; // will get updated in place... |
2941 | Node* slow_ctl = type_check_receiver(exact_obj, exact_kls, 1.0, |
2942 | &exact_obj); |
2943 | { PreserveJVMState pjvms(this); |
2944 | set_control(slow_ctl); |
2945 | uncommon_trap_exact(reason, Deoptimization::Action_maybe_recompile); |
2946 | } |
2947 | if (safe_for_replace) { |
2948 | replace_in_map(not_null_obj, exact_obj); |
2949 | } |
2950 | return exact_obj; |
2951 | } |
2952 | // assert(ssc == Compile::SSC_always_true)... except maybe the profile lied to us. |
2953 | } |
2954 | |
2955 | return NULL; |
2956 | } |
2957 | |
2958 | /** |
2959 | * Cast obj to type and emit guard unless we had too many traps here |
2960 | * already |
2961 | * |
2962 | * @param obj node being casted |
2963 | * @param type type to cast the node to |
2964 | * @param not_null true if we know node cannot be null |
2965 | */ |
2966 | Node* GraphKit::maybe_cast_profiled_obj(Node* obj, |
2967 | ciKlass* type, |
2968 | bool not_null) { |
2969 | if (stopped()) { |
2970 | return obj; |
2971 | } |
2972 | |
2973 | // type == NULL if profiling tells us this object is always null |
2974 | if (type != NULL) { |
2975 | Deoptimization::DeoptReason class_reason = Deoptimization::Reason_speculate_class_check; |
2976 | Deoptimization::DeoptReason null_reason = Deoptimization::Reason_speculate_null_check; |
2977 | |
2978 | if (!too_many_traps_or_recompiles(null_reason) && |
2979 | !too_many_traps_or_recompiles(class_reason)) { |
2980 | Node* not_null_obj = NULL; |
2981 | // not_null is true if we know the object is not null and |
2982 | // there's no need for a null check |
2983 | if (!not_null) { |
2984 | Node* null_ctl = top(); |
2985 | not_null_obj = null_check_oop(obj, &null_ctl, true, true, true); |
2986 | assert(null_ctl->is_top(), "no null control here" ); |
2987 | } else { |
2988 | not_null_obj = obj; |
2989 | } |
2990 | |
2991 | Node* exact_obj = not_null_obj; |
2992 | ciKlass* exact_kls = type; |
2993 | Node* slow_ctl = type_check_receiver(exact_obj, exact_kls, 1.0, |
2994 | &exact_obj); |
2995 | { |
2996 | PreserveJVMState pjvms(this); |
2997 | set_control(slow_ctl); |
2998 | uncommon_trap_exact(class_reason, Deoptimization::Action_maybe_recompile); |
2999 | } |
3000 | replace_in_map(not_null_obj, exact_obj); |
3001 | obj = exact_obj; |
3002 | } |
3003 | } else { |
3004 | if (!too_many_traps_or_recompiles(Deoptimization::Reason_null_assert)) { |
3005 | Node* exact_obj = null_assert(obj); |
3006 | replace_in_map(obj, exact_obj); |
3007 | obj = exact_obj; |
3008 | } |
3009 | } |
3010 | return obj; |
3011 | } |
3012 | |
3013 | //-------------------------------gen_instanceof-------------------------------- |
3014 | // Generate an instance-of idiom. Used by both the instance-of bytecode |
3015 | // and the reflective instance-of call. |
3016 | Node* GraphKit::gen_instanceof(Node* obj, Node* superklass, bool safe_for_replace) { |
3017 | kill_dead_locals(); // Benefit all the uncommon traps |
3018 | assert( !stopped(), "dead parse path should be checked in callers" ); |
3019 | assert(!TypePtr::NULL_PTR->higher_equal(_gvn.type(superklass)->is_klassptr()), |
3020 | "must check for not-null not-dead klass in callers" ); |
3021 | |
3022 | // Make the merge point |
3023 | enum { _obj_path = 1, _fail_path, _null_path, PATH_LIMIT }; |
3024 | RegionNode* region = new RegionNode(PATH_LIMIT); |
3025 | Node* phi = new PhiNode(region, TypeInt::BOOL); |
3026 | C->set_has_split_ifs(true); // Has chance for split-if optimization |
3027 | |
3028 | ciProfileData* data = NULL; |
3029 | if (java_bc() == Bytecodes::_instanceof) { // Only for the bytecode |
3030 | data = method()->method_data()->bci_to_data(bci()); |
3031 | } |
3032 | bool speculative_not_null = false; |
3033 | bool never_see_null = (ProfileDynamicTypes // aggressive use of profile |
3034 | && seems_never_null(obj, data, speculative_not_null)); |
3035 | |
3036 | // Null check; get casted pointer; set region slot 3 |
3037 | Node* null_ctl = top(); |
3038 | Node* not_null_obj = null_check_oop(obj, &null_ctl, never_see_null, safe_for_replace, speculative_not_null); |
3039 | |
3040 | // If not_null_obj is dead, only null-path is taken |
3041 | if (stopped()) { // Doing instance-of on a NULL? |
3042 | set_control(null_ctl); |
3043 | return intcon(0); |
3044 | } |
3045 | region->init_req(_null_path, null_ctl); |
3046 | phi ->init_req(_null_path, intcon(0)); // Set null path value |
3047 | if (null_ctl == top()) { |
3048 | // Do this eagerly, so that pattern matches like is_diamond_phi |
3049 | // will work even during parsing. |
3050 | assert(_null_path == PATH_LIMIT-1, "delete last" ); |
3051 | region->del_req(_null_path); |
3052 | phi ->del_req(_null_path); |
3053 | } |
3054 | |
3055 | // Do we know the type check always succeed? |
3056 | bool known_statically = false; |
3057 | if (_gvn.type(superklass)->singleton()) { |
3058 | ciKlass* superk = _gvn.type(superklass)->is_klassptr()->klass(); |
3059 | ciKlass* subk = _gvn.type(obj)->is_oopptr()->klass(); |
3060 | if (subk != NULL && subk->is_loaded()) { |
3061 | int static_res = C->static_subtype_check(superk, subk); |
3062 | known_statically = (static_res == Compile::SSC_always_true || static_res == Compile::SSC_always_false); |
3063 | } |
3064 | } |
3065 | |
3066 | if (!known_statically) { |
3067 | const TypeOopPtr* obj_type = _gvn.type(obj)->is_oopptr(); |
3068 | // We may not have profiling here or it may not help us. If we |
3069 | // have a speculative type use it to perform an exact cast. |
3070 | ciKlass* spec_obj_type = obj_type->speculative_type(); |
3071 | if (spec_obj_type != NULL || (ProfileDynamicTypes && data != NULL)) { |
3072 | Node* cast_obj = maybe_cast_profiled_receiver(not_null_obj, NULL, spec_obj_type, safe_for_replace); |
3073 | if (stopped()) { // Profile disagrees with this path. |
3074 | set_control(null_ctl); // Null is the only remaining possibility. |
3075 | return intcon(0); |
3076 | } |
3077 | if (cast_obj != NULL) { |
3078 | not_null_obj = cast_obj; |
3079 | } |
3080 | } |
3081 | } |
3082 | |
3083 | // Load the object's klass |
3084 | Node* obj_klass = load_object_klass(not_null_obj); |
3085 | |
3086 | // Generate the subtype check |
3087 | Node* not_subtype_ctrl = gen_subtype_check(obj_klass, superklass); |
3088 | |
3089 | // Plug in the success path to the general merge in slot 1. |
3090 | region->init_req(_obj_path, control()); |
3091 | phi ->init_req(_obj_path, intcon(1)); |
3092 | |
3093 | // Plug in the failing path to the general merge in slot 2. |
3094 | region->init_req(_fail_path, not_subtype_ctrl); |
3095 | phi ->init_req(_fail_path, intcon(0)); |
3096 | |
3097 | // Return final merged results |
3098 | set_control( _gvn.transform(region) ); |
3099 | record_for_igvn(region); |
3100 | |
3101 | // If we know the type check always succeeds then we don't use the |
3102 | // profiling data at this bytecode. Don't lose it, feed it to the |
3103 | // type system as a speculative type. |
3104 | if (safe_for_replace) { |
3105 | Node* casted_obj = record_profiled_receiver_for_speculation(obj); |
3106 | replace_in_map(obj, casted_obj); |
3107 | } |
3108 | |
3109 | return _gvn.transform(phi); |
3110 | } |
3111 | |
3112 | //-------------------------------gen_checkcast--------------------------------- |
3113 | // Generate a checkcast idiom. Used by both the checkcast bytecode and the |
3114 | // array store bytecode. Stack must be as-if BEFORE doing the bytecode so the |
3115 | // uncommon-trap paths work. Adjust stack after this call. |
3116 | // If failure_control is supplied and not null, it is filled in with |
3117 | // the control edge for the cast failure. Otherwise, an appropriate |
3118 | // uncommon trap or exception is thrown. |
3119 | Node* GraphKit::gen_checkcast(Node *obj, Node* superklass, |
3120 | Node* *failure_control) { |
3121 | kill_dead_locals(); // Benefit all the uncommon traps |
3122 | const TypeKlassPtr *tk = _gvn.type(superklass)->is_klassptr(); |
3123 | const Type *toop = TypeOopPtr::make_from_klass(tk->klass()); |
3124 | |
3125 | // Fast cutout: Check the case that the cast is vacuously true. |
3126 | // This detects the common cases where the test will short-circuit |
3127 | // away completely. We do this before we perform the null check, |
3128 | // because if the test is going to turn into zero code, we don't |
3129 | // want a residual null check left around. (Causes a slowdown, |
3130 | // for example, in some objArray manipulations, such as a[i]=a[j].) |
3131 | if (tk->singleton()) { |
3132 | const TypeOopPtr* objtp = _gvn.type(obj)->isa_oopptr(); |
3133 | if (objtp != NULL && objtp->klass() != NULL) { |
3134 | switch (C->static_subtype_check(tk->klass(), objtp->klass())) { |
3135 | case Compile::SSC_always_true: |
3136 | // If we know the type check always succeed then we don't use |
3137 | // the profiling data at this bytecode. Don't lose it, feed it |
3138 | // to the type system as a speculative type. |
3139 | return record_profiled_receiver_for_speculation(obj); |
3140 | case Compile::SSC_always_false: |
3141 | // It needs a null check because a null will *pass* the cast check. |
3142 | // A non-null value will always produce an exception. |
3143 | return null_assert(obj); |
3144 | } |
3145 | } |
3146 | } |
3147 | |
3148 | ciProfileData* data = NULL; |
3149 | bool safe_for_replace = false; |
3150 | if (failure_control == NULL) { // use MDO in regular case only |
3151 | assert(java_bc() == Bytecodes::_aastore || |
3152 | java_bc() == Bytecodes::_checkcast, |
3153 | "interpreter profiles type checks only for these BCs" ); |
3154 | data = method()->method_data()->bci_to_data(bci()); |
3155 | safe_for_replace = true; |
3156 | } |
3157 | |
3158 | // Make the merge point |
3159 | enum { _obj_path = 1, _null_path, PATH_LIMIT }; |
3160 | RegionNode* region = new RegionNode(PATH_LIMIT); |
3161 | Node* phi = new PhiNode(region, toop); |
3162 | C->set_has_split_ifs(true); // Has chance for split-if optimization |
3163 | |
3164 | // Use null-cast information if it is available |
3165 | bool speculative_not_null = false; |
3166 | bool never_see_null = ((failure_control == NULL) // regular case only |
3167 | && seems_never_null(obj, data, speculative_not_null)); |
3168 | |
3169 | // Null check; get casted pointer; set region slot 3 |
3170 | Node* null_ctl = top(); |
3171 | Node* not_null_obj = null_check_oop(obj, &null_ctl, never_see_null, safe_for_replace, speculative_not_null); |
3172 | |
3173 | // If not_null_obj is dead, only null-path is taken |
3174 | if (stopped()) { // Doing instance-of on a NULL? |
3175 | set_control(null_ctl); |
3176 | return null(); |
3177 | } |
3178 | region->init_req(_null_path, null_ctl); |
3179 | phi ->init_req(_null_path, null()); // Set null path value |
3180 | if (null_ctl == top()) { |
3181 | // Do this eagerly, so that pattern matches like is_diamond_phi |
3182 | // will work even during parsing. |
3183 | assert(_null_path == PATH_LIMIT-1, "delete last" ); |
3184 | region->del_req(_null_path); |
3185 | phi ->del_req(_null_path); |
3186 | } |
3187 | |
3188 | Node* cast_obj = NULL; |
3189 | if (tk->klass_is_exact()) { |
3190 | // The following optimization tries to statically cast the speculative type of the object |
3191 | // (for example obtained during profiling) to the type of the superklass and then do a |
3192 | // dynamic check that the type of the object is what we expect. To work correctly |
3193 | // for checkcast and aastore the type of superklass should be exact. |
3194 | const TypeOopPtr* obj_type = _gvn.type(obj)->is_oopptr(); |
3195 | // We may not have profiling here or it may not help us. If we have |
3196 | // a speculative type use it to perform an exact cast. |
3197 | ciKlass* spec_obj_type = obj_type->speculative_type(); |
3198 | if (spec_obj_type != NULL || data != NULL) { |
3199 | cast_obj = maybe_cast_profiled_receiver(not_null_obj, tk->klass(), spec_obj_type, safe_for_replace); |
3200 | if (cast_obj != NULL) { |
3201 | if (failure_control != NULL) // failure is now impossible |
3202 | (*failure_control) = top(); |
3203 | // adjust the type of the phi to the exact klass: |
3204 | phi->raise_bottom_type(_gvn.type(cast_obj)->meet_speculative(TypePtr::NULL_PTR)); |
3205 | } |
3206 | } |
3207 | } |
3208 | |
3209 | if (cast_obj == NULL) { |
3210 | // Load the object's klass |
3211 | Node* obj_klass = load_object_klass(not_null_obj); |
3212 | |
3213 | // Generate the subtype check |
3214 | Node* not_subtype_ctrl = gen_subtype_check( obj_klass, superklass ); |
3215 | |
3216 | // Plug in success path into the merge |
3217 | cast_obj = _gvn.transform(new CheckCastPPNode(control(), not_null_obj, toop)); |
3218 | // Failure path ends in uncommon trap (or may be dead - failure impossible) |
3219 | if (failure_control == NULL) { |
3220 | if (not_subtype_ctrl != top()) { // If failure is possible |
3221 | PreserveJVMState pjvms(this); |
3222 | set_control(not_subtype_ctrl); |
3223 | builtin_throw(Deoptimization::Reason_class_check, obj_klass); |
3224 | } |
3225 | } else { |
3226 | (*failure_control) = not_subtype_ctrl; |
3227 | } |
3228 | } |
3229 | |
3230 | region->init_req(_obj_path, control()); |
3231 | phi ->init_req(_obj_path, cast_obj); |
3232 | |
3233 | // A merge of NULL or Casted-NotNull obj |
3234 | Node* res = _gvn.transform(phi); |
3235 | |
3236 | // Note I do NOT always 'replace_in_map(obj,result)' here. |
3237 | // if( tk->klass()->can_be_primary_super() ) |
3238 | // This means that if I successfully store an Object into an array-of-String |
3239 | // I 'forget' that the Object is really now known to be a String. I have to |
3240 | // do this because we don't have true union types for interfaces - if I store |
3241 | // a Baz into an array-of-Interface and then tell the optimizer it's an |
3242 | // Interface, I forget that it's also a Baz and cannot do Baz-like field |
3243 | // references to it. FIX THIS WHEN UNION TYPES APPEAR! |
3244 | // replace_in_map( obj, res ); |
3245 | |
3246 | // Return final merged results |
3247 | set_control( _gvn.transform(region) ); |
3248 | record_for_igvn(region); |
3249 | |
3250 | return record_profiled_receiver_for_speculation(res); |
3251 | } |
3252 | |
3253 | //------------------------------next_monitor----------------------------------- |
3254 | // What number should be given to the next monitor? |
3255 | int GraphKit::next_monitor() { |
3256 | int current = jvms()->monitor_depth()* C->sync_stack_slots(); |
3257 | int next = current + C->sync_stack_slots(); |
3258 | // Keep the toplevel high water mark current: |
3259 | if (C->fixed_slots() < next) C->set_fixed_slots(next); |
3260 | return current; |
3261 | } |
3262 | |
3263 | //------------------------------insert_mem_bar--------------------------------- |
3264 | // Memory barrier to avoid floating things around |
3265 | // The membar serves as a pinch point between both control and all memory slices. |
3266 | Node* GraphKit::insert_mem_bar(int opcode, Node* precedent) { |
3267 | MemBarNode* mb = MemBarNode::make(C, opcode, Compile::AliasIdxBot, precedent); |
3268 | mb->init_req(TypeFunc::Control, control()); |
3269 | mb->init_req(TypeFunc::Memory, reset_memory()); |
3270 | Node* membar = _gvn.transform(mb); |
3271 | set_control(_gvn.transform(new ProjNode(membar, TypeFunc::Control))); |
3272 | set_all_memory_call(membar); |
3273 | return membar; |
3274 | } |
3275 | |
3276 | //-------------------------insert_mem_bar_volatile---------------------------- |
3277 | // Memory barrier to avoid floating things around |
3278 | // The membar serves as a pinch point between both control and memory(alias_idx). |
3279 | // If you want to make a pinch point on all memory slices, do not use this |
3280 | // function (even with AliasIdxBot); use insert_mem_bar() instead. |
3281 | Node* GraphKit::insert_mem_bar_volatile(int opcode, int alias_idx, Node* precedent) { |
3282 | // When Parse::do_put_xxx updates a volatile field, it appends a series |
3283 | // of MemBarVolatile nodes, one for *each* volatile field alias category. |
3284 | // The first membar is on the same memory slice as the field store opcode. |
3285 | // This forces the membar to follow the store. (Bug 6500685 broke this.) |
3286 | // All the other membars (for other volatile slices, including AliasIdxBot, |
3287 | // which stands for all unknown volatile slices) are control-dependent |
3288 | // on the first membar. This prevents later volatile loads or stores |
3289 | // from sliding up past the just-emitted store. |
3290 | |
3291 | MemBarNode* mb = MemBarNode::make(C, opcode, alias_idx, precedent); |
3292 | mb->set_req(TypeFunc::Control,control()); |
3293 | if (alias_idx == Compile::AliasIdxBot) { |
3294 | mb->set_req(TypeFunc::Memory, merged_memory()->base_memory()); |
3295 | } else { |
3296 | assert(!(opcode == Op_Initialize && alias_idx != Compile::AliasIdxRaw), "fix caller" ); |
3297 | mb->set_req(TypeFunc::Memory, memory(alias_idx)); |
3298 | } |
3299 | Node* membar = _gvn.transform(mb); |
3300 | set_control(_gvn.transform(new ProjNode(membar, TypeFunc::Control))); |
3301 | if (alias_idx == Compile::AliasIdxBot) { |
3302 | merged_memory()->set_base_memory(_gvn.transform(new ProjNode(membar, TypeFunc::Memory))); |
3303 | } else { |
3304 | set_memory(_gvn.transform(new ProjNode(membar, TypeFunc::Memory)),alias_idx); |
3305 | } |
3306 | return membar; |
3307 | } |
3308 | |
3309 | void GraphKit::insert_store_load_for_barrier() { |
3310 | Node* mem = reset_memory(); |
3311 | MemBarNode* mb = MemBarNode::make(C, Op_MemBarVolatile, Compile::AliasIdxRaw); |
3312 | mb->init_req(TypeFunc::Control, control()); |
3313 | mb->init_req(TypeFunc::Memory, mem); |
3314 | Node* membar = _gvn.transform(mb); |
3315 | set_control(_gvn.transform(new ProjNode(membar, TypeFunc::Control))); |
3316 | Node* newmem = _gvn.transform(new ProjNode(membar, TypeFunc::Memory)); |
3317 | set_all_memory(mem); |
3318 | set_memory(newmem, Compile::AliasIdxRaw); |
3319 | } |
3320 | |
3321 | //------------------------------shared_lock------------------------------------ |
3322 | // Emit locking code. |
3323 | FastLockNode* GraphKit::shared_lock(Node* obj) { |
3324 | // bci is either a monitorenter bc or InvocationEntryBci |
3325 | // %%% SynchronizationEntryBCI is redundant; use InvocationEntryBci in interfaces |
3326 | assert(SynchronizationEntryBCI == InvocationEntryBci, "" ); |
3327 | |
3328 | if( !GenerateSynchronizationCode ) |
3329 | return NULL; // Not locking things? |
3330 | if (stopped()) // Dead monitor? |
3331 | return NULL; |
3332 | |
3333 | assert(dead_locals_are_killed(), "should kill locals before sync. point" ); |
3334 | |
3335 | obj = access_resolve(obj, ACCESS_READ | ACCESS_WRITE); |
3336 | |
3337 | // Box the stack location |
3338 | Node* box = _gvn.transform(new BoxLockNode(next_monitor())); |
3339 | Node* mem = reset_memory(); |
3340 | |
3341 | FastLockNode * flock = _gvn.transform(new FastLockNode(0, obj, box) )->as_FastLock(); |
3342 | if (UseBiasedLocking && PrintPreciseBiasedLockingStatistics) { |
3343 | // Create the counters for this fast lock. |
3344 | flock->create_lock_counter(sync_jvms()); // sync_jvms used to get current bci |
3345 | } |
3346 | |
3347 | // Create the rtm counters for this fast lock if needed. |
3348 | flock->create_rtm_lock_counter(sync_jvms()); // sync_jvms used to get current bci |
3349 | |
3350 | // Add monitor to debug info for the slow path. If we block inside the |
3351 | // slow path and de-opt, we need the monitor hanging around |
3352 | map()->push_monitor( flock ); |
3353 | |
3354 | const TypeFunc *tf = LockNode::lock_type(); |
3355 | LockNode *lock = new LockNode(C, tf); |
3356 | |
3357 | lock->init_req( TypeFunc::Control, control() ); |
3358 | lock->init_req( TypeFunc::Memory , mem ); |
3359 | lock->init_req( TypeFunc::I_O , top() ) ; // does no i/o |
3360 | lock->init_req( TypeFunc::FramePtr, frameptr() ); |
3361 | lock->init_req( TypeFunc::ReturnAdr, top() ); |
3362 | |
3363 | lock->init_req(TypeFunc::Parms + 0, obj); |
3364 | lock->init_req(TypeFunc::Parms + 1, box); |
3365 | lock->init_req(TypeFunc::Parms + 2, flock); |
3366 | add_safepoint_edges(lock); |
3367 | |
3368 | lock = _gvn.transform( lock )->as_Lock(); |
3369 | |
3370 | // lock has no side-effects, sets few values |
3371 | set_predefined_output_for_runtime_call(lock, mem, TypeRawPtr::BOTTOM); |
3372 | |
3373 | insert_mem_bar(Op_MemBarAcquireLock); |
3374 | |
3375 | // Add this to the worklist so that the lock can be eliminated |
3376 | record_for_igvn(lock); |
3377 | |
3378 | #ifndef PRODUCT |
3379 | if (PrintLockStatistics) { |
3380 | // Update the counter for this lock. Don't bother using an atomic |
3381 | // operation since we don't require absolute accuracy. |
3382 | lock->create_lock_counter(map()->jvms()); |
3383 | increment_counter(lock->counter()->addr()); |
3384 | } |
3385 | #endif |
3386 | |
3387 | return flock; |
3388 | } |
3389 | |
3390 | |
3391 | //------------------------------shared_unlock---------------------------------- |
3392 | // Emit unlocking code. |
3393 | void GraphKit::shared_unlock(Node* box, Node* obj) { |
3394 | // bci is either a monitorenter bc or InvocationEntryBci |
3395 | // %%% SynchronizationEntryBCI is redundant; use InvocationEntryBci in interfaces |
3396 | assert(SynchronizationEntryBCI == InvocationEntryBci, "" ); |
3397 | |
3398 | if( !GenerateSynchronizationCode ) |
3399 | return; |
3400 | if (stopped()) { // Dead monitor? |
3401 | map()->pop_monitor(); // Kill monitor from debug info |
3402 | return; |
3403 | } |
3404 | |
3405 | // Memory barrier to avoid floating things down past the locked region |
3406 | insert_mem_bar(Op_MemBarReleaseLock); |
3407 | |
3408 | const TypeFunc *tf = OptoRuntime::complete_monitor_exit_Type(); |
3409 | UnlockNode *unlock = new UnlockNode(C, tf); |
3410 | #ifdef ASSERT |
3411 | unlock->set_dbg_jvms(sync_jvms()); |
3412 | #endif |
3413 | uint raw_idx = Compile::AliasIdxRaw; |
3414 | unlock->init_req( TypeFunc::Control, control() ); |
3415 | unlock->init_req( TypeFunc::Memory , memory(raw_idx) ); |
3416 | unlock->init_req( TypeFunc::I_O , top() ) ; // does no i/o |
3417 | unlock->init_req( TypeFunc::FramePtr, frameptr() ); |
3418 | unlock->init_req( TypeFunc::ReturnAdr, top() ); |
3419 | |
3420 | unlock->init_req(TypeFunc::Parms + 0, obj); |
3421 | unlock->init_req(TypeFunc::Parms + 1, box); |
3422 | unlock = _gvn.transform(unlock)->as_Unlock(); |
3423 | |
3424 | Node* mem = reset_memory(); |
3425 | |
3426 | // unlock has no side-effects, sets few values |
3427 | set_predefined_output_for_runtime_call(unlock, mem, TypeRawPtr::BOTTOM); |
3428 | |
3429 | // Kill monitor from debug info |
3430 | map()->pop_monitor( ); |
3431 | } |
3432 | |
3433 | //-------------------------------get_layout_helper----------------------------- |
3434 | // If the given klass is a constant or known to be an array, |
3435 | // fetch the constant layout helper value into constant_value |
3436 | // and return (Node*)NULL. Otherwise, load the non-constant |
3437 | // layout helper value, and return the node which represents it. |
3438 | // This two-faced routine is useful because allocation sites |
3439 | // almost always feature constant types. |
3440 | Node* GraphKit::get_layout_helper(Node* klass_node, jint& constant_value) { |
3441 | const TypeKlassPtr* inst_klass = _gvn.type(klass_node)->isa_klassptr(); |
3442 | if (!StressReflectiveCode && inst_klass != NULL) { |
3443 | ciKlass* klass = inst_klass->klass(); |
3444 | bool xklass = inst_klass->klass_is_exact(); |
3445 | if (xklass || klass->is_array_klass()) { |
3446 | jint lhelper = klass->layout_helper(); |
3447 | if (lhelper != Klass::_lh_neutral_value) { |
3448 | constant_value = lhelper; |
3449 | return (Node*) NULL; |
3450 | } |
3451 | } |
3452 | } |
3453 | constant_value = Klass::_lh_neutral_value; // put in a known value |
3454 | Node* lhp = basic_plus_adr(klass_node, klass_node, in_bytes(Klass::layout_helper_offset())); |
3455 | return make_load(NULL, lhp, TypeInt::INT, T_INT, MemNode::unordered); |
3456 | } |
3457 | |
3458 | // We just put in an allocate/initialize with a big raw-memory effect. |
3459 | // Hook selected additional alias categories on the initialization. |
3460 | static void hook_memory_on_init(GraphKit& kit, int alias_idx, |
3461 | MergeMemNode* init_in_merge, |
3462 | Node* init_out_raw) { |
3463 | DEBUG_ONLY(Node* init_in_raw = init_in_merge->base_memory()); |
3464 | assert(init_in_merge->memory_at(alias_idx) == init_in_raw, "" ); |
3465 | |
3466 | Node* prevmem = kit.memory(alias_idx); |
3467 | init_in_merge->set_memory_at(alias_idx, prevmem); |
3468 | kit.set_memory(init_out_raw, alias_idx); |
3469 | } |
3470 | |
3471 | //---------------------------set_output_for_allocation------------------------- |
3472 | Node* GraphKit::set_output_for_allocation(AllocateNode* alloc, |
3473 | const TypeOopPtr* oop_type, |
3474 | bool deoptimize_on_exception) { |
3475 | int rawidx = Compile::AliasIdxRaw; |
3476 | alloc->set_req( TypeFunc::FramePtr, frameptr() ); |
3477 | add_safepoint_edges(alloc); |
3478 | Node* allocx = _gvn.transform(alloc); |
3479 | set_control( _gvn.transform(new ProjNode(allocx, TypeFunc::Control) ) ); |
3480 | // create memory projection for i_o |
3481 | set_memory ( _gvn.transform( new ProjNode(allocx, TypeFunc::Memory, true) ), rawidx ); |
3482 | make_slow_call_ex(allocx, env()->Throwable_klass(), true, deoptimize_on_exception); |
3483 | |
3484 | // create a memory projection as for the normal control path |
3485 | Node* malloc = _gvn.transform(new ProjNode(allocx, TypeFunc::Memory)); |
3486 | set_memory(malloc, rawidx); |
3487 | |
3488 | // a normal slow-call doesn't change i_o, but an allocation does |
3489 | // we create a separate i_o projection for the normal control path |
3490 | set_i_o(_gvn.transform( new ProjNode(allocx, TypeFunc::I_O, false) ) ); |
3491 | Node* rawoop = _gvn.transform( new ProjNode(allocx, TypeFunc::Parms) ); |
3492 | |
3493 | // put in an initialization barrier |
3494 | InitializeNode* init = insert_mem_bar_volatile(Op_Initialize, rawidx, |
3495 | rawoop)->as_Initialize(); |
3496 | assert(alloc->initialization() == init, "2-way macro link must work" ); |
3497 | assert(init ->allocation() == alloc, "2-way macro link must work" ); |
3498 | { |
3499 | // Extract memory strands which may participate in the new object's |
3500 | // initialization, and source them from the new InitializeNode. |
3501 | // This will allow us to observe initializations when they occur, |
3502 | // and link them properly (as a group) to the InitializeNode. |
3503 | assert(init->in(InitializeNode::Memory) == malloc, "" ); |
3504 | MergeMemNode* minit_in = MergeMemNode::make(malloc); |
3505 | init->set_req(InitializeNode::Memory, minit_in); |
3506 | record_for_igvn(minit_in); // fold it up later, if possible |
3507 | Node* minit_out = memory(rawidx); |
3508 | assert(minit_out->is_Proj() && minit_out->in(0) == init, "" ); |
3509 | // Add an edge in the MergeMem for the header fields so an access |
3510 | // to one of those has correct memory state |
3511 | set_memory(minit_out, C->get_alias_index(oop_type->add_offset(oopDesc::mark_offset_in_bytes()))); |
3512 | set_memory(minit_out, C->get_alias_index(oop_type->add_offset(oopDesc::klass_offset_in_bytes()))); |
3513 | if (oop_type->isa_aryptr()) { |
3514 | const TypePtr* telemref = oop_type->add_offset(Type::OffsetBot); |
3515 | int elemidx = C->get_alias_index(telemref); |
3516 | hook_memory_on_init(*this, elemidx, minit_in, minit_out); |
3517 | } else if (oop_type->isa_instptr()) { |
3518 | ciInstanceKlass* ik = oop_type->klass()->as_instance_klass(); |
3519 | for (int i = 0, len = ik->nof_nonstatic_fields(); i < len; i++) { |
3520 | ciField* field = ik->nonstatic_field_at(i); |
3521 | if (field->offset() >= TrackedInitializationLimit * HeapWordSize) |
3522 | continue; // do not bother to track really large numbers of fields |
3523 | // Find (or create) the alias category for this field: |
3524 | int fieldidx = C->alias_type(field)->index(); |
3525 | hook_memory_on_init(*this, fieldidx, minit_in, minit_out); |
3526 | } |
3527 | } |
3528 | } |
3529 | |
3530 | // Cast raw oop to the real thing... |
3531 | Node* javaoop = new CheckCastPPNode(control(), rawoop, oop_type); |
3532 | javaoop = _gvn.transform(javaoop); |
3533 | C->set_recent_alloc(control(), javaoop); |
3534 | assert(just_allocated_object(control()) == javaoop, "just allocated" ); |
3535 | |
3536 | #ifdef ASSERT |
3537 | { // Verify that the AllocateNode::Ideal_allocation recognizers work: |
3538 | assert(AllocateNode::Ideal_allocation(rawoop, &_gvn) == alloc, |
3539 | "Ideal_allocation works" ); |
3540 | assert(AllocateNode::Ideal_allocation(javaoop, &_gvn) == alloc, |
3541 | "Ideal_allocation works" ); |
3542 | if (alloc->is_AllocateArray()) { |
3543 | assert(AllocateArrayNode::Ideal_array_allocation(rawoop, &_gvn) == alloc->as_AllocateArray(), |
3544 | "Ideal_allocation works" ); |
3545 | assert(AllocateArrayNode::Ideal_array_allocation(javaoop, &_gvn) == alloc->as_AllocateArray(), |
3546 | "Ideal_allocation works" ); |
3547 | } else { |
3548 | assert(alloc->in(AllocateNode::ALength)->is_top(), "no length, please" ); |
3549 | } |
3550 | } |
3551 | #endif //ASSERT |
3552 | |
3553 | return javaoop; |
3554 | } |
3555 | |
3556 | //---------------------------new_instance-------------------------------------- |
3557 | // This routine takes a klass_node which may be constant (for a static type) |
3558 | // or may be non-constant (for reflective code). It will work equally well |
3559 | // for either, and the graph will fold nicely if the optimizer later reduces |
3560 | // the type to a constant. |
3561 | // The optional arguments are for specialized use by intrinsics: |
3562 | // - If 'extra_slow_test' if not null is an extra condition for the slow-path. |
3563 | // - If 'return_size_val', report the the total object size to the caller. |
3564 | // - deoptimize_on_exception controls how Java exceptions are handled (rethrow vs deoptimize) |
3565 | Node* GraphKit::new_instance(Node* klass_node, |
3566 | Node* , |
3567 | Node* *return_size_val, |
3568 | bool deoptimize_on_exception) { |
3569 | // Compute size in doublewords |
3570 | // The size is always an integral number of doublewords, represented |
3571 | // as a positive bytewise size stored in the klass's layout_helper. |
3572 | // The layout_helper also encodes (in a low bit) the need for a slow path. |
3573 | jint layout_con = Klass::_lh_neutral_value; |
3574 | Node* layout_val = get_layout_helper(klass_node, layout_con); |
3575 | int layout_is_con = (layout_val == NULL); |
3576 | |
3577 | if (extra_slow_test == NULL) extra_slow_test = intcon(0); |
3578 | // Generate the initial go-slow test. It's either ALWAYS (return a |
3579 | // Node for 1) or NEVER (return a NULL) or perhaps (in the reflective |
3580 | // case) a computed value derived from the layout_helper. |
3581 | Node* initial_slow_test = NULL; |
3582 | if (layout_is_con) { |
3583 | assert(!StressReflectiveCode, "stress mode does not use these paths" ); |
3584 | bool must_go_slow = Klass::layout_helper_needs_slow_path(layout_con); |
3585 | initial_slow_test = must_go_slow ? intcon(1) : extra_slow_test; |
3586 | } else { // reflective case |
3587 | // This reflective path is used by Unsafe.allocateInstance. |
3588 | // (It may be stress-tested by specifying StressReflectiveCode.) |
3589 | // Basically, we want to get into the VM is there's an illegal argument. |
3590 | Node* bit = intcon(Klass::_lh_instance_slow_path_bit); |
3591 | initial_slow_test = _gvn.transform( new AndINode(layout_val, bit) ); |
3592 | if (extra_slow_test != intcon(0)) { |
3593 | initial_slow_test = _gvn.transform( new OrINode(initial_slow_test, extra_slow_test) ); |
3594 | } |
3595 | // (Macro-expander will further convert this to a Bool, if necessary.) |
3596 | } |
3597 | |
3598 | // Find the size in bytes. This is easy; it's the layout_helper. |
3599 | // The size value must be valid even if the slow path is taken. |
3600 | Node* size = NULL; |
3601 | if (layout_is_con) { |
3602 | size = MakeConX(Klass::layout_helper_size_in_bytes(layout_con)); |
3603 | } else { // reflective case |
3604 | // This reflective path is used by clone and Unsafe.allocateInstance. |
3605 | size = ConvI2X(layout_val); |
3606 | |
3607 | // Clear the low bits to extract layout_helper_size_in_bytes: |
3608 | assert((int)Klass::_lh_instance_slow_path_bit < BytesPerLong, "clear bit" ); |
3609 | Node* mask = MakeConX(~ (intptr_t)right_n_bits(LogBytesPerLong)); |
3610 | size = _gvn.transform( new AndXNode(size, mask) ); |
3611 | } |
3612 | if (return_size_val != NULL) { |
3613 | (*return_size_val) = size; |
3614 | } |
3615 | |
3616 | // This is a precise notnull oop of the klass. |
3617 | // (Actually, it need not be precise if this is a reflective allocation.) |
3618 | // It's what we cast the result to. |
3619 | const TypeKlassPtr* tklass = _gvn.type(klass_node)->isa_klassptr(); |
3620 | if (!tklass) tklass = TypeKlassPtr::OBJECT; |
3621 | const TypeOopPtr* oop_type = tklass->as_instance_type(); |
3622 | |
3623 | // Now generate allocation code |
3624 | |
3625 | // The entire memory state is needed for slow path of the allocation |
3626 | // since GC and deoptimization can happened. |
3627 | Node *mem = reset_memory(); |
3628 | set_all_memory(mem); // Create new memory state |
3629 | |
3630 | AllocateNode* alloc = new AllocateNode(C, AllocateNode::alloc_type(Type::TOP), |
3631 | control(), mem, i_o(), |
3632 | size, klass_node, |
3633 | initial_slow_test); |
3634 | |
3635 | return set_output_for_allocation(alloc, oop_type, deoptimize_on_exception); |
3636 | } |
3637 | |
3638 | //-------------------------------new_array------------------------------------- |
3639 | // helper for both newarray and anewarray |
3640 | // The 'length' parameter is (obviously) the length of the array. |
3641 | // See comments on new_instance for the meaning of the other arguments. |
3642 | Node* GraphKit::new_array(Node* klass_node, // array klass (maybe variable) |
3643 | Node* length, // number of array elements |
3644 | int nargs, // number of arguments to push back for uncommon trap |
3645 | Node* *return_size_val, |
3646 | bool deoptimize_on_exception) { |
3647 | jint layout_con = Klass::_lh_neutral_value; |
3648 | Node* layout_val = get_layout_helper(klass_node, layout_con); |
3649 | int layout_is_con = (layout_val == NULL); |
3650 | |
3651 | if (!layout_is_con && !StressReflectiveCode && |
3652 | !too_many_traps(Deoptimization::Reason_class_check)) { |
3653 | // This is a reflective array creation site. |
3654 | // Optimistically assume that it is a subtype of Object[], |
3655 | // so that we can fold up all the address arithmetic. |
3656 | layout_con = Klass::array_layout_helper(T_OBJECT); |
3657 | Node* cmp_lh = _gvn.transform( new CmpINode(layout_val, intcon(layout_con)) ); |
3658 | Node* bol_lh = _gvn.transform( new BoolNode(cmp_lh, BoolTest::eq) ); |
3659 | { BuildCutout unless(this, bol_lh, PROB_MAX); |
3660 | inc_sp(nargs); |
3661 | uncommon_trap(Deoptimization::Reason_class_check, |
3662 | Deoptimization::Action_maybe_recompile); |
3663 | } |
3664 | layout_val = NULL; |
3665 | layout_is_con = true; |
3666 | } |
3667 | |
3668 | // Generate the initial go-slow test. Make sure we do not overflow |
3669 | // if length is huge (near 2Gig) or negative! We do not need |
3670 | // exact double-words here, just a close approximation of needed |
3671 | // double-words. We can't add any offset or rounding bits, lest we |
3672 | // take a size -1 of bytes and make it positive. Use an unsigned |
3673 | // compare, so negative sizes look hugely positive. |
3674 | int fast_size_limit = FastAllocateSizeLimit; |
3675 | if (layout_is_con) { |
3676 | assert(!StressReflectiveCode, "stress mode does not use these paths" ); |
3677 | // Increase the size limit if we have exact knowledge of array type. |
3678 | int log2_esize = Klass::layout_helper_log2_element_size(layout_con); |
3679 | fast_size_limit <<= (LogBytesPerLong - log2_esize); |
3680 | } |
3681 | |
3682 | Node* initial_slow_cmp = _gvn.transform( new CmpUNode( length, intcon( fast_size_limit ) ) ); |
3683 | Node* initial_slow_test = _gvn.transform( new BoolNode( initial_slow_cmp, BoolTest::gt ) ); |
3684 | |
3685 | // --- Size Computation --- |
3686 | // array_size = round_to_heap(array_header + (length << elem_shift)); |
3687 | // where round_to_heap(x) == align_to(x, MinObjAlignmentInBytes) |
3688 | // and align_to(x, y) == ((x + y-1) & ~(y-1)) |
3689 | // The rounding mask is strength-reduced, if possible. |
3690 | int round_mask = MinObjAlignmentInBytes - 1; |
3691 | Node* = NULL; |
3692 | int = arrayOopDesc::base_offset_in_bytes(T_BYTE); |
3693 | // (T_BYTE has the weakest alignment and size restrictions...) |
3694 | if (layout_is_con) { |
3695 | int hsize = Klass::layout_helper_header_size(layout_con); |
3696 | int eshift = Klass::layout_helper_log2_element_size(layout_con); |
3697 | BasicType etype = Klass::layout_helper_element_type(layout_con); |
3698 | if ((round_mask & ~right_n_bits(eshift)) == 0) |
3699 | round_mask = 0; // strength-reduce it if it goes away completely |
3700 | assert((hsize & right_n_bits(eshift)) == 0, "hsize is pre-rounded" ); |
3701 | assert(header_size_min <= hsize, "generic minimum is smallest" ); |
3702 | header_size_min = hsize; |
3703 | header_size = intcon(hsize + round_mask); |
3704 | } else { |
3705 | Node* hss = intcon(Klass::_lh_header_size_shift); |
3706 | Node* hsm = intcon(Klass::_lh_header_size_mask); |
3707 | Node* hsize = _gvn.transform( new URShiftINode(layout_val, hss) ); |
3708 | hsize = _gvn.transform( new AndINode(hsize, hsm) ); |
3709 | Node* mask = intcon(round_mask); |
3710 | header_size = _gvn.transform( new AddINode(hsize, mask) ); |
3711 | } |
3712 | |
3713 | Node* elem_shift = NULL; |
3714 | if (layout_is_con) { |
3715 | int eshift = Klass::layout_helper_log2_element_size(layout_con); |
3716 | if (eshift != 0) |
3717 | elem_shift = intcon(eshift); |
3718 | } else { |
3719 | // There is no need to mask or shift this value. |
3720 | // The semantics of LShiftINode include an implicit mask to 0x1F. |
3721 | assert(Klass::_lh_log2_element_size_shift == 0, "use shift in place" ); |
3722 | elem_shift = layout_val; |
3723 | } |
3724 | |
3725 | // Transition to native address size for all offset calculations: |
3726 | Node* lengthx = ConvI2X(length); |
3727 | Node* = ConvI2X(header_size); |
3728 | #ifdef _LP64 |
3729 | { const TypeInt* tilen = _gvn.find_int_type(length); |
3730 | if (tilen != NULL && tilen->_lo < 0) { |
3731 | // Add a manual constraint to a positive range. Cf. array_element_address. |
3732 | jint size_max = fast_size_limit; |
3733 | if (size_max > tilen->_hi) size_max = tilen->_hi; |
3734 | const TypeInt* tlcon = TypeInt::make(0, size_max, Type::WidenMin); |
3735 | |
3736 | // Only do a narrow I2L conversion if the range check passed. |
3737 | IfNode* iff = new IfNode(control(), initial_slow_test, PROB_MIN, COUNT_UNKNOWN); |
3738 | _gvn.transform(iff); |
3739 | RegionNode* region = new RegionNode(3); |
3740 | _gvn.set_type(region, Type::CONTROL); |
3741 | lengthx = new PhiNode(region, TypeLong::LONG); |
3742 | _gvn.set_type(lengthx, TypeLong::LONG); |
3743 | |
3744 | // Range check passed. Use ConvI2L node with narrow type. |
3745 | Node* passed = IfFalse(iff); |
3746 | region->init_req(1, passed); |
3747 | // Make I2L conversion control dependent to prevent it from |
3748 | // floating above the range check during loop optimizations. |
3749 | lengthx->init_req(1, C->constrained_convI2L(&_gvn, length, tlcon, passed)); |
3750 | |
3751 | // Range check failed. Use ConvI2L with wide type because length may be invalid. |
3752 | region->init_req(2, IfTrue(iff)); |
3753 | lengthx->init_req(2, ConvI2X(length)); |
3754 | |
3755 | set_control(region); |
3756 | record_for_igvn(region); |
3757 | record_for_igvn(lengthx); |
3758 | } |
3759 | } |
3760 | #endif |
3761 | |
3762 | // Combine header size (plus rounding) and body size. Then round down. |
3763 | // This computation cannot overflow, because it is used only in two |
3764 | // places, one where the length is sharply limited, and the other |
3765 | // after a successful allocation. |
3766 | Node* abody = lengthx; |
3767 | if (elem_shift != NULL) |
3768 | abody = _gvn.transform( new LShiftXNode(lengthx, elem_shift) ); |
3769 | Node* size = _gvn.transform( new AddXNode(headerx, abody) ); |
3770 | if (round_mask != 0) { |
3771 | Node* mask = MakeConX(~round_mask); |
3772 | size = _gvn.transform( new AndXNode(size, mask) ); |
3773 | } |
3774 | // else if round_mask == 0, the size computation is self-rounding |
3775 | |
3776 | if (return_size_val != NULL) { |
3777 | // This is the size |
3778 | (*return_size_val) = size; |
3779 | } |
3780 | |
3781 | // Now generate allocation code |
3782 | |
3783 | // The entire memory state is needed for slow path of the allocation |
3784 | // since GC and deoptimization can happened. |
3785 | Node *mem = reset_memory(); |
3786 | set_all_memory(mem); // Create new memory state |
3787 | |
3788 | if (initial_slow_test->is_Bool()) { |
3789 | // Hide it behind a CMoveI, or else PhaseIdealLoop::split_up will get sick. |
3790 | initial_slow_test = initial_slow_test->as_Bool()->as_int_value(&_gvn); |
3791 | } |
3792 | |
3793 | // Create the AllocateArrayNode and its result projections |
3794 | AllocateArrayNode* alloc |
3795 | = new AllocateArrayNode(C, AllocateArrayNode::alloc_type(TypeInt::INT), |
3796 | control(), mem, i_o(), |
3797 | size, klass_node, |
3798 | initial_slow_test, |
3799 | length); |
3800 | |
3801 | // Cast to correct type. Note that the klass_node may be constant or not, |
3802 | // and in the latter case the actual array type will be inexact also. |
3803 | // (This happens via a non-constant argument to inline_native_newArray.) |
3804 | // In any case, the value of klass_node provides the desired array type. |
3805 | const TypeInt* length_type = _gvn.find_int_type(length); |
3806 | const TypeOopPtr* ary_type = _gvn.type(klass_node)->is_klassptr()->as_instance_type(); |
3807 | if (ary_type->isa_aryptr() && length_type != NULL) { |
3808 | // Try to get a better type than POS for the size |
3809 | ary_type = ary_type->is_aryptr()->cast_to_size(length_type); |
3810 | } |
3811 | |
3812 | Node* javaoop = set_output_for_allocation(alloc, ary_type, deoptimize_on_exception); |
3813 | |
3814 | // Cast length on remaining path to be as narrow as possible |
3815 | if (map()->find_edge(length) >= 0) { |
3816 | Node* ccast = alloc->make_ideal_length(ary_type, &_gvn); |
3817 | if (ccast != length) { |
3818 | _gvn.set_type_bottom(ccast); |
3819 | record_for_igvn(ccast); |
3820 | replace_in_map(length, ccast); |
3821 | } |
3822 | } |
3823 | |
3824 | return javaoop; |
3825 | } |
3826 | |
3827 | // The following "Ideal_foo" functions are placed here because they recognize |
3828 | // the graph shapes created by the functions immediately above. |
3829 | |
3830 | //---------------------------Ideal_allocation---------------------------------- |
3831 | // Given an oop pointer or raw pointer, see if it feeds from an AllocateNode. |
3832 | AllocateNode* AllocateNode::Ideal_allocation(Node* ptr, PhaseTransform* phase) { |
3833 | if (ptr == NULL) { // reduce dumb test in callers |
3834 | return NULL; |
3835 | } |
3836 | |
3837 | BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2(); |
3838 | ptr = bs->step_over_gc_barrier(ptr); |
3839 | |
3840 | if (ptr->is_CheckCastPP()) { // strip only one raw-to-oop cast |
3841 | ptr = ptr->in(1); |
3842 | if (ptr == NULL) return NULL; |
3843 | } |
3844 | // Return NULL for allocations with several casts: |
3845 | // j.l.reflect.Array.newInstance(jobject, jint) |
3846 | // Object.clone() |
3847 | // to keep more precise type from last cast. |
3848 | if (ptr->is_Proj()) { |
3849 | Node* allo = ptr->in(0); |
3850 | if (allo != NULL && allo->is_Allocate()) { |
3851 | return allo->as_Allocate(); |
3852 | } |
3853 | } |
3854 | // Report failure to match. |
3855 | return NULL; |
3856 | } |
3857 | |
3858 | // Fancy version which also strips off an offset (and reports it to caller). |
3859 | AllocateNode* AllocateNode::Ideal_allocation(Node* ptr, PhaseTransform* phase, |
3860 | intptr_t& offset) { |
3861 | Node* base = AddPNode::Ideal_base_and_offset(ptr, phase, offset); |
3862 | if (base == NULL) return NULL; |
3863 | return Ideal_allocation(base, phase); |
3864 | } |
3865 | |
3866 | // Trace Initialize <- Proj[Parm] <- Allocate |
3867 | AllocateNode* InitializeNode::allocation() { |
3868 | Node* rawoop = in(InitializeNode::RawAddress); |
3869 | if (rawoop->is_Proj()) { |
3870 | Node* alloc = rawoop->in(0); |
3871 | if (alloc->is_Allocate()) { |
3872 | return alloc->as_Allocate(); |
3873 | } |
3874 | } |
3875 | return NULL; |
3876 | } |
3877 | |
3878 | // Trace Allocate -> Proj[Parm] -> Initialize |
3879 | InitializeNode* AllocateNode::initialization() { |
3880 | ProjNode* rawoop = proj_out_or_null(AllocateNode::RawAddress); |
3881 | if (rawoop == NULL) return NULL; |
3882 | for (DUIterator_Fast imax, i = rawoop->fast_outs(imax); i < imax; i++) { |
3883 | Node* init = rawoop->fast_out(i); |
3884 | if (init->is_Initialize()) { |
3885 | assert(init->as_Initialize()->allocation() == this, "2-way link" ); |
3886 | return init->as_Initialize(); |
3887 | } |
3888 | } |
3889 | return NULL; |
3890 | } |
3891 | |
3892 | //----------------------------- loop predicates --------------------------- |
3893 | |
3894 | //------------------------------add_predicate_impl---------------------------- |
3895 | void GraphKit::add_predicate_impl(Deoptimization::DeoptReason reason, int nargs) { |
3896 | // Too many traps seen? |
3897 | if (too_many_traps(reason)) { |
3898 | #ifdef ASSERT |
3899 | if (TraceLoopPredicate) { |
3900 | int tc = C->trap_count(reason); |
3901 | tty->print("too many traps=%s tcount=%d in " , |
3902 | Deoptimization::trap_reason_name(reason), tc); |
3903 | method()->print(); // which method has too many predicate traps |
3904 | tty->cr(); |
3905 | } |
3906 | #endif |
3907 | // We cannot afford to take more traps here, |
3908 | // do not generate predicate. |
3909 | return; |
3910 | } |
3911 | |
3912 | Node *cont = _gvn.intcon(1); |
3913 | Node* opq = _gvn.transform(new Opaque1Node(C, cont)); |
3914 | Node *bol = _gvn.transform(new Conv2BNode(opq)); |
3915 | IfNode* iff = create_and_map_if(control(), bol, PROB_MAX, COUNT_UNKNOWN); |
3916 | Node* iffalse = _gvn.transform(new IfFalseNode(iff)); |
3917 | C->add_predicate_opaq(opq); |
3918 | { |
3919 | PreserveJVMState pjvms(this); |
3920 | set_control(iffalse); |
3921 | inc_sp(nargs); |
3922 | uncommon_trap(reason, Deoptimization::Action_maybe_recompile); |
3923 | } |
3924 | Node* iftrue = _gvn.transform(new IfTrueNode(iff)); |
3925 | set_control(iftrue); |
3926 | } |
3927 | |
3928 | //------------------------------add_predicate--------------------------------- |
3929 | void GraphKit::add_predicate(int nargs) { |
3930 | if (UseLoopPredicate) { |
3931 | add_predicate_impl(Deoptimization::Reason_predicate, nargs); |
3932 | } |
3933 | if (UseProfiledLoopPredicate) { |
3934 | add_predicate_impl(Deoptimization::Reason_profile_predicate, nargs); |
3935 | } |
3936 | // loop's limit check predicate should be near the loop. |
3937 | add_predicate_impl(Deoptimization::Reason_loop_limit_check, nargs); |
3938 | } |
3939 | |
3940 | void GraphKit::sync_kit(IdealKit& ideal) { |
3941 | set_all_memory(ideal.merged_memory()); |
3942 | set_i_o(ideal.i_o()); |
3943 | set_control(ideal.ctrl()); |
3944 | } |
3945 | |
3946 | void GraphKit::final_sync(IdealKit& ideal) { |
3947 | // Final sync IdealKit and graphKit. |
3948 | sync_kit(ideal); |
3949 | } |
3950 | |
3951 | Node* GraphKit::load_String_length(Node* str, bool set_ctrl) { |
3952 | Node* len = load_array_length(load_String_value(str, set_ctrl)); |
3953 | Node* coder = load_String_coder(str, set_ctrl); |
3954 | // Divide length by 2 if coder is UTF16 |
3955 | return _gvn.transform(new RShiftINode(len, coder)); |
3956 | } |
3957 | |
3958 | Node* GraphKit::load_String_value(Node* str, bool set_ctrl) { |
3959 | int value_offset = java_lang_String::value_offset_in_bytes(); |
3960 | const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(), |
3961 | false, NULL, 0); |
3962 | const TypePtr* value_field_type = string_type->add_offset(value_offset); |
3963 | const TypeAryPtr* value_type = TypeAryPtr::make(TypePtr::NotNull, |
3964 | TypeAry::make(TypeInt::BYTE, TypeInt::POS), |
3965 | ciTypeArrayKlass::make(T_BYTE), true, 0); |
3966 | Node* p = basic_plus_adr(str, str, value_offset); |
3967 | Node* load = access_load_at(str, p, value_field_type, value_type, T_OBJECT, |
3968 | IN_HEAP | (set_ctrl ? C2_CONTROL_DEPENDENT_LOAD : 0) | MO_UNORDERED); |
3969 | return load; |
3970 | } |
3971 | |
3972 | Node* GraphKit::load_String_coder(Node* str, bool set_ctrl) { |
3973 | if (!CompactStrings) { |
3974 | return intcon(java_lang_String::CODER_UTF16); |
3975 | } |
3976 | int coder_offset = java_lang_String::coder_offset_in_bytes(); |
3977 | const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(), |
3978 | false, NULL, 0); |
3979 | const TypePtr* coder_field_type = string_type->add_offset(coder_offset); |
3980 | |
3981 | Node* p = basic_plus_adr(str, str, coder_offset); |
3982 | Node* load = access_load_at(str, p, coder_field_type, TypeInt::BYTE, T_BYTE, |
3983 | IN_HEAP | (set_ctrl ? C2_CONTROL_DEPENDENT_LOAD : 0) | MO_UNORDERED); |
3984 | return load; |
3985 | } |
3986 | |
3987 | void GraphKit::store_String_value(Node* str, Node* value) { |
3988 | int value_offset = java_lang_String::value_offset_in_bytes(); |
3989 | const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(), |
3990 | false, NULL, 0); |
3991 | const TypePtr* value_field_type = string_type->add_offset(value_offset); |
3992 | |
3993 | access_store_at(str, basic_plus_adr(str, value_offset), value_field_type, |
3994 | value, TypeAryPtr::BYTES, T_OBJECT, IN_HEAP | MO_UNORDERED); |
3995 | } |
3996 | |
3997 | void GraphKit::store_String_coder(Node* str, Node* value) { |
3998 | int coder_offset = java_lang_String::coder_offset_in_bytes(); |
3999 | const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(), |
4000 | false, NULL, 0); |
4001 | const TypePtr* coder_field_type = string_type->add_offset(coder_offset); |
4002 | |
4003 | access_store_at(str, basic_plus_adr(str, coder_offset), coder_field_type, |
4004 | value, TypeInt::BYTE, T_BYTE, IN_HEAP | MO_UNORDERED); |
4005 | } |
4006 | |
4007 | // Capture src and dst memory state with a MergeMemNode |
4008 | Node* GraphKit::capture_memory(const TypePtr* src_type, const TypePtr* dst_type) { |
4009 | if (src_type == dst_type) { |
4010 | // Types are equal, we don't need a MergeMemNode |
4011 | return memory(src_type); |
4012 | } |
4013 | MergeMemNode* merge = MergeMemNode::make(map()->memory()); |
4014 | record_for_igvn(merge); // fold it up later, if possible |
4015 | int src_idx = C->get_alias_index(src_type); |
4016 | int dst_idx = C->get_alias_index(dst_type); |
4017 | merge->set_memory_at(src_idx, memory(src_idx)); |
4018 | merge->set_memory_at(dst_idx, memory(dst_idx)); |
4019 | return merge; |
4020 | } |
4021 | |
4022 | Node* GraphKit::compress_string(Node* src, const TypeAryPtr* src_type, Node* dst, Node* count) { |
4023 | assert(Matcher::match_rule_supported(Op_StrCompressedCopy), "Intrinsic not supported" ); |
4024 | assert(src_type == TypeAryPtr::BYTES || src_type == TypeAryPtr::CHARS, "invalid source type" ); |
4025 | // If input and output memory types differ, capture both states to preserve |
4026 | // the dependency between preceding and subsequent loads/stores. |
4027 | // For example, the following program: |
4028 | // StoreB |
4029 | // compress_string |
4030 | // LoadB |
4031 | // has this memory graph (use->def): |
4032 | // LoadB -> compress_string -> CharMem |
4033 | // ... -> StoreB -> ByteMem |
4034 | // The intrinsic hides the dependency between LoadB and StoreB, causing |
4035 | // the load to read from memory not containing the result of the StoreB. |
4036 | // The correct memory graph should look like this: |
4037 | // LoadB -> compress_string -> MergeMem(CharMem, StoreB(ByteMem)) |
4038 | Node* mem = capture_memory(src_type, TypeAryPtr::BYTES); |
4039 | StrCompressedCopyNode* str = new StrCompressedCopyNode(control(), mem, src, dst, count); |
4040 | Node* res_mem = _gvn.transform(new SCMemProjNode(str)); |
4041 | set_memory(res_mem, TypeAryPtr::BYTES); |
4042 | return str; |
4043 | } |
4044 | |
4045 | void GraphKit::inflate_string(Node* src, Node* dst, const TypeAryPtr* dst_type, Node* count) { |
4046 | assert(Matcher::match_rule_supported(Op_StrInflatedCopy), "Intrinsic not supported" ); |
4047 | assert(dst_type == TypeAryPtr::BYTES || dst_type == TypeAryPtr::CHARS, "invalid dest type" ); |
4048 | // Capture src and dst memory (see comment in 'compress_string'). |
4049 | Node* mem = capture_memory(TypeAryPtr::BYTES, dst_type); |
4050 | StrInflatedCopyNode* str = new StrInflatedCopyNode(control(), mem, src, dst, count); |
4051 | set_memory(_gvn.transform(str), dst_type); |
4052 | } |
4053 | |
4054 | void GraphKit::inflate_string_slow(Node* src, Node* dst, Node* start, Node* count) { |
4055 | /** |
4056 | * int i_char = start; |
4057 | * for (int i_byte = 0; i_byte < count; i_byte++) { |
4058 | * dst[i_char++] = (char)(src[i_byte] & 0xff); |
4059 | * } |
4060 | */ |
4061 | src = access_resolve(src, ACCESS_READ); |
4062 | dst = access_resolve(dst, ACCESS_WRITE); |
4063 | add_predicate(); |
4064 | RegionNode* head = new RegionNode(3); |
4065 | head->init_req(1, control()); |
4066 | gvn().set_type(head, Type::CONTROL); |
4067 | record_for_igvn(head); |
4068 | |
4069 | Node* i_byte = new PhiNode(head, TypeInt::INT); |
4070 | i_byte->init_req(1, intcon(0)); |
4071 | gvn().set_type(i_byte, TypeInt::INT); |
4072 | record_for_igvn(i_byte); |
4073 | |
4074 | Node* i_char = new PhiNode(head, TypeInt::INT); |
4075 | i_char->init_req(1, start); |
4076 | gvn().set_type(i_char, TypeInt::INT); |
4077 | record_for_igvn(i_char); |
4078 | |
4079 | Node* mem = PhiNode::make(head, memory(TypeAryPtr::BYTES), Type::MEMORY, TypeAryPtr::BYTES); |
4080 | gvn().set_type(mem, Type::MEMORY); |
4081 | record_for_igvn(mem); |
4082 | set_control(head); |
4083 | set_memory(mem, TypeAryPtr::BYTES); |
4084 | Node* ch = load_array_element(control(), src, i_byte, TypeAryPtr::BYTES); |
4085 | Node* st = store_to_memory(control(), array_element_address(dst, i_char, T_BYTE), |
4086 | AndI(ch, intcon(0xff)), T_CHAR, TypeAryPtr::BYTES, MemNode::unordered, |
4087 | false, false, true /* mismatched */); |
4088 | |
4089 | IfNode* iff = create_and_map_if(head, Bool(CmpI(i_byte, count), BoolTest::lt), PROB_FAIR, COUNT_UNKNOWN); |
4090 | head->init_req(2, IfTrue(iff)); |
4091 | mem->init_req(2, st); |
4092 | i_byte->init_req(2, AddI(i_byte, intcon(1))); |
4093 | i_char->init_req(2, AddI(i_char, intcon(2))); |
4094 | |
4095 | set_control(IfFalse(iff)); |
4096 | set_memory(st, TypeAryPtr::BYTES); |
4097 | } |
4098 | |
4099 | Node* GraphKit::make_constant_from_field(ciField* field, Node* obj) { |
4100 | if (!field->is_constant()) { |
4101 | return NULL; // Field not marked as constant. |
4102 | } |
4103 | ciInstance* holder = NULL; |
4104 | if (!field->is_static()) { |
4105 | ciObject* const_oop = obj->bottom_type()->is_oopptr()->const_oop(); |
4106 | if (const_oop != NULL && const_oop->is_instance()) { |
4107 | holder = const_oop->as_instance(); |
4108 | } |
4109 | } |
4110 | const Type* con_type = Type::make_constant_from_field(field, holder, field->layout_type(), |
4111 | /*is_unsigned_load=*/false); |
4112 | if (con_type != NULL) { |
4113 | return makecon(con_type); |
4114 | } |
4115 | return NULL; |
4116 | } |
4117 | |