Bug Summary

File:jdk/src/hotspot/share/opto/cfgnode.cpp
Warning:line 1870, column 11
Value stored to 'n' during its initialization is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name cfgnode.cpp -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -mthread-model posix -fno-delete-null-pointer-checks -mframe-pointer=all -relaxed-aliasing -fmath-errno -fno-rounding-math -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -dwarf-column-info -fno-split-dwarf-inlining -debugger-tuning=gdb -resource-dir /usr/lib/llvm-10/lib/clang/10.0.0 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/libjvm/objs/precompiled -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -D __STDC_CONSTANT_MACROS -D _GNU_SOURCE -D _REENTRANT -D LIBC=gnu -D LINUX -D VM_LITTLE_ENDIAN -D _LP64=1 -D ASSERT -D CHECK_UNHANDLED_OOPS -D TARGET_ARCH_x86 -D INCLUDE_SUFFIX_OS=_linux -D INCLUDE_SUFFIX_CPU=_x86 -D INCLUDE_SUFFIX_COMPILER=_gcc -D TARGET_COMPILER_gcc -D AMD64 -D HOTSPOT_LIB_ARCH="amd64" -D COMPILER1 -D COMPILER2 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc/adfiles -I /home/daniel/Projects/java/jdk/src/hotspot/share -I /home/daniel/Projects/java/jdk/src/hotspot/os/linux -I /home/daniel/Projects/java/jdk/src/hotspot/os/posix -I /home/daniel/Projects/java/jdk/src/hotspot/cpu/x86 -I /home/daniel/Projects/java/jdk/src/hotspot/os_cpu/linux_x86 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc -I /home/daniel/Projects/java/jdk/src/hotspot/share/precompiled -I /home/daniel/Projects/java/jdk/src/hotspot/share/include -I /home/daniel/Projects/java/jdk/src/hotspot/os/posix/include -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/support/modules_include/java.base -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/support/modules_include/java.base/linux -I /home/daniel/Projects/java/jdk/src/java.base/share/native/libjimage -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc/adfiles -I /home/daniel/Projects/java/jdk/src/hotspot/share -I /home/daniel/Projects/java/jdk/src/hotspot/os/linux -I /home/daniel/Projects/java/jdk/src/hotspot/os/posix -I /home/daniel/Projects/java/jdk/src/hotspot/cpu/x86 -I /home/daniel/Projects/java/jdk/src/hotspot/os_cpu/linux_x86 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc -D _FORTIFY_SOURCE=2 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/c++/7.5.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/x86_64-linux-gnu/c++/7.5.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/x86_64-linux-gnu/c++/7.5.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/c++/7.5.0/backward -internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-10/lib/clang/10.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O3 -Wno-format-zero-length -Wno-unused-parameter -Wno-unused -Wno-parentheses -Wno-comment -Wno-unknown-pragmas -Wno-address -Wno-delete-non-virtual-dtor -Wno-char-subscripts -Wno-array-bounds -Wno-int-in-bool-context -Wno-ignored-qualifiers -Wno-missing-field-initializers -Wno-implicit-fallthrough -Wno-empty-body -Wno-strict-overflow -Wno-sequence-point -Wno-maybe-uninitialized -Wno-misleading-indentation -Wno-cast-function-type -Wno-shift-negative-value -std=c++14 -fdeprecated-macro -fdebug-compilation-dir /home/daniel/Projects/java/jdk/make/hotspot -ferror-limit 19 -fmessage-length 0 -fvisibility hidden -stack-protector 1 -fno-rtti -fgnuc-version=4.2.1 -fobjc-runtime=gcc -fdiagnostics-show-option -vectorize-loops -vectorize-slp -analyzer-output=html -faddrsig -o /home/daniel/Projects/java/scan/2021-12-21-193737-8510-1 -x c++ /home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp
1/*
2 * Copyright (c) 1997, 2021, 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 "gc/shared/barrierSet.hpp"
27#include "gc/shared/c2/barrierSetC2.hpp"
28#include "memory/allocation.inline.hpp"
29#include "memory/resourceArea.hpp"
30#include "oops/objArrayKlass.hpp"
31#include "opto/addnode.hpp"
32#include "opto/castnode.hpp"
33#include "opto/cfgnode.hpp"
34#include "opto/connode.hpp"
35#include "opto/convertnode.hpp"
36#include "opto/loopnode.hpp"
37#include "opto/machnode.hpp"
38#include "opto/movenode.hpp"
39#include "opto/narrowptrnode.hpp"
40#include "opto/mulnode.hpp"
41#include "opto/phaseX.hpp"
42#include "opto/regmask.hpp"
43#include "opto/runtime.hpp"
44#include "opto/subnode.hpp"
45#include "opto/vectornode.hpp"
46#include "utilities/vmError.hpp"
47
48// Portions of code courtesy of Clifford Click
49
50// Optimization - Graph Style
51
52//=============================================================================
53//------------------------------Value------------------------------------------
54// Compute the type of the RegionNode.
55const Type* RegionNode::Value(PhaseGVN* phase) const {
56 for( uint i=1; i<req(); ++i ) { // For all paths in
57 Node *n = in(i); // Get Control source
58 if( !n ) continue; // Missing inputs are TOP
59 if( phase->type(n) == Type::CONTROL )
60 return Type::CONTROL;
61 }
62 return Type::TOP; // All paths dead? Then so are we
63}
64
65//------------------------------Identity---------------------------------------
66// Check for Region being Identity.
67Node* RegionNode::Identity(PhaseGVN* phase) {
68 // Cannot have Region be an identity, even if it has only 1 input.
69 // Phi users cannot have their Region input folded away for them,
70 // since they need to select the proper data input
71 return this;
72}
73
74//------------------------------merge_region-----------------------------------
75// If a Region flows into a Region, merge into one big happy merge. This is
76// hard to do if there is stuff that has to happen
77static Node *merge_region(RegionNode *region, PhaseGVN *phase) {
78 if( region->Opcode() != Op_Region ) // Do not do to LoopNodes
79 return NULL__null;
80 Node *progress = NULL__null; // Progress flag
81 PhaseIterGVN *igvn = phase->is_IterGVN();
82
83 uint rreq = region->req();
84 for( uint i = 1; i < rreq; i++ ) {
85 Node *r = region->in(i);
86 if( r && r->Opcode() == Op_Region && // Found a region?
87 r->in(0) == r && // Not already collapsed?
88 r != region && // Avoid stupid situations
89 r->outcnt() == 2 ) { // Self user and 'region' user only?
90 assert(!r->as_Region()->has_phi(), "no phi users")do { if (!(!r->as_Region()->has_phi())) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 90, "assert(" "!r->as_Region()->has_phi()" ") failed"
, "no phi users"); ::breakpoint(); } } while (0)
;
91 if( !progress ) { // No progress
92 if (region->has_phi()) {
93 return NULL__null; // Only flatten if no Phi users
94 // igvn->hash_delete( phi );
95 }
96 igvn->hash_delete( region );
97 progress = region; // Making progress
98 }
99 igvn->hash_delete( r );
100
101 // Append inputs to 'r' onto 'region'
102 for( uint j = 1; j < r->req(); j++ ) {
103 // Move an input from 'r' to 'region'
104 region->add_req(r->in(j));
105 r->set_req(j, phase->C->top());
106 // Update phis of 'region'
107 //for( uint k = 0; k < max; k++ ) {
108 // Node *phi = region->out(k);
109 // if( phi->is_Phi() ) {
110 // phi->add_req(phi->in(i));
111 // }
112 //}
113
114 rreq++; // One more input to Region
115 } // Found a region to merge into Region
116 igvn->_worklist.push(r);
117 // Clobber pointer to the now dead 'r'
118 region->set_req(i, phase->C->top());
119 }
120 }
121
122 return progress;
123}
124
125
126
127//--------------------------------has_phi--------------------------------------
128// Helper function: Return any PhiNode that uses this region or NULL
129PhiNode* RegionNode::has_phi() const {
130 for (DUIterator_Fast imax, i = fast_outs(imax); i < imax; i++) {
131 Node* phi = fast_out(i);
132 if (phi->is_Phi()) { // Check for Phi users
133 assert(phi->in(0) == (Node*)this, "phi uses region only via in(0)")do { if (!(phi->in(0) == (Node*)this)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 133, "assert(" "phi->in(0) == (Node*)this" ") failed", "phi uses region only via in(0)"
); ::breakpoint(); } } while (0)
;
134 return phi->as_Phi(); // this one is good enough
135 }
136 }
137
138 return NULL__null;
139}
140
141
142//-----------------------------has_unique_phi----------------------------------
143// Helper function: Return the only PhiNode that uses this region or NULL
144PhiNode* RegionNode::has_unique_phi() const {
145 // Check that only one use is a Phi
146 PhiNode* only_phi = NULL__null;
147 for (DUIterator_Fast imax, i = fast_outs(imax); i < imax; i++) {
148 Node* phi = fast_out(i);
149 if (phi->is_Phi()) { // Check for Phi users
150 assert(phi->in(0) == (Node*)this, "phi uses region only via in(0)")do { if (!(phi->in(0) == (Node*)this)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 150, "assert(" "phi->in(0) == (Node*)this" ") failed", "phi uses region only via in(0)"
); ::breakpoint(); } } while (0)
;
151 if (only_phi == NULL__null) {
152 only_phi = phi->as_Phi();
153 } else {
154 return NULL__null; // multiple phis
155 }
156 }
157 }
158
159 return only_phi;
160}
161
162
163//------------------------------check_phi_clipping-----------------------------
164// Helper function for RegionNode's identification of FP clipping
165// Check inputs to the Phi
166static bool check_phi_clipping( PhiNode *phi, ConNode * &min, uint &min_idx, ConNode * &max, uint &max_idx, Node * &val, uint &val_idx ) {
167 min = NULL__null;
168 max = NULL__null;
169 val = NULL__null;
170 min_idx = 0;
171 max_idx = 0;
172 val_idx = 0;
173 uint phi_max = phi->req();
174 if( phi_max == 4 ) {
175 for( uint j = 1; j < phi_max; ++j ) {
176 Node *n = phi->in(j);
177 int opcode = n->Opcode();
178 switch( opcode ) {
179 case Op_ConI:
180 {
181 if( min == NULL__null ) {
182 min = n->Opcode() == Op_ConI ? (ConNode*)n : NULL__null;
183 min_idx = j;
184 } else {
185 max = n->Opcode() == Op_ConI ? (ConNode*)n : NULL__null;
186 max_idx = j;
187 if( min->get_int() > max->get_int() ) {
188 // Swap min and max
189 ConNode *temp;
190 uint temp_idx;
191 temp = min; min = max; max = temp;
192 temp_idx = min_idx; min_idx = max_idx; max_idx = temp_idx;
193 }
194 }
195 }
196 break;
197 default:
198 {
199 val = n;
200 val_idx = j;
201 }
202 break;
203 }
204 }
205 }
206 return ( min && max && val && (min->get_int() <= 0) && (max->get_int() >=0) );
207}
208
209
210//------------------------------check_if_clipping------------------------------
211// Helper function for RegionNode's identification of FP clipping
212// Check that inputs to Region come from two IfNodes,
213//
214// If
215// False True
216// If |
217// False True |
218// | | |
219// RegionNode_inputs
220//
221static bool check_if_clipping( const RegionNode *region, IfNode * &bot_if, IfNode * &top_if ) {
222 top_if = NULL__null;
223 bot_if = NULL__null;
224
225 // Check control structure above RegionNode for (if ( if ) )
226 Node *in1 = region->in(1);
227 Node *in2 = region->in(2);
228 Node *in3 = region->in(3);
229 // Check that all inputs are projections
230 if( in1->is_Proj() && in2->is_Proj() && in3->is_Proj() ) {
231 Node *in10 = in1->in(0);
232 Node *in20 = in2->in(0);
233 Node *in30 = in3->in(0);
234 // Check that #1 and #2 are ifTrue and ifFalse from same If
235 if( in10 != NULL__null && in10->is_If() &&
236 in20 != NULL__null && in20->is_If() &&
237 in30 != NULL__null && in30->is_If() && in10 == in20 &&
238 (in1->Opcode() != in2->Opcode()) ) {
239 Node *in100 = in10->in(0);
240 Node *in1000 = (in100 != NULL__null && in100->is_Proj()) ? in100->in(0) : NULL__null;
241 // Check that control for in10 comes from other branch of IF from in3
242 if( in1000 != NULL__null && in1000->is_If() &&
243 in30 == in1000 && (in3->Opcode() != in100->Opcode()) ) {
244 // Control pattern checks
245 top_if = (IfNode*)in1000;
246 bot_if = (IfNode*)in10;
247 }
248 }
249 }
250
251 return (top_if != NULL__null);
252}
253
254
255//------------------------------check_convf2i_clipping-------------------------
256// Helper function for RegionNode's identification of FP clipping
257// Verify that the value input to the phi comes from "ConvF2I; LShift; RShift"
258static bool check_convf2i_clipping( PhiNode *phi, uint idx, ConvF2INode * &convf2i, Node *min, Node *max) {
259 convf2i = NULL__null;
260
261 // Check for the RShiftNode
262 Node *rshift = phi->in(idx);
263 assert( rshift, "Previous checks ensure phi input is present")do { if (!(rshift)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 263, "assert(" "rshift" ") failed", "Previous checks ensure phi input is present"
); ::breakpoint(); } } while (0)
;
264 if( rshift->Opcode() != Op_RShiftI ) { return false; }
265
266 // Check for the LShiftNode
267 Node *lshift = rshift->in(1);
268 assert( lshift, "Previous checks ensure phi input is present")do { if (!(lshift)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 268, "assert(" "lshift" ") failed", "Previous checks ensure phi input is present"
); ::breakpoint(); } } while (0)
;
269 if( lshift->Opcode() != Op_LShiftI ) { return false; }
270
271 // Check for the ConvF2INode
272 Node *conv = lshift->in(1);
273 if( conv->Opcode() != Op_ConvF2I ) { return false; }
274
275 // Check that shift amounts are only to get sign bits set after F2I
276 jint max_cutoff = max->get_int();
277 jint min_cutoff = min->get_int();
278 jint left_shift = lshift->in(2)->get_int();
279 jint right_shift = rshift->in(2)->get_int();
280 jint max_post_shift = nth_bit(BitsPerJavaInteger - left_shift - 1)(((BitsPerJavaInteger - left_shift - 1) >= BitsPerWord) ? 0
: (OneBit << (BitsPerJavaInteger - left_shift - 1)))
;
281 if( left_shift != right_shift ||
282 0 > left_shift || left_shift >= BitsPerJavaInteger ||
283 max_post_shift < max_cutoff ||
284 max_post_shift < -min_cutoff ) {
285 // Shifts are necessary but current transformation eliminates them
286 return false;
287 }
288
289 // OK to return the result of ConvF2I without shifting
290 convf2i = (ConvF2INode*)conv;
291 return true;
292}
293
294
295//------------------------------check_compare_clipping-------------------------
296// Helper function for RegionNode's identification of FP clipping
297static bool check_compare_clipping( bool less_than, IfNode *iff, ConNode *limit, Node * & input ) {
298 Node *i1 = iff->in(1);
299 if ( !i1->is_Bool() ) { return false; }
300 BoolNode *bool1 = i1->as_Bool();
301 if( less_than && bool1->_test._test != BoolTest::le ) { return false; }
302 else if( !less_than && bool1->_test._test != BoolTest::lt ) { return false; }
303 const Node *cmpF = bool1->in(1);
304 if( cmpF->Opcode() != Op_CmpF ) { return false; }
305 // Test that the float value being compared against
306 // is equivalent to the int value used as a limit
307 Node *nodef = cmpF->in(2);
308 if( nodef->Opcode() != Op_ConF ) { return false; }
309 jfloat conf = nodef->getf();
310 jint coni = limit->get_int();
311 if( ((int)conf) != coni ) { return false; }
312 input = cmpF->in(1);
313 return true;
314}
315
316//------------------------------is_unreachable_region--------------------------
317// Find if the Region node is reachable from the root.
318bool RegionNode::is_unreachable_region(const PhaseGVN* phase) {
319 Node* top = phase->C->top();
320 assert(req() == 2 || (req() == 3 && in(1) != NULL && in(2) == top), "sanity check arguments")do { if (!(req() == 2 || (req() == 3 && in(1) != __null
&& in(2) == top))) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 320, "assert(" "req() == 2 || (req() == 3 && in(1) != __null && in(2) == top)"
") failed", "sanity check arguments"); ::breakpoint(); } } while
(0)
;
321 if (_is_unreachable_region) {
322 // Return cached result from previous evaluation which should still be valid
323 assert(is_unreachable_from_root(phase), "walk the graph again and check if its indeed unreachable")do { if (!(is_unreachable_from_root(phase))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 323, "assert(" "is_unreachable_from_root(phase)" ") failed"
, "walk the graph again and check if its indeed unreachable")
; ::breakpoint(); } } while (0)
;
324 return true;
325 }
326
327 // First, cut the simple case of fallthrough region when NONE of
328 // region's phis references itself directly or through a data node.
329 if (is_possible_unsafe_loop(phase)) {
330 // If we have a possible unsafe loop, check if the region node is actually unreachable from root.
331 if (is_unreachable_from_root(phase)) {
332 _is_unreachable_region = true;
333 return true;
334 }
335 }
336 return false;
337}
338
339bool RegionNode::is_possible_unsafe_loop(const PhaseGVN* phase) const {
340 uint max = outcnt();
341 uint i;
342 for (i = 0; i < max; i++) {
343 Node* n = raw_out(i);
344 if (n != NULL__null && n->is_Phi()) {
345 PhiNode* phi = n->as_Phi();
346 assert(phi->in(0) == this, "sanity check phi")do { if (!(phi->in(0) == this)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 346, "assert(" "phi->in(0) == this" ") failed", "sanity check phi"
); ::breakpoint(); } } while (0)
;
347 if (phi->outcnt() == 0) {
348 continue; // Safe case - no loops
349 }
350 if (phi->outcnt() == 1) {
351 Node* u = phi->raw_out(0);
352 // Skip if only one use is an other Phi or Call or Uncommon trap.
353 // It is safe to consider this case as fallthrough.
354 if (u != NULL__null && (u->is_Phi() || u->is_CFG())) {
355 continue;
356 }
357 }
358 // Check when phi references itself directly or through an other node.
359 if (phi->as_Phi()->simple_data_loop_check(phi->in(1)) >= PhiNode::Unsafe) {
360 break; // Found possible unsafe data loop.
361 }
362 }
363 }
364 if (i >= max) {
365 return false; // An unsafe case was NOT found - don't need graph walk.
366 }
367 return true;
368}
369
370bool RegionNode::is_unreachable_from_root(const PhaseGVN* phase) const {
371 ResourceMark rm;
372 Node_List nstack;
373 VectorSet visited;
374
375 // Mark all control nodes reachable from root outputs
376 Node *n = (Node*)phase->C->root();
377 nstack.push(n);
378 visited.set(n->_idx);
379 while (nstack.size() != 0) {
380 n = nstack.pop();
381 uint max = n->outcnt();
382 for (uint i = 0; i < max; i++) {
383 Node* m = n->raw_out(i);
384 if (m != NULL__null && m->is_CFG()) {
385 if (m == this) {
386 return false; // We reached the Region node - it is not dead.
387 }
388 if (!visited.test_set(m->_idx))
389 nstack.push(m);
390 }
391 }
392 }
393 return true; // The Region node is unreachable - it is dead.
394}
395
396bool RegionNode::try_clean_mem_phi(PhaseGVN *phase) {
397 // Incremental inlining + PhaseStringOpts sometimes produce:
398 //
399 // cmpP with 1 top input
400 // |
401 // If
402 // / \
403 // IfFalse IfTrue /- Some Node
404 // \ / / /
405 // Region / /-MergeMem
406 // \---Phi
407 //
408 //
409 // It's expected by PhaseStringOpts that the Region goes away and is
410 // replaced by If's control input but because there's still a Phi,
411 // the Region stays in the graph. The top input from the cmpP is
412 // propagated forward and a subgraph that is useful goes away. The
413 // code below replaces the Phi with the MergeMem so that the Region
414 // is simplified.
415
416 PhiNode* phi = has_unique_phi();
417 if (phi && phi->type() == Type::MEMORY && req() == 3 && phi->is_diamond_phi(true)) {
418 MergeMemNode* m = NULL__null;
419 assert(phi->req() == 3, "same as region")do { if (!(phi->req() == 3)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 419, "assert(" "phi->req() == 3" ") failed", "same as region"
); ::breakpoint(); } } while (0)
;
420 for (uint i = 1; i < 3; ++i) {
421 Node *mem = phi->in(i);
422 if (mem && mem->is_MergeMem() && in(i)->outcnt() == 1) {
423 // Nothing is control-dependent on path #i except the region itself.
424 m = mem->as_MergeMem();
425 uint j = 3 - i;
426 Node* other = phi->in(j);
427 if (other && other == m->base_memory()) {
428 // m is a successor memory to other, and is not pinned inside the diamond, so push it out.
429 // This will allow the diamond to collapse completely.
430 phase->is_IterGVN()->replace_node(phi, m);
431 return true;
432 }
433 }
434 }
435 }
436 return false;
437}
438
439//------------------------------Ideal------------------------------------------
440// Return a node which is more "ideal" than the current node. Must preserve
441// the CFG, but we can still strip out dead paths.
442Node *RegionNode::Ideal(PhaseGVN *phase, bool can_reshape) {
443 if( !can_reshape && !in(0) ) return NULL__null; // Already degraded to a Copy
444 assert(!in(0) || !in(0)->is_Root(), "not a specially hidden merge")do { if (!(!in(0) || !in(0)->is_Root())) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 444, "assert(" "!in(0) || !in(0)->is_Root()" ") failed",
"not a specially hidden merge"); ::breakpoint(); } } while (
0)
;
445
446 // Check for RegionNode with no Phi users and both inputs come from either
447 // arm of the same IF. If found, then the control-flow split is useless.
448 bool has_phis = false;
449 if (can_reshape) { // Need DU info to check for Phi users
450 has_phis = (has_phi() != NULL__null); // Cache result
451 if (has_phis && try_clean_mem_phi(phase)) {
452 has_phis = false;
453 }
454
455 if (!has_phis) { // No Phi users? Nothing merging?
456 for (uint i = 1; i < req()-1; i++) {
457 Node *if1 = in(i);
458 if( !if1 ) continue;
459 Node *iff = if1->in(0);
460 if( !iff || !iff->is_If() ) continue;
461 for( uint j=i+1; j<req(); j++ ) {
462 if( in(j) && in(j)->in(0) == iff &&
463 if1->Opcode() != in(j)->Opcode() ) {
464 // Add the IF Projections to the worklist. They (and the IF itself)
465 // will be eliminated if dead.
466 phase->is_IterGVN()->add_users_to_worklist(iff);
467 set_req(i, iff->in(0));// Skip around the useless IF diamond
468 set_req(j, NULL__null);
469 return this; // Record progress
470 }
471 }
472 }
473 }
474 }
475
476 // Remove TOP or NULL input paths. If only 1 input path remains, this Region
477 // degrades to a copy.
478 bool add_to_worklist = false;
479 bool modified = false;
480 int cnt = 0; // Count of values merging
481 DEBUG_ONLY( int cnt_orig = req(); )int cnt_orig = req(); // Save original inputs count
482 int del_it = 0; // The last input path we delete
483 // For all inputs...
484 for( uint i=1; i<req(); ++i ){// For all paths in
485 Node *n = in(i); // Get the input
486 if( n != NULL__null ) {
487 // Remove useless control copy inputs
488 if( n->is_Region() && n->as_Region()->is_copy() ) {
489 set_req(i, n->nonnull_req());
490 modified = true;
491 i--;
492 continue;
493 }
494 if( n->is_Proj() ) { // Remove useless rethrows
495 Node *call = n->in(0);
496 if (call->is_Call() && call->as_Call()->entry_point() == OptoRuntime::rethrow_stub()) {
497 set_req(i, call->in(0));
498 modified = true;
499 i--;
500 continue;
501 }
502 }
503 if( phase->type(n) == Type::TOP ) {
504 set_req(i, NULL__null); // Ignore TOP inputs
505 modified = true;
506 i--;
507 continue;
508 }
509 cnt++; // One more value merging
510
511 } else if (can_reshape) { // Else found dead path with DU info
512 PhaseIterGVN *igvn = phase->is_IterGVN();
513 del_req(i); // Yank path from self
514 del_it = i;
515 uint max = outcnt();
516 DUIterator j;
517 bool progress = true;
518 while(progress) { // Need to establish property over all users
519 progress = false;
520 for (j = outs(); has_out(j); j++) {
521 Node *n = out(j);
522 if( n->req() != req() && n->is_Phi() ) {
523 assert( n->in(0) == this, "" )do { if (!(n->in(0) == this)) { (*g_assert_poison) = 'X';;
report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 523, "assert(" "n->in(0) == this" ") failed", ""); ::breakpoint
(); } } while (0)
;
524 igvn->hash_delete(n); // Yank from hash before hacking edges
525 n->set_req_X(i,NULL__null,igvn);// Correct DU info
526 n->del_req(i); // Yank path from Phis
527 if( max != outcnt() ) {
528 progress = true;
529 j = refresh_out_pos(j);
530 max = outcnt();
531 }
532 }
533 }
534 }
535 add_to_worklist = true;
536 i--;
537 }
538 }
539
540 if (can_reshape && cnt == 1) {
541 // Is it dead loop?
542 // If it is LoopNopde it had 2 (+1 itself) inputs and
543 // one of them was cut. The loop is dead if it was EntryContol.
544 // Loop node may have only one input because entry path
545 // is removed in PhaseIdealLoop::Dominators().
546 assert(!this->is_Loop() || cnt_orig <= 3, "Loop node should have 3 or less inputs")do { if (!(!this->is_Loop() || cnt_orig <= 3)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 546, "assert(" "!this->is_Loop() || cnt_orig <= 3" ") failed"
, "Loop node should have 3 or less inputs"); ::breakpoint(); }
} while (0)
;
547 if ((this->is_Loop() && (del_it == LoopNode::EntryControl ||
548 (del_it == 0 && is_unreachable_region(phase)))) ||
549 (!this->is_Loop() && has_phis && is_unreachable_region(phase))) {
550 // Yes, the region will be removed during the next step below.
551 // Cut the backedge input and remove phis since no data paths left.
552 // We don't cut outputs to other nodes here since we need to put them
553 // on the worklist.
554 PhaseIterGVN *igvn = phase->is_IterGVN();
555 if (in(1)->outcnt() == 1) {
556 igvn->_worklist.push(in(1));
557 }
558 del_req(1);
559 cnt = 0;
560 assert( req() == 1, "no more inputs expected" )do { if (!(req() == 1)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 560, "assert(" "req() == 1" ") failed", "no more inputs expected"
); ::breakpoint(); } } while (0)
;
561 uint max = outcnt();
562 bool progress = true;
563 Node *top = phase->C->top();
564 DUIterator j;
565 while(progress) {
566 progress = false;
567 for (j = outs(); has_out(j); j++) {
568 Node *n = out(j);
569 if( n->is_Phi() ) {
570 assert(n->in(0) == this, "")do { if (!(n->in(0) == this)) { (*g_assert_poison) = 'X';;
report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 570, "assert(" "n->in(0) == this" ") failed", ""); ::breakpoint
(); } } while (0)
;
571 assert( n->req() == 2 && n->in(1) != NULL, "Only one data input expected" )do { if (!(n->req() == 2 && n->in(1) != __null)
) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 571, "assert(" "n->req() == 2 && n->in(1) != __null"
") failed", "Only one data input expected"); ::breakpoint();
} } while (0)
;
572 // Break dead loop data path.
573 // Eagerly replace phis with top to avoid regionless phis.
574 igvn->replace_node(n, top);
575 if( max != outcnt() ) {
576 progress = true;
577 j = refresh_out_pos(j);
578 max = outcnt();
579 }
580 }
581 }
582 }
583 add_to_worklist = true;
584 }
585 }
586 if (add_to_worklist) {
587 phase->is_IterGVN()->add_users_to_worklist(this); // Revisit collapsed Phis
588 }
589
590 if( cnt <= 1 ) { // Only 1 path in?
591 set_req(0, NULL__null); // Null control input for region copy
592 if( cnt == 0 && !can_reshape) { // Parse phase - leave the node as it is.
593 // No inputs or all inputs are NULL.
594 return NULL__null;
595 } else if (can_reshape) { // Optimization phase - remove the node
596 PhaseIterGVN *igvn = phase->is_IterGVN();
597 // Strip mined (inner) loop is going away, remove outer loop.
598 if (is_CountedLoop() &&
599 as_Loop()->is_strip_mined()) {
600 Node* outer_sfpt = as_CountedLoop()->outer_safepoint();
601 Node* outer_out = as_CountedLoop()->outer_loop_exit();
602 if (outer_sfpt != NULL__null && outer_out != NULL__null) {
603 Node* in = outer_sfpt->in(0);
604 igvn->replace_node(outer_out, in);
605 LoopNode* outer = as_CountedLoop()->outer_loop();
606 igvn->replace_input_of(outer, LoopNode::LoopBackControl, igvn->C->top());
607 }
608 }
609 if (is_CountedLoop()) {
610 Node* opaq = as_CountedLoop()->is_canonical_loop_entry();
611 if (opaq != NULL__null) {
612 // This is not a loop anymore. No need to keep the Opaque1 node on the test that guards the loop as it won't be
613 // subject to further loop opts.
614 assert(opaq->Opcode() == Op_Opaque1, "")do { if (!(opaq->Opcode() == Op_Opaque1)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 614, "assert(" "opaq->Opcode() == Op_Opaque1" ") failed"
, ""); ::breakpoint(); } } while (0)
;
615 igvn->replace_node(opaq, opaq->in(1));
616 }
617 }
618 Node *parent_ctrl;
619 if( cnt == 0 ) {
620 assert( req() == 1, "no inputs expected" )do { if (!(req() == 1)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 620, "assert(" "req() == 1" ") failed", "no inputs expected"
); ::breakpoint(); } } while (0)
;
621 // During IGVN phase such region will be subsumed by TOP node
622 // so region's phis will have TOP as control node.
623 // Kill phis here to avoid it.
624 // Also set other user's input to top.
625 parent_ctrl = phase->C->top();
626 } else {
627 // The fallthrough case since we already checked dead loops above.
628 parent_ctrl = in(1);
629 assert(parent_ctrl != NULL, "Region is a copy of some non-null control")do { if (!(parent_ctrl != __null)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 629, "assert(" "parent_ctrl != __null" ") failed", "Region is a copy of some non-null control"
); ::breakpoint(); } } while (0)
;
630 assert(parent_ctrl != this, "Close dead loop")do { if (!(parent_ctrl != this)) { (*g_assert_poison) = 'X';;
report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 630, "assert(" "parent_ctrl != this" ") failed", "Close dead loop"
); ::breakpoint(); } } while (0)
;
631 }
632 if (!add_to_worklist)
633 igvn->add_users_to_worklist(this); // Check for further allowed opts
634 for (DUIterator_Last imin, i = last_outs(imin); i >= imin; --i) {
635 Node* n = last_out(i);
636 igvn->hash_delete(n); // Remove from worklist before modifying edges
637 if (n->outcnt() == 0) {
638 int uses_found = n->replace_edge(this, phase->C->top(), igvn);
639 if (uses_found > 1) { // (--i) done at the end of the loop.
640 i -= (uses_found - 1);
641 }
642 continue;
643 }
644 if( n->is_Phi() ) { // Collapse all Phis
645 // Eagerly replace phis to avoid regionless phis.
646 Node* in;
647 if( cnt == 0 ) {
648 assert( n->req() == 1, "No data inputs expected" )do { if (!(n->req() == 1)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 648, "assert(" "n->req() == 1" ") failed", "No data inputs expected"
); ::breakpoint(); } } while (0)
;
649 in = parent_ctrl; // replaced by top
650 } else {
651 assert( n->req() == 2 && n->in(1) != NULL, "Only one data input expected" )do { if (!(n->req() == 2 && n->in(1) != __null)
) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 651, "assert(" "n->req() == 2 && n->in(1) != __null"
") failed", "Only one data input expected"); ::breakpoint();
} } while (0)
;
652 in = n->in(1); // replaced by unique input
653 if( n->as_Phi()->is_unsafe_data_reference(in) )
654 in = phase->C->top(); // replaced by top
655 }
656 igvn->replace_node(n, in);
657 }
658 else if( n->is_Region() ) { // Update all incoming edges
659 assert(n != this, "Must be removed from DefUse edges")do { if (!(n != this)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 659, "assert(" "n != this" ") failed", "Must be removed from DefUse edges"
); ::breakpoint(); } } while (0)
;
660 int uses_found = n->replace_edge(this, parent_ctrl, igvn);
661 if (uses_found > 1) { // (--i) done at the end of the loop.
662 i -= (uses_found - 1);
663 }
664 }
665 else {
666 assert(n->in(0) == this, "Expect RegionNode to be control parent")do { if (!(n->in(0) == this)) { (*g_assert_poison) = 'X';;
report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 666, "assert(" "n->in(0) == this" ") failed", "Expect RegionNode to be control parent"
); ::breakpoint(); } } while (0)
;
667 n->set_req(0, parent_ctrl);
668 }
669#ifdef ASSERT1
670 for( uint k=0; k < n->req(); k++ ) {
671 assert(n->in(k) != this, "All uses of RegionNode should be gone")do { if (!(n->in(k) != this)) { (*g_assert_poison) = 'X';;
report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 671, "assert(" "n->in(k) != this" ") failed", "All uses of RegionNode should be gone"
); ::breakpoint(); } } while (0)
;
672 }
673#endif
674 }
675 // Remove the RegionNode itself from DefUse info
676 igvn->remove_dead_node(this);
677 return NULL__null;
678 }
679 return this; // Record progress
680 }
681
682
683 // If a Region flows into a Region, merge into one big happy merge.
684 if (can_reshape) {
685 Node *m = merge_region(this, phase);
686 if (m != NULL__null) return m;
687 }
688
689 // Check if this region is the root of a clipping idiom on floats
690 if( ConvertFloat2IntClipping && can_reshape && req() == 4 ) {
691 // Check that only one use is a Phi and that it simplifies to two constants +
692 PhiNode* phi = has_unique_phi();
693 if (phi != NULL__null) { // One Phi user
694 // Check inputs to the Phi
695 ConNode *min;
696 ConNode *max;
697 Node *val;
698 uint min_idx;
699 uint max_idx;
700 uint val_idx;
701 if( check_phi_clipping( phi, min, min_idx, max, max_idx, val, val_idx ) ) {
702 IfNode *top_if;
703 IfNode *bot_if;
704 if( check_if_clipping( this, bot_if, top_if ) ) {
705 // Control pattern checks, now verify compares
706 Node *top_in = NULL__null; // value being compared against
707 Node *bot_in = NULL__null;
708 if( check_compare_clipping( true, bot_if, min, bot_in ) &&
709 check_compare_clipping( false, top_if, max, top_in ) ) {
710 if( bot_in == top_in ) {
711 PhaseIterGVN *gvn = phase->is_IterGVN();
712 assert( gvn != NULL, "Only had DefUse info in IterGVN")do { if (!(gvn != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 712, "assert(" "gvn != __null" ") failed", "Only had DefUse info in IterGVN"
); ::breakpoint(); } } while (0)
;
713 // Only remaining check is that bot_in == top_in == (Phi's val + mods)
714
715 // Check for the ConvF2INode
716 ConvF2INode *convf2i;
717 if( check_convf2i_clipping( phi, val_idx, convf2i, min, max ) &&
718 convf2i->in(1) == bot_in ) {
719 // Matched pattern, including LShiftI; RShiftI, replace with integer compares
720 // max test
721 Node *cmp = gvn->register_new_node_with_optimizer(new CmpINode( convf2i, min ));
722 Node *boo = gvn->register_new_node_with_optimizer(new BoolNode( cmp, BoolTest::lt ));
723 IfNode *iff = (IfNode*)gvn->register_new_node_with_optimizer(new IfNode( top_if->in(0), boo, PROB_UNLIKELY_MAG(5)(1e-5f), top_if->_fcnt ));
724 Node *if_min= gvn->register_new_node_with_optimizer(new IfTrueNode (iff));
725 Node *ifF = gvn->register_new_node_with_optimizer(new IfFalseNode(iff));
726 // min test
727 cmp = gvn->register_new_node_with_optimizer(new CmpINode( convf2i, max ));
728 boo = gvn->register_new_node_with_optimizer(new BoolNode( cmp, BoolTest::gt ));
729 iff = (IfNode*)gvn->register_new_node_with_optimizer(new IfNode( ifF, boo, PROB_UNLIKELY_MAG(5)(1e-5f), bot_if->_fcnt ));
730 Node *if_max= gvn->register_new_node_with_optimizer(new IfTrueNode (iff));
731 ifF = gvn->register_new_node_with_optimizer(new IfFalseNode(iff));
732 // update input edges to region node
733 set_req_X( min_idx, if_min, gvn );
734 set_req_X( max_idx, if_max, gvn );
735 set_req_X( val_idx, ifF, gvn );
736 // remove unnecessary 'LShiftI; RShiftI' idiom
737 gvn->hash_delete(phi);
738 phi->set_req_X( val_idx, convf2i, gvn );
739 gvn->hash_find_insert(phi);
740 // Return transformed region node
741 return this;
742 }
743 }
744 }
745 }
746 }
747 }
748 }
749
750 if (can_reshape) {
751 modified |= optimize_trichotomy(phase->is_IterGVN());
752 }
753
754 return modified ? this : NULL__null;
755}
756
757//------------------------------optimize_trichotomy--------------------------
758// Optimize nested comparisons of the following kind:
759//
760// int compare(int a, int b) {
761// return (a < b) ? -1 : (a == b) ? 0 : 1;
762// }
763//
764// Shape 1:
765// if (compare(a, b) == 1) { ... } -> if (a > b) { ... }
766//
767// Shape 2:
768// if (compare(a, b) == 0) { ... } -> if (a == b) { ... }
769//
770// Above code leads to the following IR shapes where both Ifs compare the
771// same value and two out of three region inputs idx1 and idx2 map to
772// the same value and control flow.
773//
774// (1) If (2) If
775// / \ / \
776// Proj Proj Proj Proj
777// | \ | \
778// | If | If If
779// | / \ | / \ / \
780// | Proj Proj | Proj Proj ==> Proj Proj
781// | / / \ | / | /
782// Region / \ | / | /
783// \ / \ | / | /
784// Region Region Region
785//
786// The method returns true if 'this' is modified and false otherwise.
787bool RegionNode::optimize_trichotomy(PhaseIterGVN* igvn) {
788 int idx1 = 1, idx2 = 2;
789 Node* region = NULL__null;
790 if (req() == 3 && in(1) != NULL__null && in(2) != NULL__null) {
791 // Shape 1: Check if one of the inputs is a region that merges two control
792 // inputs and has no other users (especially no Phi users).
793 region = in(1)->isa_Region() ? in(1) : in(2)->isa_Region();
794 if (region == NULL__null || region->outcnt() != 2 || region->req() != 3) {
795 return false; // No suitable region input found
796 }
797 } else if (req() == 4) {
798 // Shape 2: Check if two control inputs map to the same value of the unique phi
799 // user and treat these as if they would come from another region (shape (1)).
800 PhiNode* phi = has_unique_phi();
801 if (phi == NULL__null) {
802 return false; // No unique phi user
803 }
804 if (phi->in(idx1) != phi->in(idx2)) {
805 idx2 = 3;
806 if (phi->in(idx1) != phi->in(idx2)) {
807 idx1 = 2;
808 if (phi->in(idx1) != phi->in(idx2)) {
809 return false; // No equal phi inputs found
810 }
811 }
812 }
813 assert(phi->in(idx1) == phi->in(idx2), "must be")do { if (!(phi->in(idx1) == phi->in(idx2))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 813, "assert(" "phi->in(idx1) == phi->in(idx2)" ") failed"
, "must be"); ::breakpoint(); } } while (0)
; // Region is merging same value
814 region = this;
815 }
816 if (region == NULL__null || region->in(idx1) == NULL__null || region->in(idx2) == NULL__null) {
817 return false; // Region does not merge two control inputs
818 }
819 // At this point we know that region->in(idx1) and region->(idx2) map to the same
820 // value and control flow. Now search for ifs that feed into these region inputs.
821 ProjNode* proj1 = region->in(idx1)->isa_Proj();
822 ProjNode* proj2 = region->in(idx2)->isa_Proj();
823 if (proj1 == NULL__null || proj1->outcnt() != 1 ||
824 proj2 == NULL__null || proj2->outcnt() != 1) {
825 return false; // No projection inputs with region as unique user found
826 }
827 assert(proj1 != proj2, "should be different projections")do { if (!(proj1 != proj2)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 827, "assert(" "proj1 != proj2" ") failed", "should be different projections"
); ::breakpoint(); } } while (0)
;
828 IfNode* iff1 = proj1->in(0)->isa_If();
829 IfNode* iff2 = proj2->in(0)->isa_If();
830 if (iff1 == NULL__null || iff1->outcnt() != 2 ||
831 iff2 == NULL__null || iff2->outcnt() != 2) {
832 return false; // No ifs found
833 }
834 if (iff1 == iff2) {
835 igvn->add_users_to_worklist(iff1); // Make sure dead if is eliminated
836 igvn->replace_input_of(region, idx1, iff1->in(0));
837 igvn->replace_input_of(region, idx2, igvn->C->top());
838 return (region == this); // Remove useless if (both projections map to the same control/value)
839 }
840 BoolNode* bol1 = iff1->in(1)->isa_Bool();
841 BoolNode* bol2 = iff2->in(1)->isa_Bool();
842 if (bol1 == NULL__null || bol2 == NULL__null) {
843 return false; // No bool inputs found
844 }
845 Node* cmp1 = bol1->in(1);
846 Node* cmp2 = bol2->in(1);
847 bool commute = false;
848 if (!cmp1->is_Cmp() || !cmp2->is_Cmp()) {
849 return false; // No comparison
850 } else if (cmp1->Opcode() == Op_CmpF || cmp1->Opcode() == Op_CmpD ||
851 cmp2->Opcode() == Op_CmpF || cmp2->Opcode() == Op_CmpD ||
852 cmp1->Opcode() == Op_CmpP || cmp1->Opcode() == Op_CmpN ||
853 cmp2->Opcode() == Op_CmpP || cmp2->Opcode() == Op_CmpN ||
854 cmp1->is_SubTypeCheck() || cmp2->is_SubTypeCheck()) {
855 // Floats and pointers don't exactly obey trichotomy. To be on the safe side, don't transform their tests.
856 // SubTypeCheck is not commutative
857 return false;
858 } else if (cmp1 != cmp2) {
859 if (cmp1->in(1) == cmp2->in(2) &&
860 cmp1->in(2) == cmp2->in(1)) {
861 commute = true; // Same but swapped inputs, commute the test
862 } else {
863 return false; // Ifs are not comparing the same values
864 }
865 }
866 proj1 = proj1->other_if_proj();
867 proj2 = proj2->other_if_proj();
868 if (!((proj1->unique_ctrl_out() == iff2 &&
869 proj2->unique_ctrl_out() == this) ||
870 (proj2->unique_ctrl_out() == iff1 &&
871 proj1->unique_ctrl_out() == this))) {
872 return false; // Ifs are not connected through other projs
873 }
874 // Found 'iff -> proj -> iff -> proj -> this' shape where all other projs are merged
875 // through 'region' and map to the same value. Merge the boolean tests and replace
876 // the ifs by a single comparison.
877 BoolTest test1 = (proj1->_con == 1) ? bol1->_test : bol1->_test.negate();
878 BoolTest test2 = (proj2->_con == 1) ? bol2->_test : bol2->_test.negate();
879 test1 = commute ? test1.commute() : test1;
880 // After possibly commuting test1, if we can merge test1 & test2, then proj2/iff2/bol2 are the nodes to refine.
881 BoolTest::mask res = test1.merge(test2);
882 if (res == BoolTest::illegal) {
883 return false; // Unable to merge tests
884 }
885 // Adjust iff1 to always pass (only iff2 will remain)
886 igvn->replace_input_of(iff1, 1, igvn->intcon(proj1->_con));
887 if (res == BoolTest::never) {
888 // Merged test is always false, adjust iff2 to always fail
889 igvn->replace_input_of(iff2, 1, igvn->intcon(1 - proj2->_con));
890 } else {
891 // Replace bool input of iff2 with merged test
892 BoolNode* new_bol = new BoolNode(bol2->in(1), res);
893 igvn->replace_input_of(iff2, 1, igvn->transform((proj2->_con == 1) ? new_bol : new_bol->negate(igvn)));
894 if (new_bol->outcnt() == 0) {
895 igvn->remove_dead_node(new_bol);
896 }
897 }
898 return false;
899}
900
901const RegMask &RegionNode::out_RegMask() const {
902 return RegMask::Empty;
903}
904
905// Find the one non-null required input. RegionNode only
906Node *Node::nonnull_req() const {
907 assert( is_Region(), "" )do { if (!(is_Region())) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 907, "assert(" "is_Region()" ") failed", ""); ::breakpoint(
); } } while (0)
;
908 for( uint i = 1; i < _cnt; i++ )
909 if( in(i) )
910 return in(i);
911 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 911); ::breakpoint(); } while (0)
;
912 return NULL__null;
913}
914
915
916//=============================================================================
917// note that these functions assume that the _adr_type field is flattened
918uint PhiNode::hash() const {
919 const Type* at = _adr_type;
920 return TypeNode::hash() + (at ? at->hash() : 0);
921}
922bool PhiNode::cmp( const Node &n ) const {
923 return TypeNode::cmp(n) && _adr_type == ((PhiNode&)n)._adr_type;
924}
925static inline
926const TypePtr* flatten_phi_adr_type(const TypePtr* at) {
927 if (at == NULL__null || at == TypePtr::BOTTOM) return at;
928 return Compile::current()->alias_type(at)->adr_type();
929}
930
931//----------------------------make---------------------------------------------
932// create a new phi with edges matching r and set (initially) to x
933PhiNode* PhiNode::make(Node* r, Node* x, const Type *t, const TypePtr* at) {
934 uint preds = r->req(); // Number of predecessor paths
935 assert(t != Type::MEMORY || at == flatten_phi_adr_type(at), "flatten at")do { if (!(t != Type::MEMORY || at == flatten_phi_adr_type(at
))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 935, "assert(" "t != Type::MEMORY || at == flatten_phi_adr_type(at)"
") failed", "flatten at"); ::breakpoint(); } } while (0)
;
936 PhiNode* p = new PhiNode(r, t, at);
937 for (uint j = 1; j < preds; j++) {
938 // Fill in all inputs, except those which the region does not yet have
939 if (r->in(j) != NULL__null)
940 p->init_req(j, x);
941 }
942 return p;
943}
944PhiNode* PhiNode::make(Node* r, Node* x) {
945 const Type* t = x->bottom_type();
946 const TypePtr* at = NULL__null;
947 if (t == Type::MEMORY) at = flatten_phi_adr_type(x->adr_type());
948 return make(r, x, t, at);
949}
950PhiNode* PhiNode::make_blank(Node* r, Node* x) {
951 const Type* t = x->bottom_type();
952 const TypePtr* at = NULL__null;
953 if (t == Type::MEMORY) at = flatten_phi_adr_type(x->adr_type());
954 return new PhiNode(r, t, at);
955}
956
957
958//------------------------slice_memory-----------------------------------------
959// create a new phi with narrowed memory type
960PhiNode* PhiNode::slice_memory(const TypePtr* adr_type) const {
961 PhiNode* mem = (PhiNode*) clone();
962 *(const TypePtr**)&mem->_adr_type = adr_type;
963 // convert self-loops, or else we get a bad graph
964 for (uint i = 1; i < req(); i++) {
965 if ((const Node*)in(i) == this) mem->set_req(i, mem);
966 }
967 mem->verify_adr_type();
968 return mem;
969}
970
971//------------------------split_out_instance-----------------------------------
972// Split out an instance type from a bottom phi.
973PhiNode* PhiNode::split_out_instance(const TypePtr* at, PhaseIterGVN *igvn) const {
974 const TypeOopPtr *t_oop = at->isa_oopptr();
975 assert(t_oop != NULL && t_oop->is_known_instance(), "expecting instance oopptr")do { if (!(t_oop != __null && t_oop->is_known_instance
())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 975, "assert(" "t_oop != __null && t_oop->is_known_instance()"
") failed", "expecting instance oopptr"); ::breakpoint(); } }
while (0)
;
976 const TypePtr *t = adr_type();
977 assert(type() == Type::MEMORY &&do { if (!(type() == Type::MEMORY && (t == TypePtr::BOTTOM
|| t == TypeRawPtr::BOTTOM || t->isa_oopptr() && !
t->is_oopptr()->is_known_instance() && t->is_oopptr
()->cast_to_exactness(true) ->is_oopptr()->cast_to_ptr_type
(t_oop->ptr()) ->is_oopptr()->cast_to_instance_id(t_oop
->instance_id()) == t_oop))) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 983, "assert(" "type() == Type::MEMORY && (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM || t->isa_oopptr() && !t->is_oopptr()->is_known_instance() && t->is_oopptr()->cast_to_exactness(true) ->is_oopptr()->cast_to_ptr_type(t_oop->ptr()) ->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop)"
") failed", "bottom or raw memory required"); ::breakpoint()
; } } while (0)
978 (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM ||do { if (!(type() == Type::MEMORY && (t == TypePtr::BOTTOM
|| t == TypeRawPtr::BOTTOM || t->isa_oopptr() && !
t->is_oopptr()->is_known_instance() && t->is_oopptr
()->cast_to_exactness(true) ->is_oopptr()->cast_to_ptr_type
(t_oop->ptr()) ->is_oopptr()->cast_to_instance_id(t_oop
->instance_id()) == t_oop))) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 983, "assert(" "type() == Type::MEMORY && (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM || t->isa_oopptr() && !t->is_oopptr()->is_known_instance() && t->is_oopptr()->cast_to_exactness(true) ->is_oopptr()->cast_to_ptr_type(t_oop->ptr()) ->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop)"
") failed", "bottom or raw memory required"); ::breakpoint()
; } } while (0)
979 t->isa_oopptr() && !t->is_oopptr()->is_known_instance() &&do { if (!(type() == Type::MEMORY && (t == TypePtr::BOTTOM
|| t == TypeRawPtr::BOTTOM || t->isa_oopptr() && !
t->is_oopptr()->is_known_instance() && t->is_oopptr
()->cast_to_exactness(true) ->is_oopptr()->cast_to_ptr_type
(t_oop->ptr()) ->is_oopptr()->cast_to_instance_id(t_oop
->instance_id()) == t_oop))) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 983, "assert(" "type() == Type::MEMORY && (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM || t->isa_oopptr() && !t->is_oopptr()->is_known_instance() && t->is_oopptr()->cast_to_exactness(true) ->is_oopptr()->cast_to_ptr_type(t_oop->ptr()) ->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop)"
") failed", "bottom or raw memory required"); ::breakpoint()
; } } while (0)
980 t->is_oopptr()->cast_to_exactness(true)do { if (!(type() == Type::MEMORY && (t == TypePtr::BOTTOM
|| t == TypeRawPtr::BOTTOM || t->isa_oopptr() && !
t->is_oopptr()->is_known_instance() && t->is_oopptr
()->cast_to_exactness(true) ->is_oopptr()->cast_to_ptr_type
(t_oop->ptr()) ->is_oopptr()->cast_to_instance_id(t_oop
->instance_id()) == t_oop))) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 983, "assert(" "type() == Type::MEMORY && (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM || t->isa_oopptr() && !t->is_oopptr()->is_known_instance() && t->is_oopptr()->cast_to_exactness(true) ->is_oopptr()->cast_to_ptr_type(t_oop->ptr()) ->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop)"
") failed", "bottom or raw memory required"); ::breakpoint()
; } } while (0)
981 ->is_oopptr()->cast_to_ptr_type(t_oop->ptr())do { if (!(type() == Type::MEMORY && (t == TypePtr::BOTTOM
|| t == TypeRawPtr::BOTTOM || t->isa_oopptr() && !
t->is_oopptr()->is_known_instance() && t->is_oopptr
()->cast_to_exactness(true) ->is_oopptr()->cast_to_ptr_type
(t_oop->ptr()) ->is_oopptr()->cast_to_instance_id(t_oop
->instance_id()) == t_oop))) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 983, "assert(" "type() == Type::MEMORY && (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM || t->isa_oopptr() && !t->is_oopptr()->is_known_instance() && t->is_oopptr()->cast_to_exactness(true) ->is_oopptr()->cast_to_ptr_type(t_oop->ptr()) ->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop)"
") failed", "bottom or raw memory required"); ::breakpoint()
; } } while (0)
982 ->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop),do { if (!(type() == Type::MEMORY && (t == TypePtr::BOTTOM
|| t == TypeRawPtr::BOTTOM || t->isa_oopptr() && !
t->is_oopptr()->is_known_instance() && t->is_oopptr
()->cast_to_exactness(true) ->is_oopptr()->cast_to_ptr_type
(t_oop->ptr()) ->is_oopptr()->cast_to_instance_id(t_oop
->instance_id()) == t_oop))) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 983, "assert(" "type() == Type::MEMORY && (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM || t->isa_oopptr() && !t->is_oopptr()->is_known_instance() && t->is_oopptr()->cast_to_exactness(true) ->is_oopptr()->cast_to_ptr_type(t_oop->ptr()) ->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop)"
") failed", "bottom or raw memory required"); ::breakpoint()
; } } while (0)
983 "bottom or raw memory required")do { if (!(type() == Type::MEMORY && (t == TypePtr::BOTTOM
|| t == TypeRawPtr::BOTTOM || t->isa_oopptr() && !
t->is_oopptr()->is_known_instance() && t->is_oopptr
()->cast_to_exactness(true) ->is_oopptr()->cast_to_ptr_type
(t_oop->ptr()) ->is_oopptr()->cast_to_instance_id(t_oop
->instance_id()) == t_oop))) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 983, "assert(" "type() == Type::MEMORY && (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM || t->isa_oopptr() && !t->is_oopptr()->is_known_instance() && t->is_oopptr()->cast_to_exactness(true) ->is_oopptr()->cast_to_ptr_type(t_oop->ptr()) ->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop)"
") failed", "bottom or raw memory required"); ::breakpoint()
; } } while (0)
;
984
985 // Check if an appropriate node already exists.
986 Node *region = in(0);
987 for (DUIterator_Fast kmax, k = region->fast_outs(kmax); k < kmax; k++) {
988 Node* use = region->fast_out(k);
989 if( use->is_Phi()) {
990 PhiNode *phi2 = use->as_Phi();
991 if (phi2->type() == Type::MEMORY && phi2->adr_type() == at) {
992 return phi2;
993 }
994 }
995 }
996 Compile *C = igvn->C;
997 Arena *a = Thread::current()->resource_area();
998 Node_Array node_map = new Node_Array(a);
999 Node_Stack stack(a, C->live_nodes() >> 4);
1000 PhiNode *nphi = slice_memory(at);
1001 igvn->register_new_node_with_optimizer( nphi );
1002 node_map.map(_idx, nphi);
1003 stack.push((Node *)this, 1);
1004 while(!stack.is_empty()) {
1005 PhiNode *ophi = stack.node()->as_Phi();
1006 uint i = stack.index();
1007 assert(i >= 1, "not control edge")do { if (!(i >= 1)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1007, "assert(" "i >= 1" ") failed", "not control edge")
; ::breakpoint(); } } while (0)
;
1008 stack.pop();
1009 nphi = node_map[ophi->_idx]->as_Phi();
1010 for (; i < ophi->req(); i++) {
1011 Node *in = ophi->in(i);
1012 if (in == NULL__null || igvn->type(in) == Type::TOP)
1013 continue;
1014 Node *opt = MemNode::optimize_simple_memory_chain(in, t_oop, NULL__null, igvn);
1015 PhiNode *optphi = opt->is_Phi() ? opt->as_Phi() : NULL__null;
1016 if (optphi != NULL__null && optphi->adr_type() == TypePtr::BOTTOM) {
1017 opt = node_map[optphi->_idx];
1018 if (opt == NULL__null) {
1019 stack.push(ophi, i);
1020 nphi = optphi->slice_memory(at);
1021 igvn->register_new_node_with_optimizer( nphi );
1022 node_map.map(optphi->_idx, nphi);
1023 ophi = optphi;
1024 i = 0; // will get incremented at top of loop
1025 continue;
1026 }
1027 }
1028 nphi->set_req(i, opt);
1029 }
1030 }
1031 return nphi;
1032}
1033
1034//------------------------verify_adr_type--------------------------------------
1035#ifdef ASSERT1
1036void PhiNode::verify_adr_type(VectorSet& visited, const TypePtr* at) const {
1037 if (visited.test_set(_idx)) return; //already visited
1038
1039 // recheck constructor invariants:
1040 verify_adr_type(false);
1041
1042 // recheck local phi/phi consistency:
1043 assert(_adr_type == at || _adr_type == TypePtr::BOTTOM,do { if (!(_adr_type == at || _adr_type == TypePtr::BOTTOM)) {
(*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1044, "assert(" "_adr_type == at || _adr_type == TypePtr::BOTTOM"
") failed", "adr_type must be consistent across phi nest"); ::
breakpoint(); } } while (0)
1044 "adr_type must be consistent across phi nest")do { if (!(_adr_type == at || _adr_type == TypePtr::BOTTOM)) {
(*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1044, "assert(" "_adr_type == at || _adr_type == TypePtr::BOTTOM"
") failed", "adr_type must be consistent across phi nest"); ::
breakpoint(); } } while (0)
;
1045
1046 // walk around
1047 for (uint i = 1; i < req(); i++) {
1048 Node* n = in(i);
1049 if (n == NULL__null) continue;
1050 const Node* np = in(i);
1051 if (np->is_Phi()) {
1052 np->as_Phi()->verify_adr_type(visited, at);
1053 } else if (n->bottom_type() == Type::TOP
1054 || (n->is_Mem() && n->in(MemNode::Address)->bottom_type() == Type::TOP)) {
1055 // ignore top inputs
1056 } else {
1057 const TypePtr* nat = flatten_phi_adr_type(n->adr_type());
1058 // recheck phi/non-phi consistency at leaves:
1059 assert((nat != NULL) == (at != NULL), "")do { if (!((nat != __null) == (at != __null))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1059, "assert(" "(nat != __null) == (at != __null)" ") failed"
, ""); ::breakpoint(); } } while (0)
;
1060 assert(nat == at || nat == TypePtr::BOTTOM,do { if (!(nat == at || nat == TypePtr::BOTTOM)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1061, "assert(" "nat == at || nat == TypePtr::BOTTOM" ") failed"
, "adr_type must be consistent at leaves of phi nest"); ::breakpoint
(); } } while (0)
1061 "adr_type must be consistent at leaves of phi nest")do { if (!(nat == at || nat == TypePtr::BOTTOM)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1061, "assert(" "nat == at || nat == TypePtr::BOTTOM" ") failed"
, "adr_type must be consistent at leaves of phi nest"); ::breakpoint
(); } } while (0)
;
1062 }
1063 }
1064}
1065
1066// Verify a whole nest of phis rooted at this one.
1067void PhiNode::verify_adr_type(bool recursive) const {
1068 if (VMError::is_error_reported()) return; // muzzle asserts when debugging an error
1069 if (Node::in_dump()) return; // muzzle asserts when printing
1070
1071 assert((_type == Type::MEMORY) == (_adr_type != NULL), "adr_type for memory phis only")do { if (!((_type == Type::MEMORY) == (_adr_type != __null)))
{ (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1071, "assert(" "(_type == Type::MEMORY) == (_adr_type != __null)"
") failed", "adr_type for memory phis only"); ::breakpoint()
; } } while (0)
;
1072
1073 if (!VerifyAliases) return; // verify thoroughly only if requested
1074
1075 assert(_adr_type == flatten_phi_adr_type(_adr_type),do { if (!(_adr_type == flatten_phi_adr_type(_adr_type))) { (
*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1076, "assert(" "_adr_type == flatten_phi_adr_type(_adr_type)"
") failed", "Phi::adr_type must be pre-normalized"); ::breakpoint
(); } } while (0)
1076 "Phi::adr_type must be pre-normalized")do { if (!(_adr_type == flatten_phi_adr_type(_adr_type))) { (
*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1076, "assert(" "_adr_type == flatten_phi_adr_type(_adr_type)"
") failed", "Phi::adr_type must be pre-normalized"); ::breakpoint
(); } } while (0)
;
1077
1078 if (recursive) {
1079 VectorSet visited;
1080 verify_adr_type(visited, _adr_type);
1081 }
1082}
1083#endif
1084
1085
1086//------------------------------Value------------------------------------------
1087// Compute the type of the PhiNode
1088const Type* PhiNode::Value(PhaseGVN* phase) const {
1089 Node *r = in(0); // RegionNode
1090 if( !r ) // Copy or dead
1091 return in(1) ? phase->type(in(1)) : Type::TOP;
1092
1093 // Note: During parsing, phis are often transformed before their regions.
1094 // This means we have to use type_or_null to defend against untyped regions.
1095 if( phase->type_or_null(r) == Type::TOP ) // Dead code?
1096 return Type::TOP;
1097
1098 // Check for trip-counted loop. If so, be smarter.
1099 BaseCountedLoopNode* l = r->is_BaseCountedLoop() ? r->as_BaseCountedLoop() : NULL__null;
1100 if (l && ((const Node*)l->phi() == this)) { // Trip counted loop!
1101 // protect against init_trip() or limit() returning NULL
1102 if (l->can_be_counted_loop(phase)) {
1103 const Node* init = l->init_trip();
1104 const Node* limit = l->limit();
1105 const Node* stride = l->stride();
1106 if (init != NULL__null && limit != NULL__null && stride != NULL__null) {
1107 const TypeInteger* lo = phase->type(init)->isa_integer(l->bt());
1108 const TypeInteger* hi = phase->type(limit)->isa_integer(l->bt());
1109 const TypeInteger* stride_t = phase->type(stride)->isa_integer(l->bt());
1110 if (lo != NULL__null && hi != NULL__null && stride_t != NULL__null) { // Dying loops might have TOP here
1111 assert(stride_t->hi_as_long() >= stride_t->lo_as_long(), "bad stride type")do { if (!(stride_t->hi_as_long() >= stride_t->lo_as_long
())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1111, "assert(" "stride_t->hi_as_long() >= stride_t->lo_as_long()"
") failed", "bad stride type"); ::breakpoint(); } } while (0
)
;
1112 BoolTest::mask bt = l->loopexit()->test_trip();
1113 // If the loop exit condition is "not equal", the condition
1114 // would not trigger if init > limit (if stride > 0) or if
1115 // init < limit if (stride > 0) so we can't deduce bounds
1116 // for the iv from the exit condition.
1117 if (bt != BoolTest::ne) {
1118 if (stride_t->hi_as_long() < 0) { // Down-counter loop
1119 swap(lo, hi);
1120 return TypeInteger::make(MIN2(lo->lo_as_long(), hi->lo_as_long()), hi->hi_as_long(), 3, l->bt())->filter_speculative(_type);
1121 } else if (stride_t->lo_as_long() >= 0) {
1122 return TypeInteger::make(lo->lo_as_long(), MAX2(lo->hi_as_long(), hi->hi_as_long()), 3, l->bt())->filter_speculative(_type);
1123 }
1124 }
1125 }
1126 }
1127 } else if (l->in(LoopNode::LoopBackControl) != NULL__null &&
1128 in(LoopNode::EntryControl) != NULL__null &&
1129 phase->type(l->in(LoopNode::LoopBackControl)) == Type::TOP) {
1130 // During CCP, if we saturate the type of a counted loop's Phi
1131 // before the special code for counted loop above has a chance
1132 // to run (that is as long as the type of the backedge's control
1133 // is top), we might end up with non monotonic types
1134 return phase->type(in(LoopNode::EntryControl))->filter_speculative(_type);
1135 }
1136 }
1137
1138 // Until we have harmony between classes and interfaces in the type
1139 // lattice, we must tread carefully around phis which implicitly
1140 // convert the one to the other.
1141 const TypePtr* ttp = _type->make_ptr();
1142 const TypeInstPtr* ttip = (ttp != NULL__null) ? ttp->isa_instptr() : NULL__null;
1143 const TypeKlassPtr* ttkp = (ttp != NULL__null) ? ttp->isa_instklassptr() : NULL__null;
1144 bool is_intf = false;
1145 if (ttip != NULL__null) {
1146 ciKlass* k = ttip->klass();
1147 if (k->is_loaded() && k->is_interface())
1148 is_intf = true;
1149 }
1150 if (ttkp != NULL__null) {
1151 ciKlass* k = ttkp->klass();
1152 if (k->is_loaded() && k->is_interface())
1153 is_intf = true;
1154 }
1155
1156 // Default case: merge all inputs
1157 const Type *t = Type::TOP; // Merged type starting value
1158 for (uint i = 1; i < req(); ++i) {// For all paths in
1159 // Reachable control path?
1160 if (r->in(i) && phase->type(r->in(i)) == Type::CONTROL) {
1161 const Type* ti = phase->type(in(i));
1162 // We assume that each input of an interface-valued Phi is a true
1163 // subtype of that interface. This might not be true of the meet
1164 // of all the input types. The lattice is not distributive in
1165 // such cases. Ward off asserts in type.cpp by refusing to do
1166 // meets between interfaces and proper classes.
1167 const TypePtr* tip = ti->make_ptr();
1168 const TypeInstPtr* tiip = (tip != NULL__null) ? tip->isa_instptr() : NULL__null;
1169 if (tiip) {
1170 bool ti_is_intf = false;
1171 ciKlass* k = tiip->klass();
1172 if (k->is_loaded() && k->is_interface())
1173 ti_is_intf = true;
1174 if (is_intf != ti_is_intf)
1175 { t = _type; break; }
1176 }
1177 t = t->meet_speculative(ti);
1178 }
1179 }
1180
1181 // The worst-case type (from ciTypeFlow) should be consistent with "t".
1182 // That is, we expect that "t->higher_equal(_type)" holds true.
1183 // There are various exceptions:
1184 // - Inputs which are phis might in fact be widened unnecessarily.
1185 // For example, an input might be a widened int while the phi is a short.
1186 // - Inputs might be BotPtrs but this phi is dependent on a null check,
1187 // and postCCP has removed the cast which encodes the result of the check.
1188 // - The type of this phi is an interface, and the inputs are classes.
1189 // - Value calls on inputs might produce fuzzy results.
1190 // (Occurrences of this case suggest improvements to Value methods.)
1191 //
1192 // It is not possible to see Type::BOTTOM values as phi inputs,
1193 // because the ciTypeFlow pre-pass produces verifier-quality types.
1194 const Type* ft = t->filter_speculative(_type); // Worst case type
1195
1196#ifdef ASSERT1
1197 // The following logic has been moved into TypeOopPtr::filter.
1198 const Type* jt = t->join_speculative(_type);
1199 if (jt->empty()) { // Emptied out???
1200
1201 // Check for evil case of 't' being a class and '_type' expecting an
1202 // interface. This can happen because the bytecodes do not contain
1203 // enough type info to distinguish a Java-level interface variable
1204 // from a Java-level object variable. If we meet 2 classes which
1205 // both implement interface I, but their meet is at 'j/l/O' which
1206 // doesn't implement I, we have no way to tell if the result should
1207 // be 'I' or 'j/l/O'. Thus we'll pick 'j/l/O'. If this then flows
1208 // into a Phi which "knows" it's an Interface type we'll have to
1209 // uplift the type.
1210 if (!t->empty() && ttip && ttip->is_loaded() && ttip->klass()->is_interface()) {
1211 assert(ft == _type, "")do { if (!(ft == _type)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1211, "assert(" "ft == _type" ") failed", ""); ::breakpoint
(); } } while (0)
; // Uplift to interface
1212 } else if (!t->empty() && ttkp && ttkp->is_loaded() && ttkp->klass()->is_interface()) {
1213 assert(ft == _type, "")do { if (!(ft == _type)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1213, "assert(" "ft == _type" ") failed", ""); ::breakpoint
(); } } while (0)
; // Uplift to interface
1214 } else {
1215 // We also have to handle 'evil cases' of interface- vs. class-arrays
1216 Type::get_arrays_base_elements(jt, _type, NULL__null, &ttip);
1217 if (!t->empty() && ttip != NULL__null && ttip->is_loaded() && ttip->klass()->is_interface()) {
1218 assert(ft == _type, "")do { if (!(ft == _type)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1218, "assert(" "ft == _type" ") failed", ""); ::breakpoint
(); } } while (0)
; // Uplift to array of interface
1219 } else {
1220 // Otherwise it's something stupid like non-overlapping int ranges
1221 // found on dying counted loops.
1222 assert(ft == Type::TOP, "")do { if (!(ft == Type::TOP)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1222, "assert(" "ft == Type::TOP" ") failed", ""); ::breakpoint
(); } } while (0)
; // Canonical empty value
1223 }
1224 }
1225 }
1226
1227 else {
1228
1229 // If we have an interface-typed Phi and we narrow to a class type, the join
1230 // should report back the class. However, if we have a J/L/Object
1231 // class-typed Phi and an interface flows in, it's possible that the meet &
1232 // join report an interface back out. This isn't possible but happens
1233 // because the type system doesn't interact well with interfaces.
1234 const TypePtr *jtp = jt->make_ptr();
1235 const TypeInstPtr *jtip = (jtp != NULL__null) ? jtp->isa_instptr() : NULL__null;
1236 const TypeKlassPtr *jtkp = (jtp != NULL__null) ? jtp->isa_instklassptr() : NULL__null;
1237 if( jtip && ttip ) {
1238 if( jtip->is_loaded() && jtip->klass()->is_interface() &&
1239 ttip->is_loaded() && !ttip->klass()->is_interface() ) {
1240 assert(ft == ttip->cast_to_ptr_type(jtip->ptr()) ||do { if (!(ft == ttip->cast_to_ptr_type(jtip->ptr()) ||
ft->isa_narrowoop() && ft->make_ptr() == ttip->
cast_to_ptr_type(jtip->ptr()))) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1241, "assert(" "ft == ttip->cast_to_ptr_type(jtip->ptr()) || ft->isa_narrowoop() && ft->make_ptr() == ttip->cast_to_ptr_type(jtip->ptr())"
") failed", ""); ::breakpoint(); } } while (0)
1241 ft->isa_narrowoop() && ft->make_ptr() == ttip->cast_to_ptr_type(jtip->ptr()), "")do { if (!(ft == ttip->cast_to_ptr_type(jtip->ptr()) ||
ft->isa_narrowoop() && ft->make_ptr() == ttip->
cast_to_ptr_type(jtip->ptr()))) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1241, "assert(" "ft == ttip->cast_to_ptr_type(jtip->ptr()) || ft->isa_narrowoop() && ft->make_ptr() == ttip->cast_to_ptr_type(jtip->ptr())"
") failed", ""); ::breakpoint(); } } while (0)
;
1242 jt = ft;
1243 }
1244 }
1245 if( jtkp && ttkp ) {
1246 if( jtkp->is_loaded() && jtkp->klass()->is_interface() &&
1247 !jtkp->klass_is_exact() && // Keep exact interface klass (6894807)
1248 ttkp->is_loaded() && !ttkp->klass()->is_interface() ) {
1249 assert(ft == ttkp->cast_to_ptr_type(jtkp->ptr()) ||do { if (!(ft == ttkp->cast_to_ptr_type(jtkp->ptr()) ||
ft->isa_narrowklass() && ft->make_ptr() == ttkp
->cast_to_ptr_type(jtkp->ptr()))) { (*g_assert_poison) =
'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1250, "assert(" "ft == ttkp->cast_to_ptr_type(jtkp->ptr()) || ft->isa_narrowklass() && ft->make_ptr() == ttkp->cast_to_ptr_type(jtkp->ptr())"
") failed", ""); ::breakpoint(); } } while (0)
1250 ft->isa_narrowklass() && ft->make_ptr() == ttkp->cast_to_ptr_type(jtkp->ptr()), "")do { if (!(ft == ttkp->cast_to_ptr_type(jtkp->ptr()) ||
ft->isa_narrowklass() && ft->make_ptr() == ttkp
->cast_to_ptr_type(jtkp->ptr()))) { (*g_assert_poison) =
'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1250, "assert(" "ft == ttkp->cast_to_ptr_type(jtkp->ptr()) || ft->isa_narrowklass() && ft->make_ptr() == ttkp->cast_to_ptr_type(jtkp->ptr())"
") failed", ""); ::breakpoint(); } } while (0)
;
1251 jt = ft;
1252 }
1253 }
1254 if (jt != ft && jt->base() == ft->base()) {
1255 if (jt->isa_int() &&
1256 jt->is_int()->_lo == ft->is_int()->_lo &&
1257 jt->is_int()->_hi == ft->is_int()->_hi)
1258 jt = ft;
1259 if (jt->isa_long() &&
1260 jt->is_long()->_lo == ft->is_long()->_lo &&
1261 jt->is_long()->_hi == ft->is_long()->_hi)
1262 jt = ft;
1263 }
1264 if (jt != ft) {
1265 tty->print("merge type: "); t->dump(); tty->cr();
1266 tty->print("kill type: "); _type->dump(); tty->cr();
1267 tty->print("join type: "); jt->dump(); tty->cr();
1268 tty->print("filter type: "); ft->dump(); tty->cr();
1269 }
1270 assert(jt == ft, "")do { if (!(jt == ft)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1270, "assert(" "jt == ft" ") failed", ""); ::breakpoint();
} } while (0)
;
1271 }
1272#endif //ASSERT
1273
1274 // Deal with conversion problems found in data loops.
1275 ft = phase->saturate(ft, phase->type_or_null(this), _type);
1276
1277 return ft;
1278}
1279
1280
1281//------------------------------is_diamond_phi---------------------------------
1282// Does this Phi represent a simple well-shaped diamond merge? Return the
1283// index of the true path or 0 otherwise.
1284// If check_control_only is true, do not inspect the If node at the
1285// top, and return -1 (not an edge number) on success.
1286int PhiNode::is_diamond_phi(bool check_control_only) const {
1287 // Check for a 2-path merge
1288 Node *region = in(0);
1289 if( !region ) return 0;
1290 if( region->req() != 3 ) return 0;
1291 if( req() != 3 ) return 0;
1292 // Check that both paths come from the same If
1293 Node *ifp1 = region->in(1);
1294 Node *ifp2 = region->in(2);
1295 if( !ifp1 || !ifp2 ) return 0;
1296 Node *iff = ifp1->in(0);
1297 if( !iff || !iff->is_If() ) return 0;
1298 if( iff != ifp2->in(0) ) return 0;
1299 if (check_control_only) return -1;
1300 // Check for a proper bool/cmp
1301 const Node *b = iff->in(1);
1302 if( !b->is_Bool() ) return 0;
1303 const Node *cmp = b->in(1);
1304 if( !cmp->is_Cmp() ) return 0;
1305
1306 // Check for branching opposite expected
1307 if( ifp2->Opcode() == Op_IfTrue ) {
1308 assert( ifp1->Opcode() == Op_IfFalse, "" )do { if (!(ifp1->Opcode() == Op_IfFalse)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1308, "assert(" "ifp1->Opcode() == Op_IfFalse" ") failed"
, ""); ::breakpoint(); } } while (0)
;
1309 return 2;
1310 } else {
1311 assert( ifp1->Opcode() == Op_IfTrue, "" )do { if (!(ifp1->Opcode() == Op_IfTrue)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1311, "assert(" "ifp1->Opcode() == Op_IfTrue" ") failed"
, ""); ::breakpoint(); } } while (0)
;
1312 return 1;
1313 }
1314}
1315
1316//----------------------------check_cmove_id-----------------------------------
1317// Check for CMove'ing a constant after comparing against the constant.
1318// Happens all the time now, since if we compare equality vs a constant in
1319// the parser, we "know" the variable is constant on one path and we force
1320// it. Thus code like "if( x==0 ) {/*EMPTY*/}" ends up inserting a
1321// conditional move: "x = (x==0)?0:x;". Yucko. This fix is slightly more
1322// general in that we don't need constants. Since CMove's are only inserted
1323// in very special circumstances, we do it here on generic Phi's.
1324Node* PhiNode::is_cmove_id(PhaseTransform* phase, int true_path) {
1325 assert(true_path !=0, "only diamond shape graph expected")do { if (!(true_path !=0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1325, "assert(" "true_path !=0" ") failed", "only diamond shape graph expected"
); ::breakpoint(); } } while (0)
;
1326
1327 // is_diamond_phi() has guaranteed the correctness of the nodes sequence:
1328 // phi->region->if_proj->ifnode->bool->cmp
1329 Node* region = in(0);
1330 Node* iff = region->in(1)->in(0);
1331 BoolNode* b = iff->in(1)->as_Bool();
1332 Node* cmp = b->in(1);
1333 Node* tval = in(true_path);
1334 Node* fval = in(3-true_path);
1335 Node* id = CMoveNode::is_cmove_id(phase, cmp, tval, fval, b);
1336 if (id == NULL__null)
1337 return NULL__null;
1338
1339 // Either value might be a cast that depends on a branch of 'iff'.
1340 // Since the 'id' value will float free of the diamond, either
1341 // decast or return failure.
1342 Node* ctl = id->in(0);
1343 if (ctl != NULL__null && ctl->in(0) == iff) {
1344 if (id->is_ConstraintCast()) {
1345 return id->in(1);
1346 } else {
1347 // Don't know how to disentangle this value.
1348 return NULL__null;
1349 }
1350 }
1351
1352 return id;
1353}
1354
1355//------------------------------Identity---------------------------------------
1356// Check for Region being Identity.
1357Node* PhiNode::Identity(PhaseGVN* phase) {
1358 // Check for no merging going on
1359 // (There used to be special-case code here when this->region->is_Loop.
1360 // It would check for a tributary phi on the backedge that the main phi
1361 // trivially, perhaps with a single cast. The unique_input method
1362 // does all this and more, by reducing such tributaries to 'this'.)
1363 Node* uin = unique_input(phase, false);
1364 if (uin != NULL__null) {
1365 return uin;
1366 }
1367
1368 int true_path = is_diamond_phi();
1369 // Delay CMove'ing identity if Ideal has not had the chance to handle unsafe cases, yet.
1370 if (true_path != 0 && !(phase->is_IterGVN() && wait_for_region_igvn(phase))) {
1371 Node* id = is_cmove_id(phase, true_path);
1372 if (id != NULL__null) {
1373 return id;
1374 }
1375 }
1376
1377 // Looking for phis with identical inputs. If we find one that has
1378 // type TypePtr::BOTTOM, replace the current phi with the bottom phi.
1379 if (phase->is_IterGVN() && type() == Type::MEMORY && adr_type() !=
1380 TypePtr::BOTTOM && !adr_type()->is_known_instance()) {
1381 uint phi_len = req();
1382 Node* phi_reg = region();
1383 for (DUIterator_Fast imax, i = phi_reg->fast_outs(imax); i < imax; i++) {
1384 Node* u = phi_reg->fast_out(i);
1385 if (u->is_Phi() && u->as_Phi()->type() == Type::MEMORY &&
1386 u->adr_type() == TypePtr::BOTTOM && u->in(0) == phi_reg &&
1387 u->req() == phi_len) {
1388 for (uint j = 1; j < phi_len; j++) {
1389 if (in(j) != u->in(j)) {
1390 u = NULL__null;
1391 break;
1392 }
1393 }
1394 if (u != NULL__null) {
1395 return u;
1396 }
1397 }
1398 }
1399 }
1400
1401 return this; // No identity
1402}
1403
1404//-----------------------------unique_input------------------------------------
1405// Find the unique value, discounting top, self-loops, and casts.
1406// Return top if there are no inputs, and self if there are multiple.
1407Node* PhiNode::unique_input(PhaseTransform* phase, bool uncast) {
1408 // 1) One unique direct input,
1409 // or if uncast is true:
1410 // 2) some of the inputs have an intervening ConstraintCast
1411 // 3) an input is a self loop
1412 //
1413 // 1) input or 2) input or 3) input __
1414 // / \ / \ \ / \
1415 // \ / | cast phi cast
1416 // phi \ / / \ /
1417 // phi / --
1418
1419 Node* r = in(0); // RegionNode
1420 Node* input = NULL__null; // The unique direct input (maybe uncasted = ConstraintCasts removed)
1421
1422 for (uint i = 1, cnt = req(); i < cnt; ++i) {
1423 Node* rc = r->in(i);
1424 if (rc == NULL__null || phase->type(rc) == Type::TOP)
1425 continue; // ignore unreachable control path
1426 Node* n = in(i);
1427 if (n == NULL__null)
1428 continue;
1429 Node* un = n;
1430 if (uncast) {
1431#ifdef ASSERT1
1432 Node* m = un->uncast();
1433#endif
1434 while (un != NULL__null && un->req() == 2 && un->is_ConstraintCast()) {
1435 Node* next = un->in(1);
1436 if (phase->type(next)->isa_rawptr() && phase->type(un)->isa_oopptr()) {
1437 // risk exposing raw ptr at safepoint
1438 break;
1439 }
1440 un = next;
1441 }
1442 assert(m == un || un->in(1) == m, "Only expected at CheckCastPP from allocation")do { if (!(m == un || un->in(1) == m)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1442, "assert(" "m == un || un->in(1) == m" ") failed", "Only expected at CheckCastPP from allocation"
); ::breakpoint(); } } while (0)
;
1443 }
1444 if (un == NULL__null || un == this || phase->type(un) == Type::TOP) {
1445 continue; // ignore if top, or in(i) and "this" are in a data cycle
1446 }
1447 // Check for a unique input (maybe uncasted)
1448 if (input == NULL__null) {
1449 input = un;
1450 } else if (input != un) {
1451 input = NodeSentinel(Node*)-1; // no unique input
1452 }
1453 }
1454 if (input == NULL__null) {
1455 return phase->C->top(); // no inputs
1456 }
1457
1458 if (input != NodeSentinel(Node*)-1) {
1459 return input; // one unique direct input
1460 }
1461
1462 // Nothing.
1463 return NULL__null;
1464}
1465
1466//------------------------------is_x2logic-------------------------------------
1467// Check for simple convert-to-boolean pattern
1468// If:(C Bool) Region:(IfF IfT) Phi:(Region 0 1)
1469// Convert Phi to an ConvIB.
1470static Node *is_x2logic( PhaseGVN *phase, PhiNode *phi, int true_path ) {
1471 assert(true_path !=0, "only diamond shape graph expected")do { if (!(true_path !=0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1471, "assert(" "true_path !=0" ") failed", "only diamond shape graph expected"
); ::breakpoint(); } } while (0)
;
1472 // Convert the true/false index into an expected 0/1 return.
1473 // Map 2->0 and 1->1.
1474 int flipped = 2-true_path;
1475
1476 // is_diamond_phi() has guaranteed the correctness of the nodes sequence:
1477 // phi->region->if_proj->ifnode->bool->cmp
1478 Node *region = phi->in(0);
1479 Node *iff = region->in(1)->in(0);
1480 BoolNode *b = (BoolNode*)iff->in(1);
1481 const CmpNode *cmp = (CmpNode*)b->in(1);
1482
1483 Node *zero = phi->in(1);
1484 Node *one = phi->in(2);
1485 const Type *tzero = phase->type( zero );
1486 const Type *tone = phase->type( one );
1487
1488 // Check for compare vs 0
1489 const Type *tcmp = phase->type(cmp->in(2));
1490 if( tcmp != TypeInt::ZERO && tcmp != TypePtr::NULL_PTR ) {
1491 // Allow cmp-vs-1 if the other input is bounded by 0-1
1492 if( !(tcmp == TypeInt::ONE && phase->type(cmp->in(1)) == TypeInt::BOOL) )
1493 return NULL__null;
1494 flipped = 1-flipped; // Test is vs 1 instead of 0!
1495 }
1496
1497 // Check for setting zero/one opposite expected
1498 if( tzero == TypeInt::ZERO ) {
1499 if( tone == TypeInt::ONE ) {
1500 } else return NULL__null;
1501 } else if( tzero == TypeInt::ONE ) {
1502 if( tone == TypeInt::ZERO ) {
1503 flipped = 1-flipped;
1504 } else return NULL__null;
1505 } else return NULL__null;
1506
1507 // Check for boolean test backwards
1508 if( b->_test._test == BoolTest::ne ) {
1509 } else if( b->_test._test == BoolTest::eq ) {
1510 flipped = 1-flipped;
1511 } else return NULL__null;
1512
1513 // Build int->bool conversion
1514 Node *n = new Conv2BNode(cmp->in(1));
1515 if( flipped )
1516 n = new XorINode( phase->transform(n), phase->intcon(1) );
1517
1518 return n;
1519}
1520
1521//------------------------------is_cond_add------------------------------------
1522// Check for simple conditional add pattern: "(P < Q) ? X+Y : X;"
1523// To be profitable the control flow has to disappear; there can be no other
1524// values merging here. We replace the test-and-branch with:
1525// "(sgn(P-Q))&Y) + X". Basically, convert "(P < Q)" into 0 or -1 by
1526// moving the carry bit from (P-Q) into a register with 'sbb EAX,EAX'.
1527// Then convert Y to 0-or-Y and finally add.
1528// This is a key transform for SpecJava _201_compress.
1529static Node* is_cond_add(PhaseGVN *phase, PhiNode *phi, int true_path) {
1530 assert(true_path !=0, "only diamond shape graph expected")do { if (!(true_path !=0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1530, "assert(" "true_path !=0" ") failed", "only diamond shape graph expected"
); ::breakpoint(); } } while (0)
;
1531
1532 // is_diamond_phi() has guaranteed the correctness of the nodes sequence:
1533 // phi->region->if_proj->ifnode->bool->cmp
1534 RegionNode *region = (RegionNode*)phi->in(0);
1535 Node *iff = region->in(1)->in(0);
1536 BoolNode* b = iff->in(1)->as_Bool();
1537 const CmpNode *cmp = (CmpNode*)b->in(1);
1538
1539 // Make sure only merging this one phi here
1540 if (region->has_unique_phi() != phi) return NULL__null;
1541
1542 // Make sure each arm of the diamond has exactly one output, which we assume
1543 // is the region. Otherwise, the control flow won't disappear.
1544 if (region->in(1)->outcnt() != 1) return NULL__null;
1545 if (region->in(2)->outcnt() != 1) return NULL__null;
1546
1547 // Check for "(P < Q)" of type signed int
1548 if (b->_test._test != BoolTest::lt) return NULL__null;
1549 if (cmp->Opcode() != Op_CmpI) return NULL__null;
1550
1551 Node *p = cmp->in(1);
1552 Node *q = cmp->in(2);
1553 Node *n1 = phi->in( true_path);
1554 Node *n2 = phi->in(3-true_path);
1555
1556 int op = n1->Opcode();
1557 if( op != Op_AddI // Need zero as additive identity
1558 /*&&op != Op_SubI &&
1559 op != Op_AddP &&
1560 op != Op_XorI &&
1561 op != Op_OrI*/ )
1562 return NULL__null;
1563
1564 Node *x = n2;
1565 Node *y = NULL__null;
1566 if( x == n1->in(1) ) {
1567 y = n1->in(2);
1568 } else if( x == n1->in(2) ) {
1569 y = n1->in(1);
1570 } else return NULL__null;
1571
1572 // Not so profitable if compare and add are constants
1573 if( q->is_Con() && phase->type(q) != TypeInt::ZERO && y->is_Con() )
1574 return NULL__null;
1575
1576 Node *cmplt = phase->transform( new CmpLTMaskNode(p,q) );
1577 Node *j_and = phase->transform( new AndINode(cmplt,y) );
1578 return new AddINode(j_and,x);
1579}
1580
1581//------------------------------is_absolute------------------------------------
1582// Check for absolute value.
1583static Node* is_absolute( PhaseGVN *phase, PhiNode *phi_root, int true_path) {
1584 assert(true_path !=0, "only diamond shape graph expected")do { if (!(true_path !=0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1584, "assert(" "true_path !=0" ") failed", "only diamond shape graph expected"
); ::breakpoint(); } } while (0)
;
1585
1586 int cmp_zero_idx = 0; // Index of compare input where to look for zero
1587 int phi_x_idx = 0; // Index of phi input where to find naked x
1588
1589 // ABS ends with the merge of 2 control flow paths.
1590 // Find the false path from the true path. With only 2 inputs, 3 - x works nicely.
1591 int false_path = 3 - true_path;
1592
1593 // is_diamond_phi() has guaranteed the correctness of the nodes sequence:
1594 // phi->region->if_proj->ifnode->bool->cmp
1595 BoolNode *bol = phi_root->in(0)->in(1)->in(0)->in(1)->as_Bool();
1596 Node *cmp = bol->in(1);
1597
1598 // Check bool sense
1599 if (cmp->Opcode() == Op_CmpF || cmp->Opcode() == Op_CmpD) {
1600 switch (bol->_test._test) {
1601 case BoolTest::lt: cmp_zero_idx = 1; phi_x_idx = true_path; break;
1602 case BoolTest::le: cmp_zero_idx = 2; phi_x_idx = false_path; break;
1603 case BoolTest::gt: cmp_zero_idx = 2; phi_x_idx = true_path; break;
1604 case BoolTest::ge: cmp_zero_idx = 1; phi_x_idx = false_path; break;
1605 default: return NULL__null; break;
1606 }
1607 } else if (cmp->Opcode() == Op_CmpI || cmp->Opcode() == Op_CmpL) {
1608 switch (bol->_test._test) {
1609 case BoolTest::lt:
1610 case BoolTest::le: cmp_zero_idx = 2; phi_x_idx = false_path; break;
1611 case BoolTest::gt:
1612 case BoolTest::ge: cmp_zero_idx = 2; phi_x_idx = true_path; break;
1613 default: return NULL__null; break;
1614 }
1615 }
1616
1617 // Test is next
1618 const Type *tzero = NULL__null;
1619 switch (cmp->Opcode()) {
1620 case Op_CmpI: tzero = TypeInt::ZERO; break; // Integer ABS
1621 case Op_CmpL: tzero = TypeLong::ZERO; break; // Long ABS
1622 case Op_CmpF: tzero = TypeF::ZERO; break; // Float ABS
1623 case Op_CmpD: tzero = TypeD::ZERO; break; // Double ABS
1624 default: return NULL__null;
1625 }
1626
1627 // Find zero input of compare; the other input is being abs'd
1628 Node *x = NULL__null;
1629 bool flip = false;
1630 if( phase->type(cmp->in(cmp_zero_idx)) == tzero ) {
1631 x = cmp->in(3 - cmp_zero_idx);
1632 } else if( phase->type(cmp->in(3 - cmp_zero_idx)) == tzero ) {
1633 // The test is inverted, we should invert the result...
1634 x = cmp->in(cmp_zero_idx);
1635 flip = true;
1636 } else {
1637 return NULL__null;
1638 }
1639
1640 // Next get the 2 pieces being selected, one is the original value
1641 // and the other is the negated value.
1642 if( phi_root->in(phi_x_idx) != x ) return NULL__null;
1643
1644 // Check other phi input for subtract node
1645 Node *sub = phi_root->in(3 - phi_x_idx);
1646
1647 bool is_sub = sub->Opcode() == Op_SubF || sub->Opcode() == Op_SubD ||
1648 sub->Opcode() == Op_SubI || sub->Opcode() == Op_SubL;
1649
1650 // Allow only Sub(0,X) and fail out for all others; Neg is not OK
1651 if (!is_sub || phase->type(sub->in(1)) != tzero || sub->in(2) != x) return NULL__null;
1652
1653 if (tzero == TypeF::ZERO) {
1654 x = new AbsFNode(x);
1655 if (flip) {
1656 x = new SubFNode(sub->in(1), phase->transform(x));
1657 }
1658 } else if (tzero == TypeD::ZERO) {
1659 x = new AbsDNode(x);
1660 if (flip) {
1661 x = new SubDNode(sub->in(1), phase->transform(x));
1662 }
1663 } else if (tzero == TypeInt::ZERO && Matcher::match_rule_supported(Op_AbsI)) {
1664 x = new AbsINode(x);
1665 if (flip) {
1666 x = new SubINode(sub->in(1), phase->transform(x));
1667 }
1668 } else if (tzero == TypeLong::ZERO && Matcher::match_rule_supported(Op_AbsL)) {
1669 x = new AbsLNode(x);
1670 if (flip) {
1671 x = new SubLNode(sub->in(1), phase->transform(x));
1672 }
1673 } else return NULL__null;
1674
1675 return x;
1676}
1677
1678//------------------------------split_once-------------------------------------
1679// Helper for split_flow_path
1680static void split_once(PhaseIterGVN *igvn, Node *phi, Node *val, Node *n, Node *newn) {
1681 igvn->hash_delete(n); // Remove from hash before hacking edges
1682
1683 uint j = 1;
1684 for (uint i = phi->req()-1; i > 0; i--) {
1685 if (phi->in(i) == val) { // Found a path with val?
1686 // Add to NEW Region/Phi, no DU info
1687 newn->set_req( j++, n->in(i) );
1688 // Remove from OLD Region/Phi
1689 n->del_req(i);
1690 }
1691 }
1692
1693 // Register the new node but do not transform it. Cannot transform until the
1694 // entire Region/Phi conglomerate has been hacked as a single huge transform.
1695 igvn->register_new_node_with_optimizer( newn );
1696
1697 // Now I can point to the new node.
1698 n->add_req(newn);
1699 igvn->_worklist.push(n);
1700}
1701
1702//------------------------------split_flow_path--------------------------------
1703// Check for merging identical values and split flow paths
1704static Node* split_flow_path(PhaseGVN *phase, PhiNode *phi) {
1705 BasicType bt = phi->type()->basic_type();
1706 if( bt == T_ILLEGAL || type2size[bt] <= 0 )
1707 return NULL__null; // Bail out on funny non-value stuff
1708 if( phi->req() <= 3 ) // Need at least 2 matched inputs and a
1709 return NULL__null; // third unequal input to be worth doing
1710
1711 // Scan for a constant
1712 uint i;
1713 for( i = 1; i < phi->req()-1; i++ ) {
1714 Node *n = phi->in(i);
1715 if( !n ) return NULL__null;
1716 if( phase->type(n) == Type::TOP ) return NULL__null;
1717 if( n->Opcode() == Op_ConP || n->Opcode() == Op_ConN || n->Opcode() == Op_ConNKlass )
1718 break;
1719 }
1720 if( i >= phi->req() ) // Only split for constants
1721 return NULL__null;
1722
1723 Node *val = phi->in(i); // Constant to split for
1724 uint hit = 0; // Number of times it occurs
1725 Node *r = phi->region();
1726
1727 for( ; i < phi->req(); i++ ){ // Count occurrences of constant
1728 Node *n = phi->in(i);
1729 if( !n ) return NULL__null;
1730 if( phase->type(n) == Type::TOP ) return NULL__null;
1731 if( phi->in(i) == val ) {
1732 hit++;
1733 if (PhaseIdealLoop::find_predicate(r->in(i)) != NULL__null) {
1734 return NULL__null; // don't split loop entry path
1735 }
1736 }
1737 }
1738
1739 if( hit <= 1 || // Make sure we find 2 or more
1740 hit == phi->req()-1 ) // and not ALL the same value
1741 return NULL__null;
1742
1743 // Now start splitting out the flow paths that merge the same value.
1744 // Split first the RegionNode.
1745 PhaseIterGVN *igvn = phase->is_IterGVN();
1746 RegionNode *newr = new RegionNode(hit+1);
1747 split_once(igvn, phi, val, r, newr);
1748
1749 // Now split all other Phis than this one
1750 for (DUIterator_Fast kmax, k = r->fast_outs(kmax); k < kmax; k++) {
1751 Node* phi2 = r->fast_out(k);
1752 if( phi2->is_Phi() && phi2->as_Phi() != phi ) {
1753 PhiNode *newphi = PhiNode::make_blank(newr, phi2);
1754 split_once(igvn, phi, val, phi2, newphi);
1755 }
1756 }
1757
1758 // Clean up this guy
1759 igvn->hash_delete(phi);
1760 for( i = phi->req()-1; i > 0; i-- ) {
1761 if( phi->in(i) == val ) {
1762 phi->del_req(i);
1763 }
1764 }
1765 phi->add_req(val);
1766
1767 return phi;
1768}
1769
1770//=============================================================================
1771//------------------------------simple_data_loop_check-------------------------
1772// Try to determining if the phi node in a simple safe/unsafe data loop.
1773// Returns:
1774// enum LoopSafety { Safe = 0, Unsafe, UnsafeLoop };
1775// Safe - safe case when the phi and it's inputs reference only safe data
1776// nodes;
1777// Unsafe - the phi and it's inputs reference unsafe data nodes but there
1778// is no reference back to the phi - need a graph walk
1779// to determine if it is in a loop;
1780// UnsafeLoop - unsafe case when the phi references itself directly or through
1781// unsafe data node.
1782// Note: a safe data node is a node which could/never reference itself during
1783// GVN transformations. For now it is Con, Proj, Phi, CastPP, CheckCastPP.
1784// I mark Phi nodes as safe node not only because they can reference itself
1785// but also to prevent mistaking the fallthrough case inside an outer loop
1786// as dead loop when the phi references itselfs through an other phi.
1787PhiNode::LoopSafety PhiNode::simple_data_loop_check(Node *in) const {
1788 // It is unsafe loop if the phi node references itself directly.
1789 if (in == (Node*)this)
1790 return UnsafeLoop; // Unsafe loop
1791 // Unsafe loop if the phi node references itself through an unsafe data node.
1792 // Exclude cases with null inputs or data nodes which could reference
1793 // itself (safe for dead loops).
1794 if (in != NULL__null && !in->is_dead_loop_safe()) {
1795 // Check inputs of phi's inputs also.
1796 // It is much less expensive then full graph walk.
1797 uint cnt = in->req();
1798 uint i = (in->is_Proj() && !in->is_CFG()) ? 0 : 1;
1799 for (; i < cnt; ++i) {
1800 Node* m = in->in(i);
1801 if (m == (Node*)this)
1802 return UnsafeLoop; // Unsafe loop
1803 if (m != NULL__null && !m->is_dead_loop_safe()) {
1804 // Check the most common case (about 30% of all cases):
1805 // phi->Load/Store->AddP->(ConP ConP Con)/(Parm Parm Con).
1806 Node *m1 = (m->is_AddP() && m->req() > 3) ? m->in(1) : NULL__null;
1807 if (m1 == (Node*)this)
1808 return UnsafeLoop; // Unsafe loop
1809 if (m1 != NULL__null && m1 == m->in(2) &&
1810 m1->is_dead_loop_safe() && m->in(3)->is_Con()) {
1811 continue; // Safe case
1812 }
1813 // The phi references an unsafe node - need full analysis.
1814 return Unsafe;
1815 }
1816 }
1817 }
1818 return Safe; // Safe case - we can optimize the phi node.
1819}
1820
1821//------------------------------is_unsafe_data_reference-----------------------
1822// If phi can be reached through the data input - it is data loop.
1823bool PhiNode::is_unsafe_data_reference(Node *in) const {
1824 assert(req() > 1, "")do { if (!(req() > 1)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1824, "assert(" "req() > 1" ") failed", ""); ::breakpoint
(); } } while (0)
;
1825 // First, check simple cases when phi references itself directly or
1826 // through an other node.
1827 LoopSafety safety = simple_data_loop_check(in);
1828 if (safety == UnsafeLoop)
1829 return true; // phi references itself - unsafe loop
1830 else if (safety == Safe)
1831 return false; // Safe case - phi could be replaced with the unique input.
1832
1833 // Unsafe case when we should go through data graph to determine
1834 // if the phi references itself.
1835
1836 ResourceMark rm;
1837
1838 Node_List nstack;
1839 VectorSet visited;
1840
1841 nstack.push(in); // Start with unique input.
1842 visited.set(in->_idx);
1843 while (nstack.size() != 0) {
1844 Node* n = nstack.pop();
1845 uint cnt = n->req();
1846 uint i = (n->is_Proj() && !n->is_CFG()) ? 0 : 1;
1847 for (; i < cnt; i++) {
1848 Node* m = n->in(i);
1849 if (m == (Node*)this) {
1850 return true; // Data loop
1851 }
1852 if (m != NULL__null && !m->is_dead_loop_safe()) { // Only look for unsafe cases.
1853 if (!visited.test_set(m->_idx))
1854 nstack.push(m);
1855 }
1856 }
1857 }
1858 return false; // The phi is not reachable from its inputs
1859}
1860
1861// Is this Phi's region or some inputs to the region enqueued for IGVN
1862// and so could cause the region to be optimized out?
1863bool PhiNode::wait_for_region_igvn(PhaseGVN* phase) {
1864 PhaseIterGVN* igvn = phase->is_IterGVN();
1865 Unique_Node_List& worklist = igvn->_worklist;
1866 bool delay = false;
1867 Node* r = in(0);
1868 for (uint j = 1; j < req(); j++) {
1869 Node* rc = r->in(j);
1870 Node* n = in(j);
Value stored to 'n' during its initialization is never read
1871 if (rc != NULL__null &&
1872 rc->is_Proj()) {
1873 if (worklist.member(rc)) {
1874 delay = true;
1875 } else if (rc->in(0) != NULL__null &&
1876 rc->in(0)->is_If()) {
1877 if (worklist.member(rc->in(0))) {
1878 delay = true;
1879 } else if (rc->in(0)->in(1) != NULL__null &&
1880 rc->in(0)->in(1)->is_Bool()) {
1881 if (worklist.member(rc->in(0)->in(1))) {
1882 delay = true;
1883 } else if (rc->in(0)->in(1)->in(1) != NULL__null &&
1884 rc->in(0)->in(1)->in(1)->is_Cmp()) {
1885 if (worklist.member(rc->in(0)->in(1)->in(1))) {
1886 delay = true;
1887 }
1888 }
1889 }
1890 }
1891 }
1892 }
1893 if (delay) {
1894 worklist.push(this);
1895 }
1896 return delay;
1897}
1898
1899//------------------------------Ideal------------------------------------------
1900// Return a node which is more "ideal" than the current node. Must preserve
1901// the CFG, but we can still strip out dead paths.
1902Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
1903 Node *r = in(0); // RegionNode
1904 assert(r != NULL && r->is_Region(), "this phi must have a region")do { if (!(r != __null && r->is_Region())) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1904, "assert(" "r != __null && r->is_Region()" ") failed"
, "this phi must have a region"); ::breakpoint(); } } while (
0)
;
1905 assert(r->in(0) == NULL || !r->in(0)->is_Root(), "not a specially hidden merge")do { if (!(r->in(0) == __null || !r->in(0)->is_Root(
))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1905, "assert(" "r->in(0) == __null || !r->in(0)->is_Root()"
") failed", "not a specially hidden merge"); ::breakpoint();
} } while (0)
;
1906
1907 // Note: During parsing, phis are often transformed before their regions.
1908 // This means we have to use type_or_null to defend against untyped regions.
1909 if( phase->type_or_null(r) == Type::TOP ) // Dead code?
1910 return NULL__null; // No change
1911
1912 Node *top = phase->C->top();
1913 bool new_phi = (outcnt() == 0); // transforming new Phi
1914 // No change for igvn if new phi is not hooked
1915 if (new_phi && can_reshape)
1916 return NULL__null;
1917
1918 // The are 2 situations when only one valid phi's input is left
1919 // (in addition to Region input).
1920 // One: region is not loop - replace phi with this input.
1921 // Two: region is loop - replace phi with top since this data path is dead
1922 // and we need to break the dead data loop.
1923 Node* progress = NULL__null; // Record if any progress made
1924 for( uint j = 1; j < req(); ++j ){ // For all paths in
1925 // Check unreachable control paths
1926 Node* rc = r->in(j);
1927 Node* n = in(j); // Get the input
1928 if (rc == NULL__null || phase->type(rc) == Type::TOP) {
1929 if (n != top) { // Not already top?
1930 PhaseIterGVN *igvn = phase->is_IterGVN();
1931 if (can_reshape && igvn != NULL__null) {
1932 igvn->_worklist.push(r);
1933 }
1934 // Nuke it down
1935 set_req_X(j, top, phase);
1936 progress = this; // Record progress
1937 }
1938 }
1939 }
1940
1941 if (can_reshape && outcnt() == 0) {
1942 // set_req() above may kill outputs if Phi is referenced
1943 // only by itself on the dead (top) control path.
1944 return top;
1945 }
1946
1947 bool uncasted = false;
1948 Node* uin = unique_input(phase, false);
1949 if (uin == NULL__null && can_reshape &&
1950 // If there is a chance that the region can be optimized out do
1951 // not add a cast node that we can't remove yet.
1952 !wait_for_region_igvn(phase)) {
1953 uncasted = true;
1954 uin = unique_input(phase, true);
1955 }
1956 if (uin == top) { // Simplest case: no alive inputs.
1957 if (can_reshape) // IGVN transformation
1958 return top;
1959 else
1960 return NULL__null; // Identity will return TOP
1961 } else if (uin != NULL__null) {
1962 // Only one not-NULL unique input path is left.
1963 // Determine if this input is backedge of a loop.
1964 // (Skip new phis which have no uses and dead regions).
1965 if (outcnt() > 0 && r->in(0) != NULL__null) {
1966 if (is_data_loop(r->as_Region(), uin, phase)) {
1967 // Break this data loop to avoid creation of a dead loop.
1968 if (can_reshape) {
1969 return top;
1970 } else {
1971 // We can't return top if we are in Parse phase - cut inputs only
1972 // let Identity to handle the case.
1973 replace_edge(uin, top, phase);
1974 return NULL__null;
1975 }
1976 }
1977 }
1978
1979 if (uncasted) {
1980 // Add cast nodes between the phi to be removed and its unique input.
1981 // Wait until after parsing for the type information to propagate from the casts.
1982 assert(can_reshape, "Invalid during parsing")do { if (!(can_reshape)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 1982, "assert(" "can_reshape" ") failed", "Invalid during parsing"
); ::breakpoint(); } } while (0)
;
1983 const Type* phi_type = bottom_type();
1984 // Add casts to carry the control dependency of the Phi that is
1985 // going away
1986 Node* cast = NULL__null;
1987 if (phi_type->isa_ptr()) {
1988 const Type* uin_type = phase->type(uin);
1989 if (!phi_type->isa_oopptr() && !uin_type->isa_oopptr()) {
1990 cast = ConstraintCastNode::make_cast(Op_CastPP, r, uin, phi_type, ConstraintCastNode::StrongDependency);
1991 } else {
1992 // Use a CastPP for a cast to not null and a CheckCastPP for
1993 // a cast to a new klass (and both if both null-ness and
1994 // klass change).
1995
1996 // If the type of phi is not null but the type of uin may be
1997 // null, uin's type must be casted to not null
1998 if (phi_type->join(TypePtr::NOTNULL) == phi_type->remove_speculative() &&
1999 uin_type->join(TypePtr::NOTNULL) != uin_type->remove_speculative()) {
2000 cast = ConstraintCastNode::make_cast(Op_CastPP, r, uin, TypePtr::NOTNULL, ConstraintCastNode::StrongDependency);
2001 }
2002
2003 // If the type of phi and uin, both casted to not null,
2004 // differ the klass of uin must be (check)cast'ed to match
2005 // that of phi
2006 if (phi_type->join_speculative(TypePtr::NOTNULL) != uin_type->join_speculative(TypePtr::NOTNULL)) {
2007 Node* n = uin;
2008 if (cast != NULL__null) {
2009 cast = phase->transform(cast);
2010 n = cast;
2011 }
2012 cast = ConstraintCastNode::make_cast(Op_CheckCastPP, r, n, phi_type, ConstraintCastNode::StrongDependency);
2013 }
2014 if (cast == NULL__null) {
2015 cast = ConstraintCastNode::make_cast(Op_CastPP, r, uin, phi_type, ConstraintCastNode::StrongDependency);
2016 }
2017 }
2018 } else {
2019 cast = ConstraintCastNode::make_cast_for_type(r, uin, phi_type, ConstraintCastNode::StrongDependency);
2020 }
2021 assert(cast != NULL, "cast should be set")do { if (!(cast != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 2021, "assert(" "cast != __null" ") failed", "cast should be set"
); ::breakpoint(); } } while (0)
;
2022 cast = phase->transform(cast);
2023 // set all inputs to the new cast(s) so the Phi is removed by Identity
2024 PhaseIterGVN* igvn = phase->is_IterGVN();
2025 for (uint i = 1; i < req(); i++) {
2026 set_req_X(i, cast, igvn);
2027 }
2028 uin = cast;
2029 }
2030
2031 // One unique input.
2032 debug_only(Node* ident = Identity(phase))Node* ident = Identity(phase);
2033 // The unique input must eventually be detected by the Identity call.
2034#ifdef ASSERT1
2035 if (ident != uin && !ident->is_top()) {
2036 // print this output before failing assert
2037 r->dump(3);
2038 this->dump(3);
2039 ident->dump();
2040 uin->dump();
2041 }
2042#endif
2043 assert(ident == uin || ident->is_top(), "Identity must clean this up")do { if (!(ident == uin || ident->is_top())) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 2043, "assert(" "ident == uin || ident->is_top()" ") failed"
, "Identity must clean this up"); ::breakpoint(); } } while (
0)
;
2044 return NULL__null;
2045 }
2046
2047 Node* opt = NULL__null;
2048 int true_path = is_diamond_phi();
2049 if (true_path != 0 &&
2050 // If one of the diamond's branch is in the process of dying then, the Phi's input for that branch might transform
2051 // to top. If that happens replacing the Phi with an operation that consumes the Phi's inputs will cause the Phi
2052 // to be replaced by top. To prevent that, delay the transformation until the branch has a chance to be removed.
2053 !(can_reshape && wait_for_region_igvn(phase))) {
2054 // Check for CMove'ing identity. If it would be unsafe,
2055 // handle it here. In the safe case, let Identity handle it.
2056 Node* unsafe_id = is_cmove_id(phase, true_path);
2057 if( unsafe_id != NULL__null && is_unsafe_data_reference(unsafe_id) )
2058 opt = unsafe_id;
2059
2060 // Check for simple convert-to-boolean pattern
2061 if( opt == NULL__null )
2062 opt = is_x2logic(phase, this, true_path);
2063
2064 // Check for absolute value
2065 if( opt == NULL__null )
2066 opt = is_absolute(phase, this, true_path);
2067
2068 // Check for conditional add
2069 if( opt == NULL__null && can_reshape )
2070 opt = is_cond_add(phase, this, true_path);
2071
2072 // These 4 optimizations could subsume the phi:
2073 // have to check for a dead data loop creation.
2074 if( opt != NULL__null ) {
2075 if( opt == unsafe_id || is_unsafe_data_reference(opt) ) {
2076 // Found dead loop.
2077 if( can_reshape )
2078 return top;
2079 // We can't return top if we are in Parse phase - cut inputs only
2080 // to stop further optimizations for this phi. Identity will return TOP.
2081 assert(req() == 3, "only diamond merge phi here")do { if (!(req() == 3)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 2081, "assert(" "req() == 3" ") failed", "only diamond merge phi here"
); ::breakpoint(); } } while (0)
;
2082 set_req(1, top);
2083 set_req(2, top);
2084 return NULL__null;
2085 } else {
2086 return opt;
2087 }
2088 }
2089 }
2090
2091 // Check for merging identical values and split flow paths
2092 if (can_reshape) {
2093 opt = split_flow_path(phase, this);
2094 // This optimization only modifies phi - don't need to check for dead loop.
2095 assert(opt == NULL || opt == this, "do not elide phi")do { if (!(opt == __null || opt == this)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 2095, "assert(" "opt == __null || opt == this" ") failed", "do not elide phi"
); ::breakpoint(); } } while (0)
;
2096 if (opt != NULL__null) return opt;
2097 }
2098
2099 if (in(1) != NULL__null && in(1)->Opcode() == Op_AddP && can_reshape) {
2100 // Try to undo Phi of AddP:
2101 // (Phi (AddP base address offset) (AddP base2 address2 offset2))
2102 // becomes:
2103 // newbase := (Phi base base2)
2104 // newaddress := (Phi address address2)
2105 // newoffset := (Phi offset offset2)
2106 // (AddP newbase newaddress newoffset)
2107 //
2108 // This occurs as a result of unsuccessful split_thru_phi and
2109 // interferes with taking advantage of addressing modes. See the
2110 // clone_shift_expressions code in matcher.cpp
2111 Node* addp = in(1);
2112 Node* base = addp->in(AddPNode::Base);
2113 Node* address = addp->in(AddPNode::Address);
2114 Node* offset = addp->in(AddPNode::Offset);
2115 if (base != NULL__null && address != NULL__null && offset != NULL__null &&
2116 !base->is_top() && !address->is_top() && !offset->is_top()) {
2117 const Type* base_type = base->bottom_type();
2118 const Type* address_type = address->bottom_type();
2119 // make sure that all the inputs are similar to the first one,
2120 // i.e. AddP with base == address and same offset as first AddP
2121 bool doit = true;
2122 for (uint i = 2; i < req(); i++) {
2123 if (in(i) == NULL__null ||
2124 in(i)->Opcode() != Op_AddP ||
2125 in(i)->in(AddPNode::Base) == NULL__null ||
2126 in(i)->in(AddPNode::Address) == NULL__null ||
2127 in(i)->in(AddPNode::Offset) == NULL__null ||
2128 in(i)->in(AddPNode::Base)->is_top() ||
2129 in(i)->in(AddPNode::Address)->is_top() ||
2130 in(i)->in(AddPNode::Offset)->is_top()) {
2131 doit = false;
2132 break;
2133 }
2134 if (in(i)->in(AddPNode::Offset) != base) {
2135 base = NULL__null;
2136 }
2137 if (in(i)->in(AddPNode::Offset) != offset) {
2138 offset = NULL__null;
2139 }
2140 if (in(i)->in(AddPNode::Address) != address) {
2141 address = NULL__null;
2142 }
2143 // Accumulate type for resulting Phi
2144 base_type = base_type->meet_speculative(in(i)->in(AddPNode::Base)->bottom_type());
2145 address_type = address_type->meet_speculative(in(i)->in(AddPNode::Address)->bottom_type());
2146 }
2147 if (doit && base == NULL__null) {
2148 // Check for neighboring AddP nodes in a tree.
2149 // If they have a base, use that it.
2150 for (DUIterator_Fast kmax, k = this->fast_outs(kmax); k < kmax; k++) {
2151 Node* u = this->fast_out(k);
2152 if (u->is_AddP()) {
2153 Node* base2 = u->in(AddPNode::Base);
2154 if (base2 != NULL__null && !base2->is_top()) {
2155 if (base == NULL__null)
2156 base = base2;
2157 else if (base != base2)
2158 { doit = false; break; }
2159 }
2160 }
2161 }
2162 }
2163 if (doit) {
2164 if (base == NULL__null) {
2165 base = new PhiNode(in(0), base_type, NULL__null);
2166 for (uint i = 1; i < req(); i++) {
2167 base->init_req(i, in(i)->in(AddPNode::Base));
2168 }
2169 phase->is_IterGVN()->register_new_node_with_optimizer(base);
2170 }
2171 if (address == NULL__null) {
2172 address = new PhiNode(in(0), address_type, NULL__null);
2173 for (uint i = 1; i < req(); i++) {
2174 address->init_req(i, in(i)->in(AddPNode::Address));
2175 }
2176 phase->is_IterGVN()->register_new_node_with_optimizer(address);
2177 }
2178 if (offset == NULL__null) {
2179 offset = new PhiNode(in(0), TypeX_XTypeLong::LONG, NULL__null);
2180 for (uint i = 1; i < req(); i++) {
2181 offset->init_req(i, in(i)->in(AddPNode::Offset));
2182 }
2183 phase->is_IterGVN()->register_new_node_with_optimizer(offset);
2184 }
2185 return new AddPNode(base, address, offset);
2186 }
2187 }
2188 }
2189
2190 // Split phis through memory merges, so that the memory merges will go away.
2191 // Piggy-back this transformation on the search for a unique input....
2192 // It will be as if the merged memory is the unique value of the phi.
2193 // (Do not attempt this optimization unless parsing is complete.
2194 // It would make the parser's memory-merge logic sick.)
2195 // (MergeMemNode is not dead_loop_safe - need to check for dead loop.)
2196 if (progress == NULL__null && can_reshape && type() == Type::MEMORY) {
2197 // see if this phi should be sliced
2198 uint merge_width = 0;
2199 bool saw_self = false;
2200 for( uint i=1; i<req(); ++i ) {// For all paths in
2201 Node *ii = in(i);
2202 // TOP inputs should not be counted as safe inputs because if the
2203 // Phi references itself through all other inputs then splitting the
2204 // Phi through memory merges would create dead loop at later stage.
2205 if (ii == top) {
2206 return NULL__null; // Delay optimization until graph is cleaned.
2207 }
2208 if (ii->is_MergeMem()) {
2209 MergeMemNode* n = ii->as_MergeMem();
2210 merge_width = MAX2(merge_width, n->req());
2211 saw_self = saw_self || (n->base_memory() == this);
2212 }
2213 }
2214
2215 // This restriction is temporarily necessary to ensure termination:
2216 if (!saw_self && adr_type() == TypePtr::BOTTOM) merge_width = 0;
2217
2218 if (merge_width > Compile::AliasIdxRaw) {
2219 // found at least one non-empty MergeMem
2220 const TypePtr* at = adr_type();
2221 if (at != TypePtr::BOTTOM) {
2222 // Patch the existing phi to select an input from the merge:
2223 // Phi:AT1(...MergeMem(m0, m1, m2)...) into
2224 // Phi:AT1(...m1...)
2225 int alias_idx = phase->C->get_alias_index(at);
2226 for (uint i=1; i<req(); ++i) {
2227 Node *ii = in(i);
2228 if (ii->is_MergeMem()) {
2229 MergeMemNode* n = ii->as_MergeMem();
2230 // compress paths and change unreachable cycles to TOP
2231 // If not, we can update the input infinitely along a MergeMem cycle
2232 // Equivalent code is in MemNode::Ideal_common
2233 Node *m = phase->transform(n);
2234 if (outcnt() == 0) { // Above transform() may kill us!
2235 return top;
2236 }
2237 // If transformed to a MergeMem, get the desired slice
2238 // Otherwise the returned node represents memory for every slice
2239 Node *new_mem = (m->is_MergeMem()) ?
2240 m->as_MergeMem()->memory_at(alias_idx) : m;
2241 // Update input if it is progress over what we have now
2242 if (new_mem != ii) {
2243 set_req_X(i, new_mem, phase->is_IterGVN());
2244 progress = this;
2245 }
2246 }
2247 }
2248 } else {
2249 // We know that at least one MergeMem->base_memory() == this
2250 // (saw_self == true). If all other inputs also references this phi
2251 // (directly or through data nodes) - it is a dead loop.
2252 bool saw_safe_input = false;
2253 for (uint j = 1; j < req(); ++j) {
2254 Node* n = in(j);
2255 if (n->is_MergeMem()) {
2256 MergeMemNode* mm = n->as_MergeMem();
2257 if (mm->base_memory() == this || mm->base_memory() == mm->empty_memory()) {
2258 // Skip this input if it references back to this phi or if the memory path is dead
2259 continue;
2260 }
2261 }
2262 if (!is_unsafe_data_reference(n)) {
2263 saw_safe_input = true; // found safe input
2264 break;
2265 }
2266 }
2267 if (!saw_safe_input) {
2268 // There is a dead loop: All inputs are either dead or reference back to this phi
2269 return top;
2270 }
2271
2272 // Phi(...MergeMem(m0, m1:AT1, m2:AT2)...) into
2273 // MergeMem(Phi(...m0...), Phi:AT1(...m1...), Phi:AT2(...m2...))
2274 PhaseIterGVN* igvn = phase->is_IterGVN();
2275 assert(igvn != NULL, "sanity check")do { if (!(igvn != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 2275, "assert(" "igvn != __null" ") failed", "sanity check"
); ::breakpoint(); } } while (0)
;
2276 Node* hook = new Node(1);
2277 PhiNode* new_base = (PhiNode*) clone();
2278 // Must eagerly register phis, since they participate in loops.
2279 igvn->register_new_node_with_optimizer(new_base);
2280 hook->add_req(new_base);
2281
2282 MergeMemNode* result = MergeMemNode::make(new_base);
2283 for (uint i = 1; i < req(); ++i) {
2284 Node *ii = in(i);
2285 if (ii->is_MergeMem()) {
2286 MergeMemNode* n = ii->as_MergeMem();
2287 for (MergeMemStream mms(result, n); mms.next_non_empty2(); ) {
2288 // If we have not seen this slice yet, make a phi for it.
2289 bool made_new_phi = false;
2290 if (mms.is_empty()) {
2291 Node* new_phi = new_base->slice_memory(mms.adr_type(phase->C));
2292 made_new_phi = true;
2293 igvn->register_new_node_with_optimizer(new_phi);
2294 hook->add_req(new_phi);
2295 mms.set_memory(new_phi);
2296 }
2297 Node* phi = mms.memory();
2298 assert(made_new_phi || phi->in(i) == n, "replace the i-th merge by a slice")do { if (!(made_new_phi || phi->in(i) == n)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 2298, "assert(" "made_new_phi || phi->in(i) == n" ") failed"
, "replace the i-th merge by a slice"); ::breakpoint(); } } while
(0)
;
2299 phi->set_req(i, mms.memory2());
2300 }
2301 }
2302 }
2303 // Distribute all self-loops.
2304 { // (Extra braces to hide mms.)
2305 for (MergeMemStream mms(result); mms.next_non_empty(); ) {
2306 Node* phi = mms.memory();
2307 for (uint i = 1; i < req(); ++i) {
2308 if (phi->in(i) == this) phi->set_req(i, phi);
2309 }
2310 }
2311 }
2312 // Already replace this phi node to cut it off from the graph to not interfere in dead loop checks during the
2313 // transformations of the new phi nodes below. Otherwise, we could wrongly conclude that there is no dead loop
2314 // because we are finding this phi node again. Also set the type of the new MergeMem node in case we are also
2315 // visiting it in the transformations below.
2316 igvn->replace_node(this, result);
2317 igvn->set_type(result, result->bottom_type());
2318
2319 // now transform the new nodes, and return the mergemem
2320 for (MergeMemStream mms(result); mms.next_non_empty(); ) {
2321 Node* phi = mms.memory();
2322 mms.set_memory(phase->transform(phi));
2323 }
2324 hook->destruct(igvn);
2325 // Replace self with the result.
2326 return result;
2327 }
2328 }
2329 //
2330 // Other optimizations on the memory chain
2331 //
2332 const TypePtr* at = adr_type();
2333 for( uint i=1; i<req(); ++i ) {// For all paths in
2334 Node *ii = in(i);
2335 Node *new_in = MemNode::optimize_memory_chain(ii, at, NULL__null, phase);
2336 if (ii != new_in ) {
2337 set_req(i, new_in);
2338 progress = this;
2339 }
2340 }
2341 }
2342
2343#ifdef _LP641
2344 // Push DecodeN/DecodeNKlass down through phi.
2345 // The rest of phi graph will transform by split EncodeP node though phis up.
2346 if ((UseCompressedOops || UseCompressedClassPointers) && can_reshape && progress == NULL__null) {
2347 bool may_push = true;
2348 bool has_decodeN = false;
2349 bool is_decodeN = false;
2350 for (uint i=1; i<req(); ++i) {// For all paths in
2351 Node *ii = in(i);
2352 if (ii->is_DecodeNarrowPtr() && ii->bottom_type() == bottom_type()) {
2353 // Do optimization if a non dead path exist.
2354 if (ii->in(1)->bottom_type() != Type::TOP) {
2355 has_decodeN = true;
2356 is_decodeN = ii->is_DecodeN();
2357 }
2358 } else if (!ii->is_Phi()) {
2359 may_push = false;
2360 }
2361 }
2362
2363 if (has_decodeN && may_push) {
2364 PhaseIterGVN *igvn = phase->is_IterGVN();
2365 // Make narrow type for new phi.
2366 const Type* narrow_t;
2367 if (is_decodeN) {
2368 narrow_t = TypeNarrowOop::make(this->bottom_type()->is_ptr());
2369 } else {
2370 narrow_t = TypeNarrowKlass::make(this->bottom_type()->is_ptr());
2371 }
2372 PhiNode* new_phi = new PhiNode(r, narrow_t);
2373 uint orig_cnt = req();
2374 for (uint i=1; i<req(); ++i) {// For all paths in
2375 Node *ii = in(i);
2376 Node* new_ii = NULL__null;
2377 if (ii->is_DecodeNarrowPtr()) {
2378 assert(ii->bottom_type() == bottom_type(), "sanity")do { if (!(ii->bottom_type() == bottom_type())) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 2378, "assert(" "ii->bottom_type() == bottom_type()" ") failed"
, "sanity"); ::breakpoint(); } } while (0)
;
2379 new_ii = ii->in(1);
2380 } else {
2381 assert(ii->is_Phi(), "sanity")do { if (!(ii->is_Phi())) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 2381, "assert(" "ii->is_Phi()" ") failed", "sanity"); ::
breakpoint(); } } while (0)
;
2382 if (ii->as_Phi() == this) {
2383 new_ii = new_phi;
2384 } else {
2385 if (is_decodeN) {
2386 new_ii = new EncodePNode(ii, narrow_t);
2387 } else {
2388 new_ii = new EncodePKlassNode(ii, narrow_t);
2389 }
2390 igvn->register_new_node_with_optimizer(new_ii);
2391 }
2392 }
2393 new_phi->set_req(i, new_ii);
2394 }
2395 igvn->register_new_node_with_optimizer(new_phi, this);
2396 if (is_decodeN) {
2397 progress = new DecodeNNode(new_phi, bottom_type());
2398 } else {
2399 progress = new DecodeNKlassNode(new_phi, bottom_type());
2400 }
2401 }
2402 }
2403#endif
2404
2405 // Phi (VB ... VB) => VB (Phi ...) (Phi ...)
2406 if (EnableVectorReboxing && can_reshape && progress == NULL__null && type()->isa_oopptr()) {
2407 progress = merge_through_phi(this, phase->is_IterGVN());
2408 }
2409
2410 return progress; // Return any progress
2411}
2412
2413Node* PhiNode::clone_through_phi(Node* root_phi, const Type* t, uint c, PhaseIterGVN* igvn) {
2414 Node_Stack stack(1);
2415 VectorSet visited;
2416 Node_List node_map;
2417
2418 stack.push(root_phi, 1); // ignore control
2419 visited.set(root_phi->_idx);
2420
2421 Node* new_phi = new PhiNode(root_phi->in(0), t);
2422 node_map.map(root_phi->_idx, new_phi);
2423
2424 while (stack.is_nonempty()) {
2425 Node* n = stack.node();
2426 uint idx = stack.index();
2427 assert(n->is_Phi(), "not a phi")do { if (!(n->is_Phi())) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 2427, "assert(" "n->is_Phi()" ") failed", "not a phi"); ::
breakpoint(); } } while (0)
;
2428 if (idx < n->req()) {
2429 stack.set_index(idx + 1);
2430 Node* def = n->in(idx);
2431 if (def == NULL__null) {
2432 continue; // ignore dead path
2433 } else if (def->is_Phi()) { // inner node
2434 Node* new_phi = node_map[n->_idx];
2435 if (!visited.test_set(def->_idx)) { // not visited yet
2436 node_map.map(def->_idx, new PhiNode(def->in(0), t));
2437 stack.push(def, 1); // ignore control
2438 }
2439 Node* new_in = node_map[def->_idx];
2440 new_phi->set_req(idx, new_in);
2441 } else if (def->Opcode() == Op_VectorBox) { // leaf
2442 assert(n->is_Phi(), "not a phi")do { if (!(n->is_Phi())) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 2442, "assert(" "n->is_Phi()" ") failed", "not a phi"); ::
breakpoint(); } } while (0)
;
2443 Node* new_phi = node_map[n->_idx];
2444 new_phi->set_req(idx, def->in(c));
2445 } else {
2446 assert(false, "not optimizeable")do { if (!(false)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 2446, "assert(" "false" ") failed", "not optimizeable"); ::
breakpoint(); } } while (0)
;
2447 return NULL__null;
2448 }
2449 } else {
2450 Node* new_phi = node_map[n->_idx];
2451 igvn->register_new_node_with_optimizer(new_phi, n);
2452 stack.pop();
2453 }
2454 }
2455 return new_phi;
2456}
2457
2458Node* PhiNode::merge_through_phi(Node* root_phi, PhaseIterGVN* igvn) {
2459 Node_Stack stack(1);
2460 VectorSet visited;
2461
2462 stack.push(root_phi, 1); // ignore control
2463 visited.set(root_phi->_idx);
2464
2465 VectorBoxNode* cached_vbox = NULL__null;
2466 while (stack.is_nonempty()) {
2467 Node* n = stack.node();
2468 uint idx = stack.index();
2469 if (idx < n->req()) {
2470 stack.set_index(idx + 1);
2471 Node* in = n->in(idx);
2472 if (in == NULL__null) {
2473 continue; // ignore dead path
2474 } else if (in->isa_Phi()) {
2475 if (!visited.test_set(in->_idx)) {
2476 stack.push(in, 1); // ignore control
2477 }
2478 } else if (in->Opcode() == Op_VectorBox) {
2479 VectorBoxNode* vbox = static_cast<VectorBoxNode*>(in);
2480 if (cached_vbox == NULL__null) {
2481 cached_vbox = vbox;
2482 } else if (vbox->vec_type() != cached_vbox->vec_type()) {
2483 // TODO: vector type mismatch can be handled with additional reinterpret casts
2484 assert(Type::cmp(vbox->vec_type(), cached_vbox->vec_type()) != 0, "inconsistent")do { if (!(Type::cmp(vbox->vec_type(), cached_vbox->vec_type
()) != 0)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 2484, "assert(" "Type::cmp(vbox->vec_type(), cached_vbox->vec_type()) != 0"
") failed", "inconsistent"); ::breakpoint(); } } while (0)
;
2485 return NULL__null; // not optimizable: vector type mismatch
2486 } else if (vbox->box_type() != cached_vbox->box_type()) {
2487 assert(Type::cmp(vbox->box_type(), cached_vbox->box_type()) != 0, "inconsistent")do { if (!(Type::cmp(vbox->box_type(), cached_vbox->box_type
()) != 0)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 2487, "assert(" "Type::cmp(vbox->box_type(), cached_vbox->box_type()) != 0"
") failed", "inconsistent"); ::breakpoint(); } } while (0)
;
2488 return NULL__null; // not optimizable: box type mismatch
2489 }
2490 } else {
2491 return NULL__null; // not optimizable: neither Phi nor VectorBox
2492 }
2493 } else {
2494 stack.pop();
2495 }
2496 }
2497 assert(cached_vbox != NULL, "sanity")do { if (!(cached_vbox != __null)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 2497, "assert(" "cached_vbox != __null" ") failed", "sanity"
); ::breakpoint(); } } while (0)
;
2498 const TypeInstPtr* btype = cached_vbox->box_type();
2499 const TypeVect* vtype = cached_vbox->vec_type();
2500 Node* new_vbox_phi = clone_through_phi(root_phi, btype, VectorBoxNode::Box, igvn);
2501 Node* new_vect_phi = clone_through_phi(root_phi, vtype, VectorBoxNode::Value, igvn);
2502 return new VectorBoxNode(igvn->C, new_vbox_phi, new_vect_phi, btype, vtype);
2503}
2504
2505bool PhiNode::is_data_loop(RegionNode* r, Node* uin, const PhaseGVN* phase) {
2506 // First, take the short cut when we know it is a loop and the EntryControl data path is dead.
2507 // The loop node may only have one input because the entry path was removed in PhaseIdealLoop::Dominators().
2508 // Then, check if there is a data loop when the phi references itself directly or through other data nodes.
2509 assert(!r->is_Loop() || r->req() <= 3, "Loop node should have 3 or less inputs")do { if (!(!r->is_Loop() || r->req() <= 3)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 2509, "assert(" "!r->is_Loop() || r->req() <= 3" ") failed"
, "Loop node should have 3 or less inputs"); ::breakpoint(); }
} while (0)
;
2510 const bool is_loop = (r->is_Loop() && r->req() == 3);
2511 const Node* top = phase->C->top();
2512 if (is_loop) {
2513 return !uin->eqv_uncast(in(LoopNode::EntryControl));
2514 } else {
2515 // We have a data loop either with an unsafe data reference or if a region is unreachable.
2516 return is_unsafe_data_reference(uin)
2517 || (r->req() == 3 && (r->in(1) != top && r->in(2) == top && r->is_unreachable_region(phase)));
2518 }
2519}
2520
2521//------------------------------is_tripcount-----------------------------------
2522bool PhiNode::is_tripcount(BasicType bt) const {
2523 return (in(0) != NULL__null && in(0)->is_BaseCountedLoop() &&
2524 in(0)->as_BaseCountedLoop()->bt() == bt &&
2525 in(0)->as_BaseCountedLoop()->phi() == this);
2526}
2527
2528//------------------------------out_RegMask------------------------------------
2529const RegMask &PhiNode::in_RegMask(uint i) const {
2530 return i ? out_RegMask() : RegMask::Empty;
2531}
2532
2533const RegMask &PhiNode::out_RegMask() const {
2534 uint ideal_reg = _type->ideal_reg();
2535 assert( ideal_reg != Node::NotAMachineReg, "invalid type at Phi" )do { if (!(ideal_reg != Node::NotAMachineReg)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 2535, "assert(" "ideal_reg != Node::NotAMachineReg" ") failed"
, "invalid type at Phi"); ::breakpoint(); } } while (0)
;
2536 if( ideal_reg == 0 ) return RegMask::Empty;
2537 assert(ideal_reg != Op_RegFlags, "flags register is not spillable")do { if (!(ideal_reg != Op_RegFlags)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/cfgnode.cpp"
, 2537, "assert(" "ideal_reg != Op_RegFlags" ") failed", "flags register is not spillable"
); ::breakpoint(); } } while (0)
;
2538 return *(Compile::current()->matcher()->idealreg2spillmask[ideal_reg]);
2539}
2540
2541#ifndef PRODUCT
2542void PhiNode::related(GrowableArray<Node*> *in_rel, GrowableArray<Node*> *out_rel, bool compact) const {
2543 // For a PhiNode, the set of related nodes includes all inputs till level 2,
2544 // and all outputs till level 1. In compact mode, inputs till level 1 are
2545 // collected.
2546 this->collect_nodes(in_rel, compact ? 1 : 2, false, false);
2547 this->collect_nodes(out_rel, -1, false, false);
2548}
2549
2550void PhiNode::dump_spec(outputStream *st) const {
2551 TypeNode::dump_spec(st);
2552 if (is_tripcount(T_INT) || is_tripcount(T_LONG)) {
2553 st->print(" #tripcount");
2554 }
2555}
2556#endif
2557
2558
2559//=============================================================================
2560const Type* GotoNode::Value(PhaseGVN* phase) const {
2561 // If the input is reachable, then we are executed.
2562 // If the input is not reachable, then we are not executed.
2563 return phase->type(in(0));
2564}
2565
2566Node* GotoNode::Identity(PhaseGVN* phase) {
2567 return in(0); // Simple copy of incoming control
2568}
2569
2570const RegMask &GotoNode::out_RegMask() const {
2571 return RegMask::Empty;
2572}
2573
2574#ifndef PRODUCT
2575//-----------------------------related-----------------------------------------
2576// The related nodes of a GotoNode are all inputs at level 1, as well as the
2577// outputs at level 1. This is regardless of compact mode.
2578void GotoNode::related(GrowableArray<Node*> *in_rel, GrowableArray<Node*> *out_rel, bool compact) const {
2579 this->collect_nodes(in_rel, 1, false, false);
2580 this->collect_nodes(out_rel, -1, false, false);
2581}
2582#endif
2583
2584
2585//=============================================================================
2586const RegMask &JumpNode::out_RegMask() const {
2587 return RegMask::Empty;
2588}
2589
2590#ifndef PRODUCT
2591//-----------------------------related-----------------------------------------
2592// The related nodes of a JumpNode are all inputs at level 1, as well as the
2593// outputs at level 2 (to include actual jump targets beyond projection nodes).
2594// This is regardless of compact mode.
2595void JumpNode::related(GrowableArray<Node*> *in_rel, GrowableArray<Node*> *out_rel, bool compact) const {
2596 this->collect_nodes(in_rel, 1, false, false);
2597 this->collect_nodes(out_rel, -2, false, false);
2598}
2599#endif
2600
2601//=============================================================================
2602const RegMask &JProjNode::out_RegMask() const {
2603 return RegMask::Empty;
2604}
2605
2606//=============================================================================
2607const RegMask &CProjNode::out_RegMask() const {
2608 return RegMask::Empty;
2609}
2610
2611
2612
2613//=============================================================================
2614
2615uint PCTableNode::hash() const { return Node::hash() + _size; }
2616bool PCTableNode::cmp( const Node &n ) const
2617{ return _size == ((PCTableNode&)n)._size; }
2618
2619const Type *PCTableNode::bottom_type() const {
2620 const Type** f = TypeTuple::fields(_size);
2621 for( uint i = 0; i < _size; i++ ) f[i] = Type::CONTROL;
2622 return TypeTuple::make(_size, f);
2623}
2624
2625//------------------------------Value------------------------------------------
2626// Compute the type of the PCTableNode. If reachable it is a tuple of
2627// Control, otherwise the table targets are not reachable
2628const Type* PCTableNode::Value(PhaseGVN* phase) const {
2629 if( phase->type(in(0)) == Type::CONTROL )
2630 return bottom_type();
2631 return Type::TOP; // All paths dead? Then so are we
2632}
2633
2634//------------------------------Ideal------------------------------------------
2635// Return a node which is more "ideal" than the current node. Strip out
2636// control copies
2637Node *PCTableNode::Ideal(PhaseGVN *phase, bool can_reshape) {
2638 return remove_dead_region(phase, can_reshape) ? this : NULL__null;
2639}
2640
2641//=============================================================================
2642uint JumpProjNode::hash() const {
2643 return Node::hash() + _dest_bci;
2644}
2645
2646bool JumpProjNode::cmp( const Node &n ) const {
2647 return ProjNode::cmp(n) &&
2648 _dest_bci == ((JumpProjNode&)n)._dest_bci;
2649}
2650
2651#ifndef PRODUCT
2652void JumpProjNode::dump_spec(outputStream *st) const {
2653 ProjNode::dump_spec(st);
2654 st->print("@bci %d ",_dest_bci);
2655}
2656
2657void JumpProjNode::dump_compact_spec(outputStream *st) const {
2658 ProjNode::dump_compact_spec(st);
2659 st->print("(%d)%d@%d", _switch_val, _proj_no, _dest_bci);
2660}
2661
2662void JumpProjNode::related(GrowableArray<Node*> *in_rel, GrowableArray<Node*> *out_rel, bool compact) const {
2663 // The related nodes of a JumpProjNode are its inputs and outputs at level 1.
2664 this->collect_nodes(in_rel, 1, false, false);
2665 this->collect_nodes(out_rel, -1, false, false);
2666}
2667#endif
2668
2669//=============================================================================
2670//------------------------------Value------------------------------------------
2671// Check for being unreachable, or for coming from a Rethrow. Rethrow's cannot
2672// have the default "fall_through_index" path.
2673const Type* CatchNode::Value(PhaseGVN* phase) const {
2674 // Unreachable? Then so are all paths from here.
2675 if( phase->type(in(0)) == Type::TOP ) return Type::TOP;
2676 // First assume all paths are reachable
2677 const Type** f = TypeTuple::fields(_size);
2678 for( uint i = 0; i < _size; i++ ) f[i] = Type::CONTROL;
2679 // Identify cases that will always throw an exception
2680 // () rethrow call
2681 // () virtual or interface call with NULL receiver
2682 // () call is a check cast with incompatible arguments
2683 if( in(1)->is_Proj() ) {
2684 Node *i10 = in(1)->in(0);
2685 if( i10->is_Call() ) {
2686 CallNode *call = i10->as_Call();
2687 // Rethrows always throw exceptions, never return
2688 if (call->entry_point() == OptoRuntime::rethrow_stub()) {
2689 f[CatchProjNode::fall_through_index] = Type::TOP;
2690 } else if( call->req() > TypeFunc::Parms ) {
2691 const Type *arg0 = phase->type( call->in(TypeFunc::Parms) );
2692 // Check for null receiver to virtual or interface calls
2693 if( call->is_CallDynamicJava() &&
2694 arg0->higher_equal(TypePtr::NULL_PTR) ) {
2695 f[CatchProjNode::fall_through_index] = Type::TOP;
2696 }
2697 } // End of if not a runtime stub
2698 } // End of if have call above me
2699 } // End of slot 1 is not a projection
2700 return TypeTuple::make(_size, f);
2701}
2702
2703//=============================================================================
2704uint CatchProjNode::hash() const {
2705 return Node::hash() + _handler_bci;
2706}
2707
2708
2709bool CatchProjNode::cmp( const Node &n ) const {
2710 return ProjNode::cmp(n) &&
2711 _handler_bci == ((CatchProjNode&)n)._handler_bci;
2712}
2713
2714
2715//------------------------------Identity---------------------------------------
2716// If only 1 target is possible, choose it if it is the main control
2717Node* CatchProjNode::Identity(PhaseGVN* phase) {
2718 // If my value is control and no other value is, then treat as ID
2719 const TypeTuple *t = phase->type(in(0))->is_tuple();
2720 if (t->field_at(_con) != Type::CONTROL) return this;
2721 // If we remove the last CatchProj and elide the Catch/CatchProj, then we
2722 // also remove any exception table entry. Thus we must know the call
2723 // feeding the Catch will not really throw an exception. This is ok for
2724 // the main fall-thru control (happens when we know a call can never throw
2725 // an exception) or for "rethrow", because a further optimization will
2726 // yank the rethrow (happens when we inline a function that can throw an
2727 // exception and the caller has no handler). Not legal, e.g., for passing
2728 // a NULL receiver to a v-call, or passing bad types to a slow-check-cast.
2729 // These cases MUST throw an exception via the runtime system, so the VM
2730 // will be looking for a table entry.
2731 Node *proj = in(0)->in(1); // Expect a proj feeding CatchNode
2732 CallNode *call;
2733 if (_con != TypeFunc::Control && // Bail out if not the main control.
2734 !(proj->is_Proj() && // AND NOT a rethrow
2735 proj->in(0)->is_Call() &&
2736 (call = proj->in(0)->as_Call()) &&
2737 call->entry_point() == OptoRuntime::rethrow_stub()))
2738 return this;
2739
2740 // Search for any other path being control
2741 for (uint i = 0; i < t->cnt(); i++) {
2742 if (i != _con && t->field_at(i) == Type::CONTROL)
2743 return this;
2744 }
2745 // Only my path is possible; I am identity on control to the jump
2746 return in(0)->in(0);
2747}
2748
2749
2750#ifndef PRODUCT
2751void CatchProjNode::dump_spec(outputStream *st) const {
2752 ProjNode::dump_spec(st);
2753 st->print("@bci %d ",_handler_bci);
2754}
2755#endif
2756
2757//=============================================================================
2758//------------------------------Identity---------------------------------------
2759// Check for CreateEx being Identity.
2760Node* CreateExNode::Identity(PhaseGVN* phase) {
2761 if( phase->type(in(1)) == Type::TOP ) return in(1);
2762 if( phase->type(in(0)) == Type::TOP ) return in(0);
2763 // We only come from CatchProj, unless the CatchProj goes away.
2764 // If the CatchProj is optimized away, then we just carry the
2765 // exception oop through.
2766 CallNode *call = in(1)->in(0)->as_Call();
2767
2768 return ( in(0)->is_CatchProj() && in(0)->in(0)->in(1) == in(1) )
2769 ? this
2770 : call->in(TypeFunc::Parms);
2771}
2772
2773//=============================================================================
2774//------------------------------Value------------------------------------------
2775// Check for being unreachable.
2776const Type* NeverBranchNode::Value(PhaseGVN* phase) const {
2777 if (!in(0) || in(0)->is_top()) return Type::TOP;
2778 return bottom_type();
2779}
2780
2781//------------------------------Ideal------------------------------------------
2782// Check for no longer being part of a loop
2783Node *NeverBranchNode::Ideal(PhaseGVN *phase, bool can_reshape) {
2784 if (can_reshape && !in(0)->is_Region()) {
2785 // Dead code elimination can sometimes delete this projection so
2786 // if it's not there, there's nothing to do.
2787 Node* fallthru = proj_out_or_null(0);
2788 if (fallthru != NULL__null) {
2789 phase->is_IterGVN()->replace_node(fallthru, in(0));
2790 }
2791 return phase->C->top();
2792 }
2793 return NULL__null;
2794}
2795
2796#ifndef PRODUCT
2797void NeverBranchNode::format( PhaseRegAlloc *ra_, outputStream *st) const {
2798 st->print("%s", Name());
2799}
2800#endif