Bug Summary

File:jdk/src/hotspot/share/opto/loopopts.cpp
Warning:line 2243, column 9
Value stored to 'dict' 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 loopopts.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/loopopts.cpp
1/*
2 * Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#include "precompiled.hpp"
26#include "gc/shared/barrierSet.hpp"
27#include "gc/shared/c2/barrierSetC2.hpp"
28#include "memory/allocation.inline.hpp"
29#include "memory/resourceArea.hpp"
30#include "opto/addnode.hpp"
31#include "opto/callnode.hpp"
32#include "opto/castnode.hpp"
33#include "opto/connode.hpp"
34#include "opto/castnode.hpp"
35#include "opto/divnode.hpp"
36#include "opto/loopnode.hpp"
37#include "opto/matcher.hpp"
38#include "opto/mulnode.hpp"
39#include "opto/movenode.hpp"
40#include "opto/opaquenode.hpp"
41#include "opto/rootnode.hpp"
42#include "opto/subnode.hpp"
43#include "opto/subtypenode.hpp"
44#include "utilities/macros.hpp"
45
46//=============================================================================
47//------------------------------split_thru_phi---------------------------------
48// Split Node 'n' through merge point if there is enough win.
49Node* PhaseIdealLoop::split_thru_phi(Node* n, Node* region, int policy) {
50 if (n->Opcode() == Op_ConvI2L && n->bottom_type() != TypeLong::LONG) {
51 // ConvI2L may have type information on it which is unsafe to push up
52 // so disable this for now
53 return NULL__null;
54 }
55
56 // Splitting range check CastIIs through a loop induction Phi can
57 // cause new Phis to be created that are left unrelated to the loop
58 // induction Phi and prevent optimizations (vectorization)
59 if (n->Opcode() == Op_CastII && region->is_CountedLoop() &&
60 n->in(1) == region->as_CountedLoop()->phi()) {
61 return NULL__null;
62 }
63
64 // Bail out if 'n' is a Div or Mod node whose zero check was removed earlier (i.e. control is NULL) and its divisor is an induction variable
65 // phi p of a trip-counted (integer) loop whose inputs could be zero (include zero in their type range). p could have a more precise type
66 // range that does not necessarily include all values of its inputs. Since each of these inputs will be a divisor of the newly cloned nodes
67 // of 'n', we need to bail out of one of these divisors could be zero (zero in its type range).
68 if ((n->Opcode() == Op_DivI || n->Opcode() == Op_ModI) && n->in(0) == NULL__null
69 && region->is_CountedLoop() && n->in(2) == region->as_CountedLoop()->phi()) {
70 Node* phi = region->as_CountedLoop()->phi();
71 for (uint i = 1; i < phi->req(); i++) {
72 if (_igvn.type(phi->in(i))->filter_speculative(TypeInt::ZERO) != Type::TOP) {
73 // Zero could be a possible value but we already removed the zero check. Bail out to avoid a possible division by zero at a later point.
74 return NULL__null;
75 }
76 }
77 }
78
79 int wins = 0;
80 assert(!n->is_CFG(), "")do { if (!(!n->is_CFG())) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 80, "assert(" "!n->is_CFG()" ") failed", ""); ::breakpoint
(); } } while (0)
;
81 assert(region->is_Region(), "")do { if (!(region->is_Region())) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 81, "assert(" "region->is_Region()" ") failed", ""); ::breakpoint
(); } } while (0)
;
82
83 const Type* type = n->bottom_type();
84 const TypeOopPtr* t_oop = _igvn.type(n)->isa_oopptr();
85 Node* phi;
86 if (t_oop != NULL__null && t_oop->is_known_instance_field()) {
87 int iid = t_oop->instance_id();
88 int index = C->get_alias_index(t_oop);
89 int offset = t_oop->offset();
90 phi = new PhiNode(region, type, NULL__null, iid, index, offset);
91 } else {
92 phi = PhiNode::make_blank(region, n);
93 }
94 uint old_unique = C->unique();
95 for (uint i = 1; i < region->req(); i++) {
96 Node* x;
97 Node* the_clone = NULL__null;
98 if (region->in(i) == C->top()) {
99 x = C->top(); // Dead path? Use a dead data op
100 } else {
101 x = n->clone(); // Else clone up the data op
102 the_clone = x; // Remember for possible deletion.
103 // Alter data node to use pre-phi inputs
104 if (n->in(0) == region)
105 x->set_req( 0, region->in(i) );
106 for (uint j = 1; j < n->req(); j++) {
107 Node* in = n->in(j);
108 if (in->is_Phi() && in->in(0) == region)
109 x->set_req(j, in->in(i)); // Use pre-Phi input for the clone
110 }
111 }
112 // Check for a 'win' on some paths
113 const Type* t = x->Value(&_igvn);
114
115 bool singleton = t->singleton();
116
117 // A TOP singleton indicates that there are no possible values incoming
118 // along a particular edge. In most cases, this is OK, and the Phi will
119 // be eliminated later in an Ideal call. However, we can't allow this to
120 // happen if the singleton occurs on loop entry, as the elimination of
121 // the PhiNode may cause the resulting node to migrate back to a previous
122 // loop iteration.
123 if (singleton && t == Type::TOP) {
124 // Is_Loop() == false does not confirm the absence of a loop (e.g., an
125 // irreducible loop may not be indicated by an affirmative is_Loop());
126 // therefore, the only top we can split thru a phi is on a backedge of
127 // a loop.
128 singleton &= region->is_Loop() && (i != LoopNode::EntryControl);
129 }
130
131 if (singleton) {
132 wins++;
133 x = ((PhaseGVN&)_igvn).makecon(t);
134 } else {
135 // We now call Identity to try to simplify the cloned node.
136 // Note that some Identity methods call phase->type(this).
137 // Make sure that the type array is big enough for
138 // our new node, even though we may throw the node away.
139 // (Note: This tweaking with igvn only works because x is a new node.)
140 _igvn.set_type(x, t);
141 // If x is a TypeNode, capture any more-precise type permanently into Node
142 // otherwise it will be not updated during igvn->transform since
143 // igvn->type(x) is set to x->Value() already.
144 x->raise_bottom_type(t);
145 Node* y = x->Identity(&_igvn);
146 if (y != x) {
147 wins++;
148 x = y;
149 } else {
150 y = _igvn.hash_find(x);
151 if (y) {
152 wins++;
153 x = y;
154 } else {
155 // Else x is a new node we are keeping
156 // We do not need register_new_node_with_optimizer
157 // because set_type has already been called.
158 _igvn._worklist.push(x);
159 }
160 }
161 }
162 if (x != the_clone && the_clone != NULL__null)
163 _igvn.remove_dead_node(the_clone);
164 phi->set_req( i, x );
165 }
166 // Too few wins?
167 if (wins <= policy) {
168 _igvn.remove_dead_node(phi);
169 return NULL__null;
170 }
171
172 // Record Phi
173 register_new_node( phi, region );
174
175 for (uint i2 = 1; i2 < phi->req(); i2++) {
176 Node *x = phi->in(i2);
177 // If we commoned up the cloned 'x' with another existing Node,
178 // the existing Node picks up a new use. We need to make the
179 // existing Node occur higher up so it dominates its uses.
180 Node *old_ctrl;
181 IdealLoopTree *old_loop;
182
183 if (x->is_Con()) {
184 // Constant's control is always root.
185 set_ctrl(x, C->root());
186 continue;
187 }
188 // The occasional new node
189 if (x->_idx >= old_unique) { // Found a new, unplaced node?
190 old_ctrl = NULL__null;
191 old_loop = NULL__null; // Not in any prior loop
192 } else {
193 old_ctrl = get_ctrl(x);
194 old_loop = get_loop(old_ctrl); // Get prior loop
195 }
196 // New late point must dominate new use
197 Node *new_ctrl = dom_lca(old_ctrl, region->in(i2));
198 if (new_ctrl == old_ctrl) // Nothing is changed
199 continue;
200
201 IdealLoopTree *new_loop = get_loop(new_ctrl);
202
203 // Don't move x into a loop if its uses are
204 // outside of loop. Otherwise x will be cloned
205 // for each use outside of this loop.
206 IdealLoopTree *use_loop = get_loop(region);
207 if (!new_loop->is_member(use_loop) &&
208 (old_loop == NULL__null || !new_loop->is_member(old_loop))) {
209 // Take early control, later control will be recalculated
210 // during next iteration of loop optimizations.
211 new_ctrl = get_early_ctrl(x);
212 new_loop = get_loop(new_ctrl);
213 }
214 // Set new location
215 set_ctrl(x, new_ctrl);
216 // If changing loop bodies, see if we need to collect into new body
217 if (old_loop != new_loop) {
218 if (old_loop && !old_loop->_child)
219 old_loop->_body.yank(x);
220 if (!new_loop->_child)
221 new_loop->_body.push(x); // Collect body info
222 }
223 }
224
225 return phi;
226}
227
228//------------------------------dominated_by------------------------------------
229// Replace the dominated test with an obvious true or false. Place it on the
230// IGVN worklist for later cleanup. Move control-dependent data Nodes on the
231// live path up to the dominating control.
232void PhaseIdealLoop::dominated_by( Node *prevdom, Node *iff, bool flip, bool exclude_loop_predicate ) {
233 if (VerifyLoopOptimizations && PrintOpto) { tty->print_cr("dominating test"); }
234
235 // prevdom is the dominating projection of the dominating test.
236 assert(iff->is_If(), "must be")do { if (!(iff->is_If())) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 236, "assert(" "iff->is_If()" ") failed", "must be"); ::
breakpoint(); } } while (0)
;
237 assert(iff->Opcode() == Op_If ||do { if (!(iff->Opcode() == Op_If || iff->Opcode() == Op_CountedLoopEnd
|| iff->Opcode() == Op_LongCountedLoopEnd || iff->Opcode
() == Op_RangeCheck)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 241, "assert(" "iff->Opcode() == Op_If || iff->Opcode() == Op_CountedLoopEnd || iff->Opcode() == Op_LongCountedLoopEnd || iff->Opcode() == Op_RangeCheck"
") failed", "Check this code when new subtype is added"); ::
breakpoint(); } } while (0)
238 iff->Opcode() == Op_CountedLoopEnd ||do { if (!(iff->Opcode() == Op_If || iff->Opcode() == Op_CountedLoopEnd
|| iff->Opcode() == Op_LongCountedLoopEnd || iff->Opcode
() == Op_RangeCheck)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 241, "assert(" "iff->Opcode() == Op_If || iff->Opcode() == Op_CountedLoopEnd || iff->Opcode() == Op_LongCountedLoopEnd || iff->Opcode() == Op_RangeCheck"
") failed", "Check this code when new subtype is added"); ::
breakpoint(); } } while (0)
239 iff->Opcode() == Op_LongCountedLoopEnd ||do { if (!(iff->Opcode() == Op_If || iff->Opcode() == Op_CountedLoopEnd
|| iff->Opcode() == Op_LongCountedLoopEnd || iff->Opcode
() == Op_RangeCheck)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 241, "assert(" "iff->Opcode() == Op_If || iff->Opcode() == Op_CountedLoopEnd || iff->Opcode() == Op_LongCountedLoopEnd || iff->Opcode() == Op_RangeCheck"
") failed", "Check this code when new subtype is added"); ::
breakpoint(); } } while (0)
240 iff->Opcode() == Op_RangeCheck,do { if (!(iff->Opcode() == Op_If || iff->Opcode() == Op_CountedLoopEnd
|| iff->Opcode() == Op_LongCountedLoopEnd || iff->Opcode
() == Op_RangeCheck)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 241, "assert(" "iff->Opcode() == Op_If || iff->Opcode() == Op_CountedLoopEnd || iff->Opcode() == Op_LongCountedLoopEnd || iff->Opcode() == Op_RangeCheck"
") failed", "Check this code when new subtype is added"); ::
breakpoint(); } } while (0)
241 "Check this code when new subtype is added")do { if (!(iff->Opcode() == Op_If || iff->Opcode() == Op_CountedLoopEnd
|| iff->Opcode() == Op_LongCountedLoopEnd || iff->Opcode
() == Op_RangeCheck)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 241, "assert(" "iff->Opcode() == Op_If || iff->Opcode() == Op_CountedLoopEnd || iff->Opcode() == Op_LongCountedLoopEnd || iff->Opcode() == Op_RangeCheck"
") failed", "Check this code when new subtype is added"); ::
breakpoint(); } } while (0)
;
242
243 int pop = prevdom->Opcode();
244 assert( pop == Op_IfFalse || pop == Op_IfTrue, "" )do { if (!(pop == Op_IfFalse || pop == Op_IfTrue)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 244, "assert(" "pop == Op_IfFalse || pop == Op_IfTrue" ") failed"
, ""); ::breakpoint(); } } while (0)
;
245 if (flip) {
246 if (pop == Op_IfTrue)
247 pop = Op_IfFalse;
248 else
249 pop = Op_IfTrue;
250 }
251 // 'con' is set to true or false to kill the dominated test.
252 Node *con = _igvn.makecon(pop == Op_IfTrue ? TypeInt::ONE : TypeInt::ZERO);
253 set_ctrl(con, C->root()); // Constant gets a new use
254 // Hack the dominated test
255 _igvn.replace_input_of(iff, 1, con);
256
257 // If I dont have a reachable TRUE and FALSE path following the IfNode then
258 // I can assume this path reaches an infinite loop. In this case it's not
259 // important to optimize the data Nodes - either the whole compilation will
260 // be tossed or this path (and all data Nodes) will go dead.
261 if (iff->outcnt() != 2) return;
262
263 // Make control-dependent data Nodes on the live path (path that will remain
264 // once the dominated IF is removed) become control-dependent on the
265 // dominating projection.
266 Node* dp = iff->as_If()->proj_out_or_null(pop == Op_IfTrue);
267
268 // Loop predicates may have depending checks which should not
269 // be skipped. For example, range check predicate has two checks
270 // for lower and upper bounds.
271 if (dp == NULL__null)
272 return;
273
274 ProjNode* dp_proj = dp->as_Proj();
275 ProjNode* unc_proj = iff->as_If()->proj_out(1 - dp_proj->_con)->as_Proj();
276 if (exclude_loop_predicate &&
277 (unc_proj->is_uncommon_trap_proj(Deoptimization::Reason_predicate) != NULL__null ||
278 unc_proj->is_uncommon_trap_proj(Deoptimization::Reason_profile_predicate) != NULL__null ||
279 unc_proj->is_uncommon_trap_proj(Deoptimization::Reason_range_check) != NULL__null)) {
280 // If this is a range check (IfNode::is_range_check), do not
281 // reorder because Compile::allow_range_check_smearing might have
282 // changed the check.
283 return; // Let IGVN transformation change control dependence.
284 }
285
286 IdealLoopTree* old_loop = get_loop(dp);
287
288 for (DUIterator_Fast imax, i = dp->fast_outs(imax); i < imax; i++) {
289 Node* cd = dp->fast_out(i); // Control-dependent node
290 // Do not rewire Div and Mod nodes which could have a zero divisor to avoid skipping their zero check.
291 if (cd->depends_only_on_test() && _igvn.no_dependent_zero_check(cd)) {
292 assert(cd->in(0) == dp, "")do { if (!(cd->in(0) == dp)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 292, "assert(" "cd->in(0) == dp" ") failed", ""); ::breakpoint
(); } } while (0)
;
293 _igvn.replace_input_of(cd, 0, prevdom);
294 set_early_ctrl(cd, false);
295 IdealLoopTree* new_loop = get_loop(get_ctrl(cd));
296 if (old_loop != new_loop) {
297 if (!old_loop->_child) {
298 old_loop->_body.yank(cd);
299 }
300 if (!new_loop->_child) {
301 new_loop->_body.push(cd);
302 }
303 }
304 --i;
305 --imax;
306 }
307 }
308}
309
310//------------------------------has_local_phi_input----------------------------
311// Return TRUE if 'n' has Phi inputs from its local block and no other
312// block-local inputs (all non-local-phi inputs come from earlier blocks)
313Node *PhaseIdealLoop::has_local_phi_input( Node *n ) {
314 Node *n_ctrl = get_ctrl(n);
315 // See if some inputs come from a Phi in this block, or from before
316 // this block.
317 uint i;
318 for( i = 1; i < n->req(); i++ ) {
319 Node *phi = n->in(i);
320 if( phi->is_Phi() && phi->in(0) == n_ctrl )
321 break;
322 }
323 if( i >= n->req() )
324 return NULL__null; // No Phi inputs; nowhere to clone thru
325
326 // Check for inputs created between 'n' and the Phi input. These
327 // must split as well; they have already been given the chance
328 // (courtesy of a post-order visit) and since they did not we must
329 // recover the 'cost' of splitting them by being very profitable
330 // when splitting 'n'. Since this is unlikely we simply give up.
331 for( i = 1; i < n->req(); i++ ) {
332 Node *m = n->in(i);
333 if( get_ctrl(m) == n_ctrl && !m->is_Phi() ) {
334 // We allow the special case of AddP's with no local inputs.
335 // This allows us to split-up address expressions.
336 if (m->is_AddP() &&
337 get_ctrl(m->in(2)) != n_ctrl &&
338 get_ctrl(m->in(3)) != n_ctrl) {
339 // Move the AddP up to dominating point
340 Node* c = find_non_split_ctrl(idom(n_ctrl));
341 if (c->is_OuterStripMinedLoop()) {
342 c->as_Loop()->verify_strip_mined(1);
343 c = c->in(LoopNode::EntryControl);
344 }
345 set_ctrl_and_loop(m, c);
346 continue;
347 }
348 return NULL__null;
349 }
350 assert(n->is_Phi() || m->is_Phi() || is_dominator(get_ctrl(m), n_ctrl), "m has strange control")do { if (!(n->is_Phi() || m->is_Phi() || is_dominator(get_ctrl
(m), n_ctrl))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 350, "assert(" "n->is_Phi() || m->is_Phi() || is_dominator(get_ctrl(m), n_ctrl)"
") failed", "m has strange control"); ::breakpoint(); } } while
(0)
;
351 }
352
353 return n_ctrl;
354}
355
356//------------------------------remix_address_expressions----------------------
357// Rework addressing expressions to get the most loop-invariant stuff
358// moved out. We'd like to do all associative operators, but it's especially
359// important (common) to do address expressions.
360Node *PhaseIdealLoop::remix_address_expressions( Node *n ) {
361 if (!has_ctrl(n)) return NULL__null;
362 Node *n_ctrl = get_ctrl(n);
363 IdealLoopTree *n_loop = get_loop(n_ctrl);
364
365 // See if 'n' mixes loop-varying and loop-invariant inputs and
366 // itself is loop-varying.
367
368 // Only interested in binary ops (and AddP)
369 if( n->req() < 3 || n->req() > 4 ) return NULL__null;
370
371 Node *n1_ctrl = get_ctrl(n->in( 1));
372 Node *n2_ctrl = get_ctrl(n->in( 2));
373 Node *n3_ctrl = get_ctrl(n->in(n->req() == 3 ? 2 : 3));
374 IdealLoopTree *n1_loop = get_loop( n1_ctrl );
375 IdealLoopTree *n2_loop = get_loop( n2_ctrl );
376 IdealLoopTree *n3_loop = get_loop( n3_ctrl );
377
378 // Does one of my inputs spin in a tighter loop than self?
379 if( (n_loop->is_member( n1_loop ) && n_loop != n1_loop) ||
380 (n_loop->is_member( n2_loop ) && n_loop != n2_loop) ||
381 (n_loop->is_member( n3_loop ) && n_loop != n3_loop) )
382 return NULL__null; // Leave well enough alone
383
384 // Is at least one of my inputs loop-invariant?
385 if( n1_loop == n_loop &&
386 n2_loop == n_loop &&
387 n3_loop == n_loop )
388 return NULL__null; // No loop-invariant inputs
389
390
391 int n_op = n->Opcode();
392
393 // Replace expressions like ((V+I) << 2) with (V<<2 + I<<2).
394 if( n_op == Op_LShiftI ) {
395 // Scale is loop invariant
396 Node *scale = n->in(2);
397 Node *scale_ctrl = get_ctrl(scale);
398 IdealLoopTree *scale_loop = get_loop(scale_ctrl );
399 if( n_loop == scale_loop || !scale_loop->is_member( n_loop ) )
400 return NULL__null;
401 const TypeInt *scale_t = scale->bottom_type()->isa_int();
402 if( scale_t && scale_t->is_con() && scale_t->get_con() >= 16 )
403 return NULL__null; // Dont bother with byte/short masking
404 // Add must vary with loop (else shift would be loop-invariant)
405 Node *add = n->in(1);
406 Node *add_ctrl = get_ctrl(add);
407 IdealLoopTree *add_loop = get_loop(add_ctrl);
408 //assert( n_loop == add_loop, "" );
409 if( n_loop != add_loop ) return NULL__null; // happens w/ evil ZKM loops
410
411 // Convert I-V into I+ (0-V); same for V-I
412 if( add->Opcode() == Op_SubI &&
413 _igvn.type( add->in(1) ) != TypeInt::ZERO ) {
414 Node *zero = _igvn.intcon(0);
415 set_ctrl(zero, C->root());
416 Node *neg = new SubINode( _igvn.intcon(0), add->in(2) );
417 register_new_node( neg, get_ctrl(add->in(2) ) );
418 add = new AddINode( add->in(1), neg );
419 register_new_node( add, add_ctrl );
420 }
421 if( add->Opcode() != Op_AddI ) return NULL__null;
422 // See if one add input is loop invariant
423 Node *add_var = add->in(1);
424 Node *add_var_ctrl = get_ctrl(add_var);
425 IdealLoopTree *add_var_loop = get_loop(add_var_ctrl );
426 Node *add_invar = add->in(2);
427 Node *add_invar_ctrl = get_ctrl(add_invar);
428 IdealLoopTree *add_invar_loop = get_loop(add_invar_ctrl );
429 if( add_var_loop == n_loop ) {
430 } else if( add_invar_loop == n_loop ) {
431 // Swap to find the invariant part
432 add_invar = add_var;
433 add_invar_ctrl = add_var_ctrl;
434 add_invar_loop = add_var_loop;
435 add_var = add->in(2);
436 Node *add_var_ctrl = get_ctrl(add_var);
437 IdealLoopTree *add_var_loop = get_loop(add_var_ctrl );
438 } else // Else neither input is loop invariant
439 return NULL__null;
440 if( n_loop == add_invar_loop || !add_invar_loop->is_member( n_loop ) )
441 return NULL__null; // No invariant part of the add?
442
443 // Yes! Reshape address expression!
444 Node *inv_scale = new LShiftINode( add_invar, scale );
445 Node *inv_scale_ctrl =
446 dom_depth(add_invar_ctrl) > dom_depth(scale_ctrl) ?
447 add_invar_ctrl : scale_ctrl;
448 register_new_node( inv_scale, inv_scale_ctrl );
449 Node *var_scale = new LShiftINode( add_var, scale );
450 register_new_node( var_scale, n_ctrl );
451 Node *var_add = new AddINode( var_scale, inv_scale );
452 register_new_node( var_add, n_ctrl );
453 _igvn.replace_node( n, var_add );
454 return var_add;
455 }
456
457 // Replace (I+V) with (V+I)
458 if( n_op == Op_AddI ||
459 n_op == Op_AddL ||
460 n_op == Op_AddF ||
461 n_op == Op_AddD ||
462 n_op == Op_MulI ||
463 n_op == Op_MulL ||
464 n_op == Op_MulF ||
465 n_op == Op_MulD ) {
466 if( n2_loop == n_loop ) {
467 assert( n1_loop != n_loop, "" )do { if (!(n1_loop != n_loop)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 467, "assert(" "n1_loop != n_loop" ") failed", ""); ::breakpoint
(); } } while (0)
;
468 n->swap_edges(1, 2);
469 }
470 }
471
472 // Replace ((I1 +p V) +p I2) with ((I1 +p I2) +p V),
473 // but not if I2 is a constant.
474 if( n_op == Op_AddP ) {
475 if( n2_loop == n_loop && n3_loop != n_loop ) {
476 if( n->in(2)->Opcode() == Op_AddP && !n->in(3)->is_Con() ) {
477 Node *n22_ctrl = get_ctrl(n->in(2)->in(2));
478 Node *n23_ctrl = get_ctrl(n->in(2)->in(3));
479 IdealLoopTree *n22loop = get_loop( n22_ctrl );
480 IdealLoopTree *n23_loop = get_loop( n23_ctrl );
481 if( n22loop != n_loop && n22loop->is_member(n_loop) &&
482 n23_loop == n_loop ) {
483 Node *add1 = new AddPNode( n->in(1), n->in(2)->in(2), n->in(3) );
484 // Stuff new AddP in the loop preheader
485 register_new_node( add1, n_loop->_head->in(LoopNode::EntryControl) );
486 Node *add2 = new AddPNode( n->in(1), add1, n->in(2)->in(3) );
487 register_new_node( add2, n_ctrl );
488 _igvn.replace_node( n, add2 );
489 return add2;
490 }
491 }
492 }
493
494 // Replace (I1 +p (I2 + V)) with ((I1 +p I2) +p V)
495 if (n2_loop != n_loop && n3_loop == n_loop) {
496 if (n->in(3)->Opcode() == Op_AddXOp_AddL) {
497 Node *V = n->in(3)->in(1);
498 Node *I = n->in(3)->in(2);
499 if (is_member(n_loop,get_ctrl(V))) {
500 } else {
501 Node *tmp = V; V = I; I = tmp;
502 }
503 if (!is_member(n_loop,get_ctrl(I))) {
504 Node *add1 = new AddPNode(n->in(1), n->in(2), I);
505 // Stuff new AddP in the loop preheader
506 register_new_node(add1, n_loop->_head->in(LoopNode::EntryControl));
507 Node *add2 = new AddPNode(n->in(1), add1, V);
508 register_new_node(add2, n_ctrl);
509 _igvn.replace_node(n, add2);
510 return add2;
511 }
512 }
513 }
514 }
515
516 return NULL__null;
517}
518
519// Optimize ((in1[2*i] * in2[2*i]) + (in1[2*i+1] * in2[2*i+1]))
520Node *PhaseIdealLoop::convert_add_to_muladd(Node* n) {
521 assert(n->Opcode() == Op_AddI, "sanity")do { if (!(n->Opcode() == Op_AddI)) { (*g_assert_poison) =
'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 521, "assert(" "n->Opcode() == Op_AddI" ") failed", "sanity"
); ::breakpoint(); } } while (0)
;
522 Node * nn = NULL__null;
523 Node * in1 = n->in(1);
524 Node * in2 = n->in(2);
525 if (in1->Opcode() == Op_MulI && in2->Opcode() == Op_MulI) {
526 IdealLoopTree* loop_n = get_loop(get_ctrl(n));
527 if (loop_n->is_counted() &&
528 loop_n->_head->as_Loop()->is_valid_counted_loop(T_INT) &&
529 Matcher::match_rule_supported(Op_MulAddVS2VI) &&
530 Matcher::match_rule_supported(Op_MulAddS2I)) {
531 Node* mul_in1 = in1->in(1);
532 Node* mul_in2 = in1->in(2);
533 Node* mul_in3 = in2->in(1);
534 Node* mul_in4 = in2->in(2);
535 if (mul_in1->Opcode() == Op_LoadS &&
536 mul_in2->Opcode() == Op_LoadS &&
537 mul_in3->Opcode() == Op_LoadS &&
538 mul_in4->Opcode() == Op_LoadS) {
539 IdealLoopTree* loop1 = get_loop(get_ctrl(mul_in1));
540 IdealLoopTree* loop2 = get_loop(get_ctrl(mul_in2));
541 IdealLoopTree* loop3 = get_loop(get_ctrl(mul_in3));
542 IdealLoopTree* loop4 = get_loop(get_ctrl(mul_in4));
543 IdealLoopTree* loop5 = get_loop(get_ctrl(in1));
544 IdealLoopTree* loop6 = get_loop(get_ctrl(in2));
545 // All nodes should be in the same counted loop.
546 if (loop_n == loop1 && loop_n == loop2 && loop_n == loop3 &&
547 loop_n == loop4 && loop_n == loop5 && loop_n == loop6) {
548 Node* adr1 = mul_in1->in(MemNode::Address);
549 Node* adr2 = mul_in2->in(MemNode::Address);
550 Node* adr3 = mul_in3->in(MemNode::Address);
551 Node* adr4 = mul_in4->in(MemNode::Address);
552 if (adr1->is_AddP() && adr2->is_AddP() && adr3->is_AddP() && adr4->is_AddP()) {
553 if ((adr1->in(AddPNode::Base) == adr3->in(AddPNode::Base)) &&
554 (adr2->in(AddPNode::Base) == adr4->in(AddPNode::Base))) {
555 nn = new MulAddS2INode(mul_in1, mul_in2, mul_in3, mul_in4);
556 register_new_node(nn, get_ctrl(n));
557 _igvn.replace_node(n, nn);
558 return nn;
559 } else if ((adr1->in(AddPNode::Base) == adr4->in(AddPNode::Base)) &&
560 (adr2->in(AddPNode::Base) == adr3->in(AddPNode::Base))) {
561 nn = new MulAddS2INode(mul_in1, mul_in2, mul_in4, mul_in3);
562 register_new_node(nn, get_ctrl(n));
563 _igvn.replace_node(n, nn);
564 return nn;
565 }
566 }
567 }
568 }
569 }
570 }
571 return nn;
572}
573
574//------------------------------conditional_move-------------------------------
575// Attempt to replace a Phi with a conditional move. We have some pretty
576// strict profitability requirements. All Phis at the merge point must
577// be converted, so we can remove the control flow. We need to limit the
578// number of c-moves to a small handful. All code that was in the side-arms
579// of the CFG diamond is now speculatively executed. This code has to be
580// "cheap enough". We are pretty much limited to CFG diamonds that merge
581// 1 or 2 items with a total of 1 or 2 ops executed speculatively.
582Node *PhaseIdealLoop::conditional_move( Node *region ) {
583
584 assert(region->is_Region(), "sanity check")do { if (!(region->is_Region())) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 584, "assert(" "region->is_Region()" ") failed", "sanity check"
); ::breakpoint(); } } while (0)
;
585 if (region->req() != 3) return NULL__null;
586
587 // Check for CFG diamond
588 Node *lp = region->in(1);
589 Node *rp = region->in(2);
590 if (!lp || !rp) return NULL__null;
591 Node *lp_c = lp->in(0);
592 if (lp_c == NULL__null || lp_c != rp->in(0) || !lp_c->is_If()) return NULL__null;
593 IfNode *iff = lp_c->as_If();
594
595 // Check for ops pinned in an arm of the diamond.
596 // Can't remove the control flow in this case
597 if (lp->outcnt() > 1) return NULL__null;
598 if (rp->outcnt() > 1) return NULL__null;
599
600 IdealLoopTree* r_loop = get_loop(region);
601 assert(r_loop == get_loop(iff), "sanity")do { if (!(r_loop == get_loop(iff))) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 601, "assert(" "r_loop == get_loop(iff)" ") failed", "sanity"
); ::breakpoint(); } } while (0)
;
602 // Always convert to CMOVE if all results are used only outside this loop.
603 bool used_inside_loop = (r_loop == _ltree_root);
604
605 // Check profitability
606 int cost = 0;
607 int phis = 0;
608 for (DUIterator_Fast imax, i = region->fast_outs(imax); i < imax; i++) {
609 Node *out = region->fast_out(i);
610 if (!out->is_Phi()) continue; // Ignore other control edges, etc
611 phis++;
612 PhiNode* phi = out->as_Phi();
613 BasicType bt = phi->type()->basic_type();
614 switch (bt) {
615 case T_DOUBLE:
616 case T_FLOAT:
617 if (C->use_cmove()) {
618 continue; //TODO: maybe we want to add some cost
619 }
620 cost += Matcher::float_cmove_cost(); // Could be very expensive
621 break;
622 case T_LONG: {
623 cost += Matcher::long_cmove_cost(); // May encodes as 2 CMOV's
624 }
625 case T_INT: // These all CMOV fine
626 case T_ADDRESS: { // (RawPtr)
627 cost++;
628 break;
629 }
630 case T_NARROWOOP: // Fall through
631 case T_OBJECT: { // Base oops are OK, but not derived oops
632 const TypeOopPtr *tp = phi->type()->make_ptr()->isa_oopptr();
633 // Derived pointers are Bad (tm): what's the Base (for GC purposes) of a
634 // CMOVE'd derived pointer? It's a CMOVE'd derived base. Thus
635 // CMOVE'ing a derived pointer requires we also CMOVE the base. If we
636 // have a Phi for the base here that we convert to a CMOVE all is well
637 // and good. But if the base is dead, we'll not make a CMOVE. Later
638 // the allocator will have to produce a base by creating a CMOVE of the
639 // relevant bases. This puts the allocator in the business of
640 // manufacturing expensive instructions, generally a bad plan.
641 // Just Say No to Conditionally-Moved Derived Pointers.
642 if (tp && tp->offset() != 0)
643 return NULL__null;
644 cost++;
645 break;
646 }
647 default:
648 return NULL__null; // In particular, can't do memory or I/O
649 }
650 // Add in cost any speculative ops
651 for (uint j = 1; j < region->req(); j++) {
652 Node *proj = region->in(j);
653 Node *inp = phi->in(j);
654 if (get_ctrl(inp) == proj) { // Found local op
655 cost++;
656 // Check for a chain of dependent ops; these will all become
657 // speculative in a CMOV.
658 for (uint k = 1; k < inp->req(); k++)
659 if (get_ctrl(inp->in(k)) == proj)
660 cost += ConditionalMoveLimit; // Too much speculative goo
661 }
662 }
663 // See if the Phi is used by a Cmp or Narrow oop Decode/Encode.
664 // This will likely Split-If, a higher-payoff operation.
665 for (DUIterator_Fast kmax, k = phi->fast_outs(kmax); k < kmax; k++) {
666 Node* use = phi->fast_out(k);
667 if (use->is_Cmp() || use->is_DecodeNarrowPtr() || use->is_EncodeNarrowPtr())
668 cost += ConditionalMoveLimit;
669 // Is there a use inside the loop?
670 // Note: check only basic types since CMoveP is pinned.
671 if (!used_inside_loop && is_java_primitive(bt)) {
672 IdealLoopTree* u_loop = get_loop(has_ctrl(use) ? get_ctrl(use) : use);
673 if (r_loop == u_loop || r_loop->is_member(u_loop)) {
674 used_inside_loop = true;
675 }
676 }
677 }
678 }//for
679 Node* bol = iff->in(1);
680 if (bol->Opcode() == Op_Opaque4) {
681 return NULL__null; // Ignore loop predicate checks (the Opaque4 ensures they will go away)
682 }
683 assert(bol->Opcode() == Op_Bool, "Unexpected node")do { if (!(bol->Opcode() == Op_Bool)) { (*g_assert_poison)
= 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 683, "assert(" "bol->Opcode() == Op_Bool" ") failed", "Unexpected node"
); ::breakpoint(); } } while (0)
;
684 int cmp_op = bol->in(1)->Opcode();
685 if (cmp_op == Op_SubTypeCheck) { // SubTypeCheck expansion expects an IfNode
686 return NULL__null;
687 }
688 // It is expensive to generate flags from a float compare.
689 // Avoid duplicated float compare.
690 if (phis > 1 && (cmp_op == Op_CmpF || cmp_op == Op_CmpD)) return NULL__null;
691
692 float infrequent_prob = PROB_UNLIKELY_MAG(3)(1e-3f);
693 // Ignore cost and blocks frequency if CMOVE can be moved outside the loop.
694 if (used_inside_loop) {
695 if (cost >= ConditionalMoveLimit) return NULL__null; // Too much goo
696
697 // BlockLayoutByFrequency optimization moves infrequent branch
698 // from hot path. No point in CMOV'ing in such case (110 is used
699 // instead of 100 to take into account not exactness of float value).
700 if (BlockLayoutByFrequency) {
701 infrequent_prob = MAX2(infrequent_prob, (float)BlockLayoutMinDiamondPercentage/110.0f);
702 }
703 }
704 // Check for highly predictable branch. No point in CMOV'ing if
705 // we are going to predict accurately all the time.
706 if (C->use_cmove() && (cmp_op == Op_CmpF || cmp_op == Op_CmpD)) {
707 //keep going
708 } else if (iff->_prob < infrequent_prob ||
709 iff->_prob > (1.0f - infrequent_prob))
710 return NULL__null;
711
712 // --------------
713 // Now replace all Phis with CMOV's
714 Node *cmov_ctrl = iff->in(0);
715 uint flip = (lp->Opcode() == Op_IfTrue);
716 Node_List wq;
717 while (1) {
718 PhiNode* phi = NULL__null;
719 for (DUIterator_Fast imax, i = region->fast_outs(imax); i < imax; i++) {
720 Node *out = region->fast_out(i);
721 if (out->is_Phi()) {
722 phi = out->as_Phi();
723 break;
724 }
725 }
726 if (phi == NULL__null || _igvn.type(phi) == Type::TOP) {
727 break;
728 }
729 if (PrintOpto && VerifyLoopOptimizations) { tty->print_cr("CMOV"); }
730 // Move speculative ops
731 wq.push(phi);
732 while (wq.size() > 0) {
733 Node *n = wq.pop();
734 for (uint j = 1; j < n->req(); j++) {
735 Node* m = n->in(j);
736 if (m != NULL__null && !is_dominator(get_ctrl(m), cmov_ctrl)) {
737#ifndef PRODUCT
738 if (PrintOpto && VerifyLoopOptimizations) {
739 tty->print(" speculate: ");
740 m->dump();
741 }
742#endif
743 set_ctrl(m, cmov_ctrl);
744 wq.push(m);
745 }
746 }
747 }
748 Node *cmov = CMoveNode::make(cmov_ctrl, iff->in(1), phi->in(1+flip), phi->in(2-flip), _igvn.type(phi));
749 register_new_node( cmov, cmov_ctrl );
750 _igvn.replace_node( phi, cmov );
751#ifndef PRODUCT
752 if (TraceLoopOpts) {
753 tty->print("CMOV ");
754 r_loop->dump_head();
755 if (Verbose) {
756 bol->in(1)->dump(1);
757 cmov->dump(1);
758 }
759 }
760 if (VerifyLoopOptimizations) verify();
761#endif
762 }
763
764 // The useless CFG diamond will fold up later; see the optimization in
765 // RegionNode::Ideal.
766 _igvn._worklist.push(region);
767
768 return iff->in(1);
769}
770
771static void enqueue_cfg_uses(Node* m, Unique_Node_List& wq) {
772 for (DUIterator_Fast imax, i = m->fast_outs(imax); i < imax; i++) {
773 Node* u = m->fast_out(i);
774 if (u->is_CFG()) {
775 if (u->Opcode() == Op_NeverBranch) {
776 u = ((NeverBranchNode*)u)->proj_out(0);
777 enqueue_cfg_uses(u, wq);
778 } else {
779 wq.push(u);
780 }
781 }
782 }
783}
784
785// Try moving a store out of a loop, right before the loop
786Node* PhaseIdealLoop::try_move_store_before_loop(Node* n, Node *n_ctrl) {
787 // Store has to be first in the loop body
788 IdealLoopTree *n_loop = get_loop(n_ctrl);
789 if (n->is_Store() && n_loop != _ltree_root &&
790 n_loop->is_loop() && n_loop->_head->is_Loop() &&
791 n->in(0) != NULL__null) {
792 Node* address = n->in(MemNode::Address);
793 Node* value = n->in(MemNode::ValueIn);
794 Node* mem = n->in(MemNode::Memory);
795 IdealLoopTree* address_loop = get_loop(get_ctrl(address));
796 IdealLoopTree* value_loop = get_loop(get_ctrl(value));
797
798 // - address and value must be loop invariant
799 // - memory must be a memory Phi for the loop
800 // - Store must be the only store on this memory slice in the
801 // loop: if there's another store following this one then value
802 // written at iteration i by the second store could be overwritten
803 // at iteration i+n by the first store: it's not safe to move the
804 // first store out of the loop
805 // - nothing must observe the memory Phi: it guarantees no read
806 // before the store, we are also guaranteed the store post
807 // dominates the loop head (ignoring a possible early
808 // exit). Otherwise there would be extra Phi involved between the
809 // loop's Phi and the store.
810 // - there must be no early exit from the loop before the Store
811 // (such an exit most of the time would be an extra use of the
812 // memory Phi but sometimes is a bottom memory Phi that takes the
813 // store as input).
814
815 if (!n_loop->is_member(address_loop) &&
816 !n_loop->is_member(value_loop) &&
817 mem->is_Phi() && mem->in(0) == n_loop->_head &&
818 mem->outcnt() == 1 &&
819 mem->in(LoopNode::LoopBackControl) == n) {
820
821 assert(n_loop->_tail != NULL, "need a tail")do { if (!(n_loop->_tail != __null)) { (*g_assert_poison) =
'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 821, "assert(" "n_loop->_tail != __null" ") failed", "need a tail"
); ::breakpoint(); } } while (0)
;
822 assert(is_dominator(n_ctrl, n_loop->_tail), "store control must not be in a branch in the loop")do { if (!(is_dominator(n_ctrl, n_loop->_tail))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 822, "assert(" "is_dominator(n_ctrl, n_loop->_tail)" ") failed"
, "store control must not be in a branch in the loop"); ::breakpoint
(); } } while (0)
;
823
824 // Verify that there's no early exit of the loop before the store.
825 bool ctrl_ok = false;
826 {
827 // Follow control from loop head until n, we exit the loop or
828 // we reach the tail
829 ResourceMark rm;
830 Unique_Node_List wq;
831 wq.push(n_loop->_head);
832
833 for (uint next = 0; next < wq.size(); ++next) {
834 Node *m = wq.at(next);
835 if (m == n->in(0)) {
836 ctrl_ok = true;
837 continue;
838 }
839 assert(!has_ctrl(m), "should be CFG")do { if (!(!has_ctrl(m))) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 839, "assert(" "!has_ctrl(m)" ") failed", "should be CFG");
::breakpoint(); } } while (0)
;
840 if (!n_loop->is_member(get_loop(m)) || m == n_loop->_tail) {
841 ctrl_ok = false;
842 break;
843 }
844 enqueue_cfg_uses(m, wq);
845 if (wq.size() > 10) {
846 ctrl_ok = false;
847 break;
848 }
849 }
850 }
851 if (ctrl_ok) {
852 // move the Store
853 _igvn.replace_input_of(mem, LoopNode::LoopBackControl, mem);
854 _igvn.replace_input_of(n, 0, n_loop->_head->as_Loop()->skip_strip_mined()->in(LoopNode::EntryControl));
855 _igvn.replace_input_of(n, MemNode::Memory, mem->in(LoopNode::EntryControl));
856 // Disconnect the phi now. An empty phi can confuse other
857 // optimizations in this pass of loop opts.
858 _igvn.replace_node(mem, mem->in(LoopNode::EntryControl));
859 n_loop->_body.yank(mem);
860
861 set_ctrl_and_loop(n, n->in(0));
862
863 return n;
864 }
865 }
866 }
867 return NULL__null;
868}
869
870// Try moving a store out of a loop, right after the loop
871void PhaseIdealLoop::try_move_store_after_loop(Node* n) {
872 if (n->is_Store() && n->in(0) != NULL__null) {
873 Node *n_ctrl = get_ctrl(n);
874 IdealLoopTree *n_loop = get_loop(n_ctrl);
875 // Store must be in a loop
876 if (n_loop != _ltree_root && !n_loop->_irreducible) {
877 Node* address = n->in(MemNode::Address);
878 Node* value = n->in(MemNode::ValueIn);
879 IdealLoopTree* address_loop = get_loop(get_ctrl(address));
880 // address must be loop invariant
881 if (!n_loop->is_member(address_loop)) {
882 // Store must be last on this memory slice in the loop and
883 // nothing in the loop must observe it
884 Node* phi = NULL__null;
885 for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) {
886 Node* u = n->fast_out(i);
887 if (has_ctrl(u)) { // control use?
888 IdealLoopTree *u_loop = get_loop(get_ctrl(u));
889 if (!n_loop->is_member(u_loop)) {
890 continue;
891 }
892 if (u->is_Phi() && u->in(0) == n_loop->_head) {
893 assert(_igvn.type(u) == Type::MEMORY, "bad phi")do { if (!(_igvn.type(u) == Type::MEMORY)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 893, "assert(" "_igvn.type(u) == Type::MEMORY" ") failed", "bad phi"
); ::breakpoint(); } } while (0)
;
894 // multiple phis on the same slice are possible
895 if (phi != NULL__null) {
896 return;
897 }
898 phi = u;
899 continue;
900 }
901 }
902 return;
903 }
904 if (phi != NULL__null) {
905 // Nothing in the loop before the store (next iteration)
906 // must observe the stored value
907 bool mem_ok = true;
908 {
909 ResourceMark rm;
910 Unique_Node_List wq;
911 wq.push(phi);
912 for (uint next = 0; next < wq.size() && mem_ok; ++next) {
913 Node *m = wq.at(next);
914 for (DUIterator_Fast imax, i = m->fast_outs(imax); i < imax && mem_ok; i++) {
915 Node* u = m->fast_out(i);
916 if (u->is_Store() || u->is_Phi()) {
917 if (u != n) {
918 wq.push(u);
919 mem_ok = (wq.size() <= 10);
920 }
921 } else {
922 mem_ok = false;
923 break;
924 }
925 }
926 }
927 }
928 if (mem_ok) {
929 // Move the store out of the loop if the LCA of all
930 // users (except for the phi) is outside the loop.
931 Node* hook = new Node(1);
932 hook->init_req(0, n_ctrl); // Add an input to prevent hook from being dead
933 _igvn.rehash_node_delayed(phi);
934 int count = phi->replace_edge(n, hook, &_igvn);
935 assert(count > 0, "inconsistent phi")do { if (!(count > 0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 935, "assert(" "count > 0" ") failed", "inconsistent phi"
); ::breakpoint(); } } while (0)
;
936
937 // Compute latest point this store can go
938 Node* lca = get_late_ctrl(n, get_ctrl(n));
939 if (lca->is_OuterStripMinedLoop()) {
940 lca = lca->in(LoopNode::EntryControl);
941 }
942 if (n_loop->is_member(get_loop(lca))) {
943 // LCA is in the loop - bail out
944 _igvn.replace_node(hook, n);
945 return;
946 }
947#ifdef ASSERT1
948 if (n_loop->_head->is_Loop() && n_loop->_head->as_Loop()->is_strip_mined()) {
949 assert(n_loop->_head->Opcode() == Op_CountedLoop, "outer loop is a strip mined")do { if (!(n_loop->_head->Opcode() == Op_CountedLoop)) {
(*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 949, "assert(" "n_loop->_head->Opcode() == Op_CountedLoop"
") failed", "outer loop is a strip mined"); ::breakpoint(); }
} while (0)
;
950 n_loop->_head->as_Loop()->verify_strip_mined(1);
951 Node* outer = n_loop->_head->as_CountedLoop()->outer_loop();
952 IdealLoopTree* outer_loop = get_loop(outer);
953 assert(n_loop->_parent == outer_loop, "broken loop tree")do { if (!(n_loop->_parent == outer_loop)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 953, "assert(" "n_loop->_parent == outer_loop" ") failed"
, "broken loop tree"); ::breakpoint(); } } while (0)
;
954 assert(get_loop(lca) == outer_loop, "safepoint in outer loop consume all memory state")do { if (!(get_loop(lca) == outer_loop)) { (*g_assert_poison)
= 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 954, "assert(" "get_loop(lca) == outer_loop" ") failed", "safepoint in outer loop consume all memory state"
); ::breakpoint(); } } while (0)
;
955 }
956#endif
957 lca = place_outside_loop(lca, n_loop);
958 assert(!n_loop->is_member(get_loop(lca)), "control must not be back in the loop")do { if (!(!n_loop->is_member(get_loop(lca)))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 958, "assert(" "!n_loop->is_member(get_loop(lca))" ") failed"
, "control must not be back in the loop"); ::breakpoint(); } }
while (0)
;
959 assert(get_loop(lca)->_nest < n_loop->_nest || lca->in(0)->Opcode() == Op_NeverBranch, "must not be moved into inner loop")do { if (!(get_loop(lca)->_nest < n_loop->_nest || lca
->in(0)->Opcode() == Op_NeverBranch)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 959, "assert(" "get_loop(lca)->_nest < n_loop->_nest || lca->in(0)->Opcode() == Op_NeverBranch"
") failed", "must not be moved into inner loop"); ::breakpoint
(); } } while (0)
;
960
961 // Move store out of the loop
962 _igvn.replace_node(hook, n->in(MemNode::Memory));
963 _igvn.replace_input_of(n, 0, lca);
964 set_ctrl_and_loop(n, lca);
965
966 // Disconnect the phi now. An empty phi can confuse other
967 // optimizations in this pass of loop opts..
968 if (phi->in(LoopNode::LoopBackControl) == phi) {
969 _igvn.replace_node(phi, phi->in(LoopNode::EntryControl));
970 n_loop->_body.yank(phi);
971 }
972 }
973 }
974 }
975 }
976 }
977}
978
979//------------------------------split_if_with_blocks_pre-----------------------
980// Do the real work in a non-recursive function. Data nodes want to be
981// cloned in the pre-order so they can feed each other nicely.
982Node *PhaseIdealLoop::split_if_with_blocks_pre( Node *n ) {
983 // Cloning these guys is unlikely to win
984 int n_op = n->Opcode();
985 if (n_op == Op_MergeMem) {
986 return n;
987 }
988 if (n->is_Proj()) {
989 return n;
990 }
991 // Do not clone-up CmpFXXX variations, as these are always
992 // followed by a CmpI
993 if (n->is_Cmp()) {
994 return n;
995 }
996 // Attempt to use a conditional move instead of a phi/branch
997 if (ConditionalMoveLimit > 0 && n_op == Op_Region) {
998 Node *cmov = conditional_move( n );
999 if (cmov) {
1000 return cmov;
1001 }
1002 }
1003 if (n->is_CFG() || n->is_LoadStore()) {
1004 return n;
1005 }
1006 if (n->is_Opaque1() || // Opaque nodes cannot be mod'd
1007 n_op == Op_Opaque2) {
1008 if (!C->major_progress()) { // If chance of no more loop opts...
1009 _igvn._worklist.push(n); // maybe we'll remove them
1010 }
1011 return n;
1012 }
1013
1014 if (n->is_Con()) {
1015 return n; // No cloning for Con nodes
1016 }
1017
1018 Node *n_ctrl = get_ctrl(n);
1019 if (!n_ctrl) {
1020 return n; // Dead node
1021 }
1022
1023 Node* res = try_move_store_before_loop(n, n_ctrl);
1024 if (res != NULL__null) {
1025 return n;
1026 }
1027
1028 // Attempt to remix address expressions for loop invariants
1029 Node *m = remix_address_expressions( n );
1030 if( m ) return m;
1031
1032 if (n_op == Op_AddI) {
1033 Node *nn = convert_add_to_muladd( n );
1034 if ( nn ) return nn;
1035 }
1036
1037 if (n->is_ConstraintCast()) {
1038 Node* dom_cast = n->as_ConstraintCast()->dominating_cast(&_igvn, this);
1039 // ConstraintCastNode::dominating_cast() uses node control input to determine domination.
1040 // Node control inputs don't necessarily agree with loop control info (due to
1041 // transformations happened in between), thus additional dominance check is needed
1042 // to keep loop info valid.
1043 if (dom_cast != NULL__null && is_dominator(get_ctrl(dom_cast), get_ctrl(n))) {
1044 _igvn.replace_node(n, dom_cast);
1045 return dom_cast;
1046 }
1047 }
1048
1049 // Determine if the Node has inputs from some local Phi.
1050 // Returns the block to clone thru.
1051 Node *n_blk = has_local_phi_input( n );
1052 if( !n_blk ) return n;
1053
1054 // Do not clone the trip counter through on a CountedLoop
1055 // (messes up the canonical shape).
1056 if (((n_blk->is_CountedLoop() || (n_blk->is_Loop() && n_blk->as_Loop()->is_loop_nest_inner_loop())) && n->Opcode() == Op_AddI) ||
1057 (n_blk->is_LongCountedLoop() && n->Opcode() == Op_AddL)) {
1058 return n;
1059 }
1060
1061 // Check for having no control input; not pinned. Allow
1062 // dominating control.
1063 if (n->in(0)) {
1064 Node *dom = idom(n_blk);
1065 if (dom_lca(n->in(0), dom) != n->in(0)) {
1066 return n;
1067 }
1068 }
1069 // Policy: when is it profitable. You must get more wins than
1070 // policy before it is considered profitable. Policy is usually 0,
1071 // so 1 win is considered profitable. Big merges will require big
1072 // cloning, so get a larger policy.
1073 int policy = n_blk->req() >> 2;
1074
1075 // If the loop is a candidate for range check elimination,
1076 // delay splitting through it's phi until a later loop optimization
1077 if (n_blk->is_BaseCountedLoop()) {
1078 IdealLoopTree *lp = get_loop(n_blk);
1079 if (lp && lp->_rce_candidate) {
1080 return n;
1081 }
1082 }
1083
1084 if (must_throttle_split_if()) return n;
1085
1086 // Split 'n' through the merge point if it is profitable
1087 Node *phi = split_thru_phi( n, n_blk, policy );
1088 if (!phi) return n;
1089
1090 // Found a Phi to split thru!
1091 // Replace 'n' with the new phi
1092 _igvn.replace_node( n, phi );
1093 // Moved a load around the loop, 'en-registering' something.
1094 if (n_blk->is_Loop() && n->is_Load() &&
1095 !phi->in(LoopNode::LoopBackControl)->is_Load())
1096 C->set_major_progress();
1097
1098 return phi;
1099}
1100
1101static bool merge_point_too_heavy(Compile* C, Node* region) {
1102 // Bail out if the region and its phis have too many users.
1103 int weight = 0;
1104 for (DUIterator_Fast imax, i = region->fast_outs(imax); i < imax; i++) {
1105 weight += region->fast_out(i)->outcnt();
1106 }
1107 int nodes_left = C->max_node_limit() - C->live_nodes();
1108 if (weight * 8 > nodes_left) {
1109 if (PrintOpto) {
1110 tty->print_cr("*** Split-if bails out: %d nodes, region weight %d", C->unique(), weight);
1111 }
1112 return true;
1113 } else {
1114 return false;
1115 }
1116}
1117
1118static bool merge_point_safe(Node* region) {
1119 // 4799512: Stop split_if_with_blocks from splitting a block with a ConvI2LNode
1120 // having a PhiNode input. This sidesteps the dangerous case where the split
1121 // ConvI2LNode may become TOP if the input Value() does not
1122 // overlap the ConvI2L range, leaving a node which may not dominate its
1123 // uses.
1124 // A better fix for this problem can be found in the BugTraq entry, but
1125 // expediency for Mantis demands this hack.
1126#ifdef _LP641
1127 for (DUIterator_Fast imax, i = region->fast_outs(imax); i < imax; i++) {
1128 Node* n = region->fast_out(i);
1129 if (n->is_Phi()) {
1130 for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++) {
1131 Node* m = n->fast_out(j);
1132 if (m->Opcode() == Op_ConvI2L)
1133 return false;
1134 if (m->is_CastII()) {
1135 return false;
1136 }
1137 }
1138 }
1139 }
1140#endif
1141 return true;
1142}
1143
1144
1145//------------------------------place_outside_loop---------------------------------
1146// Place some computation outside of this loop on the path to the use passed as argument
1147Node* PhaseIdealLoop::place_outside_loop(Node* useblock, IdealLoopTree* loop) const {
1148 Node* head = loop->_head;
1149 assert(!loop->is_member(get_loop(useblock)), "must be outside loop")do { if (!(!loop->is_member(get_loop(useblock)))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1149, "assert(" "!loop->is_member(get_loop(useblock))" ") failed"
, "must be outside loop"); ::breakpoint(); } } while (0)
;
1150 if (head->is_Loop() && head->as_Loop()->is_strip_mined()) {
1151 loop = loop->_parent;
1152 assert(loop->_head->is_OuterStripMinedLoop(), "malformed strip mined loop")do { if (!(loop->_head->is_OuterStripMinedLoop())) { (*
g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1152, "assert(" "loop->_head->is_OuterStripMinedLoop()"
") failed", "malformed strip mined loop"); ::breakpoint(); }
} while (0)
;
1153 }
1154
1155 // Pick control right outside the loop
1156 for (;;) {
1157 Node* dom = idom(useblock);
1158 if (loop->is_member(get_loop(dom)) ||
1159 // NeverBranch nodes are not assigned to the loop when constructed
1160 (dom->Opcode() == Op_NeverBranch && loop->is_member(get_loop(dom->in(0))))) {
1161 break;
1162 }
1163 useblock = dom;
1164 }
1165 assert(find_non_split_ctrl(useblock) == useblock, "should be non split control")do { if (!(find_non_split_ctrl(useblock) == useblock)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1165, "assert(" "find_non_split_ctrl(useblock) == useblock"
") failed", "should be non split control"); ::breakpoint(); }
} while (0)
;
1166 return useblock;
1167}
1168
1169
1170bool PhaseIdealLoop::identical_backtoback_ifs(Node *n) {
1171 if (!n->is_If() || n->is_BaseCountedLoopEnd()) {
1172 return false;
1173 }
1174 if (!n->in(0)->is_Region()) {
1175 return false;
1176 }
1177
1178 IfNode* n_if = n->as_If();
1179 if (n_if->proj_out(0)->outcnt() > 1 || n_if->proj_out(1)->outcnt() > 1) {
1180 // Removing the dominated If node by using the split-if optimization does not work if there are data dependencies.
1181 // Some data dependencies depend on its immediate dominator If node and should not be separated from it (e.g. null
1182 // checks, division by zero checks etc.). Bail out for now until data dependencies are correctly handled when
1183 // optimizing back-to-back ifs.
1184 return false;
1185 }
1186
1187 Node* region = n->in(0);
1188 Node* dom = idom(region);
1189 if (!dom->is_If() || dom->in(1) != n->in(1)) {
1190 return false;
1191 }
1192 IfNode* dom_if = dom->as_If();
1193 Node* proj_true = dom_if->proj_out(1);
1194 Node* proj_false = dom_if->proj_out(0);
1195
1196 for (uint i = 1; i < region->req(); i++) {
1197 if (is_dominator(proj_true, region->in(i))) {
1198 continue;
1199 }
1200 if (is_dominator(proj_false, region->in(i))) {
1201 continue;
1202 }
1203 return false;
1204 }
1205
1206 return true;
1207}
1208
1209
1210bool PhaseIdealLoop::can_split_if(Node* n_ctrl) {
1211 if (must_throttle_split_if()) {
1212 return false;
1213 }
1214
1215 // Do not do 'split-if' if irreducible loops are present.
1216 if (_has_irreducible_loops) {
1217 return false;
1218 }
1219
1220 if (merge_point_too_heavy(C, n_ctrl)) {
1221 return false;
1222 }
1223
1224 // Do not do 'split-if' if some paths are dead. First do dead code
1225 // elimination and then see if its still profitable.
1226 for (uint i = 1; i < n_ctrl->req(); i++) {
1227 if (n_ctrl->in(i) == C->top()) {
1228 return false;
1229 }
1230 }
1231
1232 // If trying to do a 'Split-If' at the loop head, it is only
1233 // profitable if the cmp folds up on BOTH paths. Otherwise we
1234 // risk peeling a loop forever.
1235
1236 // CNC - Disabled for now. Requires careful handling of loop
1237 // body selection for the cloned code. Also, make sure we check
1238 // for any input path not being in the same loop as n_ctrl. For
1239 // irreducible loops we cannot check for 'n_ctrl->is_Loop()'
1240 // because the alternative loop entry points won't be converted
1241 // into LoopNodes.
1242 IdealLoopTree *n_loop = get_loop(n_ctrl);
1243 for (uint j = 1; j < n_ctrl->req(); j++) {
1244 if (get_loop(n_ctrl->in(j)) != n_loop) {
1245 return false;
1246 }
1247 }
1248
1249 // Check for safety of the merge point.
1250 if (!merge_point_safe(n_ctrl)) {
1251 return false;
1252 }
1253
1254 return true;
1255}
1256
1257// Detect if the node is the inner strip-mined loop
1258// Return: NULL if it's not the case, or the exit of outer strip-mined loop
1259static Node* is_inner_of_stripmined_loop(const Node* out) {
1260 Node* out_le = NULL__null;
1261
1262 if (out->is_CountedLoopEnd()) {
1263 const CountedLoopNode* loop = out->as_CountedLoopEnd()->loopnode();
1264
1265 if (loop != NULL__null && loop->is_strip_mined()) {
1266 out_le = loop->in(LoopNode::EntryControl)->as_OuterStripMinedLoop()->outer_loop_exit();
1267 }
1268 }
1269
1270 return out_le;
1271}
1272
1273//------------------------------split_if_with_blocks_post----------------------
1274// Do the real work in a non-recursive function. CFG hackery wants to be
1275// in the post-order, so it can dirty the I-DOM info and not use the dirtied
1276// info.
1277void PhaseIdealLoop::split_if_with_blocks_post(Node *n) {
1278
1279 // Cloning Cmp through Phi's involves the split-if transform.
1280 // FastLock is not used by an If
1281 if (n->is_Cmp() && !n->is_FastLock()) {
1282 Node *n_ctrl = get_ctrl(n);
1283 // Determine if the Node has inputs from some local Phi.
1284 // Returns the block to clone thru.
1285 Node *n_blk = has_local_phi_input(n);
1286 if (n_blk != n_ctrl) {
1287 return;
1288 }
1289
1290 if (!can_split_if(n_ctrl)) {
1291 return;
1292 }
1293
1294 if (n->outcnt() != 1) {
1295 return; // Multiple bool's from 1 compare?
1296 }
1297 Node *bol = n->unique_out();
1298 assert(bol->is_Bool(), "expect a bool here")do { if (!(bol->is_Bool())) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1298, "assert(" "bol->is_Bool()" ") failed", "expect a bool here"
); ::breakpoint(); } } while (0)
;
1299 if (bol->outcnt() != 1) {
1300 return;// Multiple branches from 1 compare?
1301 }
1302 Node *iff = bol->unique_out();
1303
1304 // Check some safety conditions
1305 if (iff->is_If()) { // Classic split-if?
1306 if (iff->in(0) != n_ctrl) {
1307 return; // Compare must be in same blk as if
1308 }
1309 } else if (iff->is_CMove()) { // Trying to split-up a CMOVE
1310 // Can't split CMove with different control edge.
1311 if (iff->in(0) != NULL__null && iff->in(0) != n_ctrl ) {
1312 return;
1313 }
1314 if (get_ctrl(iff->in(2)) == n_ctrl ||
1315 get_ctrl(iff->in(3)) == n_ctrl) {
1316 return; // Inputs not yet split-up
1317 }
1318 if (get_loop(n_ctrl) != get_loop(get_ctrl(iff))) {
1319 return; // Loop-invar test gates loop-varying CMOVE
1320 }
1321 } else {
1322 return; // some other kind of node, such as an Allocate
1323 }
1324
1325 // When is split-if profitable? Every 'win' on means some control flow
1326 // goes dead, so it's almost always a win.
1327 int policy = 0;
1328 // Split compare 'n' through the merge point if it is profitable
1329 Node *phi = split_thru_phi( n, n_ctrl, policy);
1330 if (!phi) {
1331 return;
1332 }
1333
1334 // Found a Phi to split thru!
1335 // Replace 'n' with the new phi
1336 _igvn.replace_node(n, phi);
1337
1338 // Now split the bool up thru the phi
1339 Node *bolphi = split_thru_phi(bol, n_ctrl, -1);
1340 guarantee(bolphi != NULL, "null boolean phi node")do { if (!(bolphi != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1340, "guarantee(" "bolphi != NULL" ") failed", "null boolean phi node"
); ::breakpoint(); } } while (0)
;
1341
1342 _igvn.replace_node(bol, bolphi);
1343 assert(iff->in(1) == bolphi, "")do { if (!(iff->in(1) == bolphi)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1343, "assert(" "iff->in(1) == bolphi" ") failed", ""); ::
breakpoint(); } } while (0)
;
1344
1345 if (bolphi->Value(&_igvn)->singleton()) {
1346 return;
1347 }
1348
1349 // Conditional-move? Must split up now
1350 if (!iff->is_If()) {
1351 Node *cmovphi = split_thru_phi(iff, n_ctrl, -1);
1352 _igvn.replace_node(iff, cmovphi);
1353 return;
1354 }
1355
1356 // Now split the IF
1357 do_split_if(iff);
1358 return;
1359 }
1360
1361 // Two identical ifs back to back can be merged
1362 if (identical_backtoback_ifs(n) && can_split_if(n->in(0))) {
1363 Node *n_ctrl = n->in(0);
1364 PhiNode* bolphi = PhiNode::make_blank(n_ctrl, n->in(1));
1365 IfNode* dom_if = idom(n_ctrl)->as_If();
1366 Node* proj_true = dom_if->proj_out(1);
1367 Node* proj_false = dom_if->proj_out(0);
1368 Node* con_true = _igvn.makecon(TypeInt::ONE);
1369 Node* con_false = _igvn.makecon(TypeInt::ZERO);
1370
1371 for (uint i = 1; i < n_ctrl->req(); i++) {
1372 if (is_dominator(proj_true, n_ctrl->in(i))) {
1373 bolphi->init_req(i, con_true);
1374 } else {
1375 assert(is_dominator(proj_false, n_ctrl->in(i)), "bad if")do { if (!(is_dominator(proj_false, n_ctrl->in(i)))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1375, "assert(" "is_dominator(proj_false, n_ctrl->in(i))"
") failed", "bad if"); ::breakpoint(); } } while (0)
;
1376 bolphi->init_req(i, con_false);
1377 }
1378 }
1379 register_new_node(bolphi, n_ctrl);
1380 _igvn.replace_input_of(n, 1, bolphi);
1381
1382 // Now split the IF
1383 do_split_if(n);
1384 return;
1385 }
1386
1387 // Check for an IF ready to split; one that has its
1388 // condition codes input coming from a Phi at the block start.
1389 int n_op = n->Opcode();
1390
1391 // Check for an IF being dominated by another IF same test
1392 if (n_op == Op_If ||
1393 n_op == Op_RangeCheck) {
1394 Node *bol = n->in(1);
1395 uint max = bol->outcnt();
1396 // Check for same test used more than once?
1397 if (max > 1 && bol->is_Bool()) {
1398 // Search up IDOMs to see if this IF is dominated.
1399 Node *cutoff = get_ctrl(bol);
1400
1401 // Now search up IDOMs till cutoff, looking for a dominating test
1402 Node *prevdom = n;
1403 Node *dom = idom(prevdom);
1404 while (dom != cutoff) {
1405 if (dom->req() > 1 && dom->in(1) == bol && prevdom->in(0) == dom &&
1406 safe_for_if_replacement(dom)) {
1407 // It's invalid to move control dependent data nodes in the inner
1408 // strip-mined loop, because:
1409 // 1) break validation of LoopNode::verify_strip_mined()
1410 // 2) move code with side-effect in strip-mined loop
1411 // Move to the exit of outer strip-mined loop in that case.
1412 Node* out_le = is_inner_of_stripmined_loop(dom);
1413 if (out_le != NULL__null) {
1414 prevdom = out_le;
1415 }
1416 // Replace the dominated test with an obvious true or false.
1417 // Place it on the IGVN worklist for later cleanup.
1418 C->set_major_progress();
1419 dominated_by(prevdom, n, false, true);
1420#ifndef PRODUCT
1421 if( VerifyLoopOptimizations ) verify();
1422#endif
1423 return;
1424 }
1425 prevdom = dom;
1426 dom = idom(prevdom);
1427 }
1428 }
1429 }
1430
1431 try_sink_out_of_loop(n);
1432
1433 try_move_store_after_loop(n);
1434
1435 // Check for Opaque2's who's loop has disappeared - who's input is in the
1436 // same loop nest as their output. Remove 'em, they are no longer useful.
1437 if( n_op == Op_Opaque2 &&
1438 n->in(1) != NULL__null &&
1439 get_loop(get_ctrl(n)) == get_loop(get_ctrl(n->in(1))) ) {
1440 _igvn.replace_node( n, n->in(1) );
1441 }
1442}
1443
1444bool PhaseIdealLoop::safe_for_if_replacement(const Node* dom) const {
1445 if (!dom->is_CountedLoopEnd()) {
1446 return true;
1447 }
1448 CountedLoopEndNode* le = dom->as_CountedLoopEnd();
1449 CountedLoopNode* cl = le->loopnode();
1450 if (cl == NULL__null) {
1451 return true;
1452 }
1453 if (!cl->is_main_loop()) {
1454 return true;
1455 }
1456 if (cl->is_canonical_loop_entry() == NULL__null) {
1457 return true;
1458 }
1459 // Further unrolling is possible so loop exit condition might change
1460 return false;
1461}
1462
1463// See if a shared loop-varying computation has no loop-varying uses.
1464// Happens if something is only used for JVM state in uncommon trap exits,
1465// like various versions of induction variable+offset. Clone the
1466// computation per usage to allow it to sink out of the loop.
1467void PhaseIdealLoop::try_sink_out_of_loop(Node* n) {
1468 bool is_raw_to_oop_cast = n->is_ConstraintCast() &&
1469 n->in(1)->bottom_type()->isa_rawptr() &&
1470 !n->bottom_type()->isa_rawptr();
1471 if (has_ctrl(n) &&
1472 !n->is_Phi() &&
1473 !n->is_Bool() &&
1474 !n->is_Proj() &&
1475 !n->is_MergeMem() &&
1476 !n->is_CMove() &&
1477 !is_raw_to_oop_cast && // don't extend live ranges of raw oops
1478 n->Opcode() != Op_Opaque4 &&
1479 !n->is_Type()) {
1480 Node *n_ctrl = get_ctrl(n);
1481 IdealLoopTree *n_loop = get_loop(n_ctrl);
1482
1483 if (n->in(0) != NULL__null) {
1484 IdealLoopTree* loop_ctrl = get_loop(n->in(0));
1485 if (n_loop != loop_ctrl && n_loop->is_member(loop_ctrl)) {
1486 // n has a control input inside a loop but get_ctrl() is member of an outer loop. This could happen, for example,
1487 // for Div nodes inside a loop (control input inside loop) without a use except for an UCT (outside the loop).
1488 // Rewire control of n to right outside of the loop, regardless if its input(s) are later sunk or not.
1489 _igvn.replace_input_of(n, 0, place_outside_loop(n_ctrl, loop_ctrl));
1490 }
1491 }
1492 if (n_loop != _ltree_root && n->outcnt() > 1) {
1493 // Compute early control: needed for anti-dependence analysis. It's also possible that as a result of
1494 // previous transformations in this loop opts round, the node can be hoisted now: early control will tell us.
1495 Node* early_ctrl = compute_early_ctrl(n, n_ctrl);
1496 if (n_loop->is_member(get_loop(early_ctrl)) && // check that this one can't be hoisted now
1497 ctrl_of_all_uses_out_of_loop(n, early_ctrl, n_loop)) { // All uses in outer loops!
1498 assert(!n->is_Store() && !n->is_LoadStore(), "no node with a side effect")do { if (!(!n->is_Store() && !n->is_LoadStore()
)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1498, "assert(" "!n->is_Store() && !n->is_LoadStore()"
") failed", "no node with a side effect"); ::breakpoint(); }
} while (0)
;
1499 Node* outer_loop_clone = NULL__null;
1500 for (DUIterator_Last jmin, j = n->last_outs(jmin); j >= jmin;) {
1501 Node* u = n->last_out(j); // Clone private computation per use
1502 _igvn.rehash_node_delayed(u);
1503 Node* x = n->clone(); // Clone computation
1504 Node* x_ctrl = NULL__null;
1505 if (u->is_Phi()) {
1506 // Replace all uses of normal nodes. Replace Phi uses
1507 // individually, so the separate Nodes can sink down
1508 // different paths.
1509 uint k = 1;
1510 while (u->in(k) != n) k++;
1511 u->set_req(k, x);
1512 // x goes next to Phi input path
1513 x_ctrl = u->in(0)->in(k);
1514 // Find control for 'x' next to use but not inside inner loops.
1515 x_ctrl = place_outside_loop(x_ctrl, n_loop);
1516 --j;
1517 } else { // Normal use
1518 if (has_ctrl(u)) {
1519 x_ctrl = get_ctrl(u);
1520 } else {
1521 x_ctrl = u->in(0);
1522 }
1523 // Find control for 'x' next to use but not inside inner loops.
1524 x_ctrl = place_outside_loop(x_ctrl, n_loop);
1525 // Replace all uses
1526 if (u->is_ConstraintCast() && u->bottom_type()->higher_equal(_igvn.type(n)) && u->in(0) == x_ctrl) {
1527 // If we're sinking a chain of data nodes, we might have inserted a cast to pin the use which is not necessary
1528 // anymore now that we're going to pin n as well
1529 _igvn.replace_node(u, x);
1530 --j;
1531 } else {
1532 int nb = u->replace_edge(n, x, &_igvn);
1533 j -= nb;
1534 }
1535 }
1536
1537 if (n->is_Load()) {
1538 // For loads, add a control edge to a CFG node outside of the loop
1539 // to force them to not combine and return back inside the loop
1540 // during GVN optimization (4641526).
1541 assert(x_ctrl == get_late_ctrl_with_anti_dep(x->as_Load(), early_ctrl, x_ctrl), "anti-dependences were already checked")do { if (!(x_ctrl == get_late_ctrl_with_anti_dep(x->as_Load
(), early_ctrl, x_ctrl))) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1541, "assert(" "x_ctrl == get_late_ctrl_with_anti_dep(x->as_Load(), early_ctrl, x_ctrl)"
") failed", "anti-dependences were already checked"); ::breakpoint
(); } } while (0)
;
1542
1543 IdealLoopTree* x_loop = get_loop(x_ctrl);
1544 Node* x_head = x_loop->_head;
1545 if (x_head->is_Loop() && x_head->is_OuterStripMinedLoop()) {
1546 // Do not add duplicate LoadNodes to the outer strip mined loop
1547 if (outer_loop_clone != NULL__null) {
1548 _igvn.replace_node(x, outer_loop_clone);
1549 continue;
1550 }
1551 outer_loop_clone = x;
1552 }
1553 x->set_req(0, x_ctrl);
1554 } else if (n->in(0) != NULL__null){
1555 x->set_req(0, x_ctrl);
1556 }
1557 assert(dom_depth(n_ctrl) <= dom_depth(x_ctrl), "n is later than its clone")do { if (!(dom_depth(n_ctrl) <= dom_depth(x_ctrl))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1557, "assert(" "dom_depth(n_ctrl) <= dom_depth(x_ctrl)"
") failed", "n is later than its clone"); ::breakpoint(); } }
while (0)
;
1558 assert(!n_loop->is_member(get_loop(x_ctrl)), "should have moved out of loop")do { if (!(!n_loop->is_member(get_loop(x_ctrl)))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1558, "assert(" "!n_loop->is_member(get_loop(x_ctrl))" ") failed"
, "should have moved out of loop"); ::breakpoint(); } } while
(0)
;
1559 register_new_node(x, x_ctrl);
1560
1561 // Chain of AddP: (AddP base (AddP base )) must keep the same base after sinking so:
1562 // 1- We don't add a CastPP here when the first one is sunk so if the second one is not, their bases remain
1563 // the same.
1564 // (see 2- below)
1565 assert(!x->is_AddP() || !x->in(AddPNode::Address)->is_AddP() ||do { if (!(!x->is_AddP() || !x->in(AddPNode::Address)->
is_AddP() || x->in(AddPNode::Address)->in(AddPNode::Base
) == x->in(AddPNode::Base) || !x->in(AddPNode::Address)
->in(AddPNode::Base)->eqv_uncast(x->in(AddPNode::Base
)))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1567, "assert(" "!x->is_AddP() || !x->in(AddPNode::Address)->is_AddP() || x->in(AddPNode::Address)->in(AddPNode::Base) == x->in(AddPNode::Base) || !x->in(AddPNode::Address)->in(AddPNode::Base)->eqv_uncast(x->in(AddPNode::Base))"
") failed", "unexpected AddP shape"); ::breakpoint(); } } while
(0)
1566 x->in(AddPNode::Address)->in(AddPNode::Base) == x->in(AddPNode::Base) ||do { if (!(!x->is_AddP() || !x->in(AddPNode::Address)->
is_AddP() || x->in(AddPNode::Address)->in(AddPNode::Base
) == x->in(AddPNode::Base) || !x->in(AddPNode::Address)
->in(AddPNode::Base)->eqv_uncast(x->in(AddPNode::Base
)))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1567, "assert(" "!x->is_AddP() || !x->in(AddPNode::Address)->is_AddP() || x->in(AddPNode::Address)->in(AddPNode::Base) == x->in(AddPNode::Base) || !x->in(AddPNode::Address)->in(AddPNode::Base)->eqv_uncast(x->in(AddPNode::Base))"
") failed", "unexpected AddP shape"); ::breakpoint(); } } while
(0)
1567 !x->in(AddPNode::Address)->in(AddPNode::Base)->eqv_uncast(x->in(AddPNode::Base)), "unexpected AddP shape")do { if (!(!x->is_AddP() || !x->in(AddPNode::Address)->
is_AddP() || x->in(AddPNode::Address)->in(AddPNode::Base
) == x->in(AddPNode::Base) || !x->in(AddPNode::Address)
->in(AddPNode::Base)->eqv_uncast(x->in(AddPNode::Base
)))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1567, "assert(" "!x->is_AddP() || !x->in(AddPNode::Address)->is_AddP() || x->in(AddPNode::Address)->in(AddPNode::Base) == x->in(AddPNode::Base) || !x->in(AddPNode::Address)->in(AddPNode::Base)->eqv_uncast(x->in(AddPNode::Base))"
") failed", "unexpected AddP shape"); ::breakpoint(); } } while
(0)
;
1568 if (x->in(0) == NULL__null && !x->is_DecodeNarrowPtr() &&
1569 !(x->is_AddP() && x->in(AddPNode::Address)->is_AddP() && x->in(AddPNode::Address)->in(AddPNode::Base) == x->in(AddPNode::Base))) {
1570 assert(!x->is_Load(), "load should be pinned")do { if (!(!x->is_Load())) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1570, "assert(" "!x->is_Load()" ") failed", "load should be pinned"
); ::breakpoint(); } } while (0)
;
1571 // Use a cast node to pin clone out of loop
1572 Node* cast = NULL__null;
1573 for (uint k = 0; k < x->req(); k++) {
1574 Node* in = x->in(k);
1575 if (in != NULL__null && n_loop->is_member(get_loop(get_ctrl(in)))) {
1576 const Type* in_t = _igvn.type(in);
1577 cast = ConstraintCastNode::make_cast_for_type(x_ctrl, in, in_t, ConstraintCastNode::UnconditionalDependency);
1578 }
1579 if (cast != NULL__null) {
1580 register_new_node(cast, x_ctrl);
1581 x->replace_edge(in, cast);
1582 // Chain of AddP:
1583 // 2- A CastPP of the base is only added now that both AddP nodes are sunk
1584 if (x->is_AddP() && k == AddPNode::Base) {
1585 for (DUIterator_Fast imax, i = x->fast_outs(imax); i < imax; i++) {
1586 Node* u = x->fast_out(i);
1587 if (u->is_AddP() && u->in(AddPNode::Base) == n->in(AddPNode::Base)) {
1588 _igvn.replace_input_of(u, AddPNode::Base, cast);
1589 assert(u->find_out_with(Op_AddP) == NULL, "more than 2 chained AddP nodes?")do { if (!(u->find_out_with(Op_AddP) == __null)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1589, "assert(" "u->find_out_with(Op_AddP) == __null" ") failed"
, "more than 2 chained AddP nodes?"); ::breakpoint(); } } while
(0)
;
1590 }
1591 }
1592 }
1593 break;
1594 }
1595 }
1596 assert(cast != NULL, "must have added a cast to pin the node")do { if (!(cast != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1596, "assert(" "cast != __null" ") failed", "must have added a cast to pin the node"
); ::breakpoint(); } } while (0)
;
1597 }
1598 }
1599 _igvn.remove_dead_node(n);
1600 }
1601 _dom_lca_tags_round = 0;
1602 }
1603 }
1604}
1605
1606Node* PhaseIdealLoop::compute_early_ctrl(Node* n, Node* n_ctrl) {
1607 Node* early_ctrl = NULL__null;
1608 ResourceMark rm;
1609 Unique_Node_List wq;
1610 wq.push(n);
1611 for (uint i = 0; i < wq.size(); i++) {
1612 Node* m = wq.at(i);
1613 Node* c = NULL__null;
1614 if (m->is_CFG()) {
1615 c = m;
1616 } else if (m->pinned()) {
1617 c = m->in(0);
1618 } else {
1619 for (uint j = 0; j < m->req(); j++) {
1620 Node* in = m->in(j);
1621 if (in == NULL__null) {
1622 continue;
1623 }
1624 wq.push(in);
1625 }
1626 }
1627 if (c != NULL__null) {
1628 assert(is_dominator(c, n_ctrl), "")do { if (!(is_dominator(c, n_ctrl))) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1628, "assert(" "is_dominator(c, n_ctrl)" ") failed", ""); ::
breakpoint(); } } while (0)
;
1629 if (early_ctrl == NULL__null) {
1630 early_ctrl = c;
1631 } else if (is_dominator(early_ctrl, c)) {
1632 early_ctrl = c;
1633 }
1634 }
1635 }
1636 assert(is_dominator(early_ctrl, n_ctrl), "early control must dominate current control")do { if (!(is_dominator(early_ctrl, n_ctrl))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1636, "assert(" "is_dominator(early_ctrl, n_ctrl)" ") failed"
, "early control must dominate current control"); ::breakpoint
(); } } while (0)
;
1637 return early_ctrl;
1638}
1639
1640bool PhaseIdealLoop::ctrl_of_all_uses_out_of_loop(const Node* n, Node* n_ctrl, IdealLoopTree* n_loop) {
1641 for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) {
1642 Node* u = n->fast_out(i);
1643 if (u->Opcode() == Op_Opaque1) {
1644 return false; // Found loop limit, bugfix for 4677003
1645 }
1646 // We can't reuse tags in PhaseIdealLoop::dom_lca_for_get_late_ctrl_internal() so make sure calls to
1647 // get_late_ctrl_with_anti_dep() use their own tag
1648 _dom_lca_tags_round++;
1649 assert(_dom_lca_tags_round != 0, "shouldn't wrap around")do { if (!(_dom_lca_tags_round != 0)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1649, "assert(" "_dom_lca_tags_round != 0" ") failed", "shouldn't wrap around"
); ::breakpoint(); } } while (0)
;
1650
1651 if (u->is_Phi()) {
1652 for (uint j = 1; j < u->req(); ++j) {
1653 if (u->in(j) == n && !ctrl_of_use_out_of_loop(n, n_ctrl, n_loop, u->in(0)->in(j))) {
1654 return false;
1655 }
1656 }
1657 } else {
1658 Node* ctrl = has_ctrl(u) ? get_ctrl(u) : u->in(0);
1659 if (!ctrl_of_use_out_of_loop(n, n_ctrl, n_loop, ctrl)) {
1660 return false;
1661 }
1662 }
1663 }
1664 return true;
1665}
1666
1667bool PhaseIdealLoop::ctrl_of_use_out_of_loop(const Node* n, Node* n_ctrl, IdealLoopTree* n_loop, Node* ctrl) {
1668 if (n->is_Load()) {
1669 ctrl = get_late_ctrl_with_anti_dep(n->as_Load(), n_ctrl, ctrl);
1670 }
1671 IdealLoopTree *u_loop = get_loop(ctrl);
1672 if (u_loop == n_loop) {
1673 return false; // Found loop-varying use
1674 }
1675 if (n_loop->is_member(u_loop)) {
1676 return false; // Found use in inner loop
1677 }
1678 return true;
1679}
1680
1681//------------------------------split_if_with_blocks---------------------------
1682// Check for aggressive application of 'split-if' optimization,
1683// using basic block level info.
1684void PhaseIdealLoop::split_if_with_blocks(VectorSet &visited, Node_Stack &nstack) {
1685 Node* root = C->root();
1686 visited.set(root->_idx); // first, mark root as visited
1687 // Do pre-visit work for root
1688 Node* n = split_if_with_blocks_pre(root);
1689 uint cnt = n->outcnt();
1690 uint i = 0;
1691
1692 while (true) {
1693 // Visit all children
1694 if (i < cnt) {
1695 Node* use = n->raw_out(i);
1696 ++i;
1697 if (use->outcnt() != 0 && !visited.test_set(use->_idx)) {
1698 // Now do pre-visit work for this use
1699 use = split_if_with_blocks_pre(use);
1700 nstack.push(n, i); // Save parent and next use's index.
1701 n = use; // Process all children of current use.
1702 cnt = use->outcnt();
1703 i = 0;
1704 }
1705 }
1706 else {
1707 // All of n's children have been processed, complete post-processing.
1708 if (cnt != 0 && !n->is_Con()) {
1709 assert(has_node(n), "no dead nodes")do { if (!(has_node(n))) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1709, "assert(" "has_node(n)" ") failed", "no dead nodes");
::breakpoint(); } } while (0)
;
1710 split_if_with_blocks_post(n);
1711 }
1712 if (must_throttle_split_if()) {
1713 nstack.clear();
1714 }
1715 if (nstack.is_empty()) {
1716 // Finished all nodes on stack.
1717 break;
1718 }
1719 // Get saved parent node and next use's index. Visit the rest of uses.
1720 n = nstack.node();
1721 cnt = n->outcnt();
1722 i = nstack.index();
1723 nstack.pop();
1724 }
1725 }
1726}
1727
1728
1729//=============================================================================
1730//
1731// C L O N E A L O O P B O D Y
1732//
1733
1734//------------------------------clone_iff--------------------------------------
1735// Passed in a Phi merging (recursively) some nearly equivalent Bool/Cmps.
1736// "Nearly" because all Nodes have been cloned from the original in the loop,
1737// but the fall-in edges to the Cmp are different. Clone bool/Cmp pairs
1738// through the Phi recursively, and return a Bool.
1739Node* PhaseIdealLoop::clone_iff(PhiNode *phi, IdealLoopTree *loop) {
1740
1741 // Convert this Phi into a Phi merging Bools
1742 uint i;
1743 for (i = 1; i < phi->req(); i++) {
1744 Node *b = phi->in(i);
1745 if (b->is_Phi()) {
1746 _igvn.replace_input_of(phi, i, clone_iff(b->as_Phi(), loop));
1747 } else {
1748 assert(b->is_Bool() || b->Opcode() == Op_Opaque4, "")do { if (!(b->is_Bool() || b->Opcode() == Op_Opaque4)) {
(*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1748, "assert(" "b->is_Bool() || b->Opcode() == Op_Opaque4"
") failed", ""); ::breakpoint(); } } while (0)
;
1749 }
1750 }
1751
1752 Node* n = phi->in(1);
1753 Node* sample_opaque = NULL__null;
1754 Node *sample_bool = NULL__null;
1755 if (n->Opcode() == Op_Opaque4) {
1756 sample_opaque = n;
1757 sample_bool = n->in(1);
1758 assert(sample_bool->is_Bool(), "wrong type")do { if (!(sample_bool->is_Bool())) { (*g_assert_poison) =
'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1758, "assert(" "sample_bool->is_Bool()" ") failed", "wrong type"
); ::breakpoint(); } } while (0)
;
1759 } else {
1760 sample_bool = n;
1761 }
1762 Node *sample_cmp = sample_bool->in(1);
1763
1764 // Make Phis to merge the Cmp's inputs.
1765 PhiNode *phi1 = new PhiNode(phi->in(0), Type::TOP);
1766 PhiNode *phi2 = new PhiNode(phi->in(0), Type::TOP);
1767 for (i = 1; i < phi->req(); i++) {
1768 Node *n1 = sample_opaque == NULL__null ? phi->in(i)->in(1)->in(1) : phi->in(i)->in(1)->in(1)->in(1);
1769 Node *n2 = sample_opaque == NULL__null ? phi->in(i)->in(1)->in(2) : phi->in(i)->in(1)->in(1)->in(2);
1770 phi1->set_req(i, n1);
1771 phi2->set_req(i, n2);
1772 phi1->set_type(phi1->type()->meet_speculative(n1->bottom_type()));
1773 phi2->set_type(phi2->type()->meet_speculative(n2->bottom_type()));
1774 }
1775 // See if these Phis have been made before.
1776 // Register with optimizer
1777 Node *hit1 = _igvn.hash_find_insert(phi1);
1778 if (hit1) { // Hit, toss just made Phi
1779 _igvn.remove_dead_node(phi1); // Remove new phi
1780 assert(hit1->is_Phi(), "" )do { if (!(hit1->is_Phi())) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1780, "assert(" "hit1->is_Phi()" ") failed", ""); ::breakpoint
(); } } while (0)
;
1781 phi1 = (PhiNode*)hit1; // Use existing phi
1782 } else { // Miss
1783 _igvn.register_new_node_with_optimizer(phi1);
1784 }
1785 Node *hit2 = _igvn.hash_find_insert(phi2);
1786 if (hit2) { // Hit, toss just made Phi
1787 _igvn.remove_dead_node(phi2); // Remove new phi
1788 assert(hit2->is_Phi(), "" )do { if (!(hit2->is_Phi())) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1788, "assert(" "hit2->is_Phi()" ") failed", ""); ::breakpoint
(); } } while (0)
;
1789 phi2 = (PhiNode*)hit2; // Use existing phi
1790 } else { // Miss
1791 _igvn.register_new_node_with_optimizer(phi2);
1792 }
1793 // Register Phis with loop/block info
1794 set_ctrl(phi1, phi->in(0));
1795 set_ctrl(phi2, phi->in(0));
1796 // Make a new Cmp
1797 Node *cmp = sample_cmp->clone();
1798 cmp->set_req(1, phi1);
1799 cmp->set_req(2, phi2);
1800 _igvn.register_new_node_with_optimizer(cmp);
1801 set_ctrl(cmp, phi->in(0));
1802
1803 // Make a new Bool
1804 Node *b = sample_bool->clone();
1805 b->set_req(1,cmp);
1806 _igvn.register_new_node_with_optimizer(b);
1807 set_ctrl(b, phi->in(0));
1808
1809 if (sample_opaque != NULL__null) {
1810 Node* opaque = sample_opaque->clone();
1811 opaque->set_req(1, b);
1812 _igvn.register_new_node_with_optimizer(opaque);
1813 set_ctrl(opaque, phi->in(0));
1814 return opaque;
1815 }
1816
1817 assert(b->is_Bool(), "")do { if (!(b->is_Bool())) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1817, "assert(" "b->is_Bool()" ") failed", ""); ::breakpoint
(); } } while (0)
;
1818 return b;
1819}
1820
1821//------------------------------clone_bool-------------------------------------
1822// Passed in a Phi merging (recursively) some nearly equivalent Bool/Cmps.
1823// "Nearly" because all Nodes have been cloned from the original in the loop,
1824// but the fall-in edges to the Cmp are different. Clone bool/Cmp pairs
1825// through the Phi recursively, and return a Bool.
1826CmpNode *PhaseIdealLoop::clone_bool( PhiNode *phi, IdealLoopTree *loop ) {
1827 uint i;
1828 // Convert this Phi into a Phi merging Bools
1829 for( i = 1; i < phi->req(); i++ ) {
1830 Node *b = phi->in(i);
1831 if( b->is_Phi() ) {
1832 _igvn.replace_input_of(phi, i, clone_bool( b->as_Phi(), loop ));
1833 } else {
1834 assert( b->is_Cmp() || b->is_top(), "inputs are all Cmp or TOP" )do { if (!(b->is_Cmp() || b->is_top())) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1834, "assert(" "b->is_Cmp() || b->is_top()" ") failed"
, "inputs are all Cmp or TOP"); ::breakpoint(); } } while (0)
;
1835 }
1836 }
1837
1838 Node *sample_cmp = phi->in(1);
1839
1840 // Make Phis to merge the Cmp's inputs.
1841 PhiNode *phi1 = new PhiNode( phi->in(0), Type::TOP );
1842 PhiNode *phi2 = new PhiNode( phi->in(0), Type::TOP );
1843 for( uint j = 1; j < phi->req(); j++ ) {
1844 Node *cmp_top = phi->in(j); // Inputs are all Cmp or TOP
1845 Node *n1, *n2;
1846 if( cmp_top->is_Cmp() ) {
1847 n1 = cmp_top->in(1);
1848 n2 = cmp_top->in(2);
1849 } else {
1850 n1 = n2 = cmp_top;
1851 }
1852 phi1->set_req( j, n1 );
1853 phi2->set_req( j, n2 );
1854 phi1->set_type(phi1->type()->meet_speculative(n1->bottom_type()));
1855 phi2->set_type(phi2->type()->meet_speculative(n2->bottom_type()));
1856 }
1857
1858 // See if these Phis have been made before.
1859 // Register with optimizer
1860 Node *hit1 = _igvn.hash_find_insert(phi1);
1861 if( hit1 ) { // Hit, toss just made Phi
1862 _igvn.remove_dead_node(phi1); // Remove new phi
1863 assert( hit1->is_Phi(), "" )do { if (!(hit1->is_Phi())) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1863, "assert(" "hit1->is_Phi()" ") failed", ""); ::breakpoint
(); } } while (0)
;
1864 phi1 = (PhiNode*)hit1; // Use existing phi
1865 } else { // Miss
1866 _igvn.register_new_node_with_optimizer(phi1);
1867 }
1868 Node *hit2 = _igvn.hash_find_insert(phi2);
1869 if( hit2 ) { // Hit, toss just made Phi
1870 _igvn.remove_dead_node(phi2); // Remove new phi
1871 assert( hit2->is_Phi(), "" )do { if (!(hit2->is_Phi())) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1871, "assert(" "hit2->is_Phi()" ") failed", ""); ::breakpoint
(); } } while (0)
;
1872 phi2 = (PhiNode*)hit2; // Use existing phi
1873 } else { // Miss
1874 _igvn.register_new_node_with_optimizer(phi2);
1875 }
1876 // Register Phis with loop/block info
1877 set_ctrl(phi1, phi->in(0));
1878 set_ctrl(phi2, phi->in(0));
1879 // Make a new Cmp
1880 Node *cmp = sample_cmp->clone();
1881 cmp->set_req( 1, phi1 );
1882 cmp->set_req( 2, phi2 );
1883 _igvn.register_new_node_with_optimizer(cmp);
1884 set_ctrl(cmp, phi->in(0));
1885
1886 assert( cmp->is_Cmp(), "" )do { if (!(cmp->is_Cmp())) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1886, "assert(" "cmp->is_Cmp()" ") failed", ""); ::breakpoint
(); } } while (0)
;
1887 return (CmpNode*)cmp;
1888}
1889
1890//------------------------------sink_use---------------------------------------
1891// If 'use' was in the loop-exit block, it now needs to be sunk
1892// below the post-loop merge point.
1893void PhaseIdealLoop::sink_use( Node *use, Node *post_loop ) {
1894 if (!use->is_CFG() && get_ctrl(use) == post_loop->in(2)) {
1895 set_ctrl(use, post_loop);
1896 for (DUIterator j = use->outs(); use->has_out(j); j++)
1897 sink_use(use->out(j), post_loop);
1898 }
1899}
1900
1901void PhaseIdealLoop::clone_loop_handle_data_uses(Node* old, Node_List &old_new,
1902 IdealLoopTree* loop, IdealLoopTree* outer_loop,
1903 Node_List*& split_if_set, Node_List*& split_bool_set,
1904 Node_List*& split_cex_set, Node_List& worklist,
1905 uint new_counter, CloneLoopMode mode) {
1906 Node* nnn = old_new[old->_idx];
1907 // Copy uses to a worklist, so I can munge the def-use info
1908 // with impunity.
1909 for (DUIterator_Fast jmax, j = old->fast_outs(jmax); j < jmax; j++)
1910 worklist.push(old->fast_out(j));
1911
1912 while( worklist.size() ) {
1913 Node *use = worklist.pop();
1914 if (!has_node(use)) continue; // Ignore dead nodes
1915 if (use->in(0) == C->top()) continue;
1916 IdealLoopTree *use_loop = get_loop( has_ctrl(use) ? get_ctrl(use) : use );
1917 // Check for data-use outside of loop - at least one of OLD or USE
1918 // must not be a CFG node.
1919#ifdef ASSERT1
1920 if (loop->_head->as_Loop()->is_strip_mined() && outer_loop->is_member(use_loop) && !loop->is_member(use_loop) && old_new[use->_idx] == NULL__null) {
1921 Node* sfpt = loop->_head->as_CountedLoop()->outer_safepoint();
1922 assert(mode != IgnoreStripMined, "incorrect cloning mode")do { if (!(mode != IgnoreStripMined)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1922, "assert(" "mode != IgnoreStripMined" ") failed", "incorrect cloning mode"
); ::breakpoint(); } } while (0)
;
1923 assert((mode == ControlAroundStripMined && use == sfpt) || !use->is_reachable_from_root(), "missed a node")do { if (!((mode == ControlAroundStripMined && use ==
sfpt) || !use->is_reachable_from_root())) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1923, "assert(" "(mode == ControlAroundStripMined && use == sfpt) || !use->is_reachable_from_root()"
") failed", "missed a node"); ::breakpoint(); } } while (0)
;
1924 }
1925#endif
1926 if (!loop->is_member(use_loop) && !outer_loop->is_member(use_loop) && (!old->is_CFG() || !use->is_CFG())) {
1927
1928 // If the Data use is an IF, that means we have an IF outside of the
1929 // loop that is switching on a condition that is set inside of the
1930 // loop. Happens if people set a loop-exit flag; then test the flag
1931 // in the loop to break the loop, then test is again outside of the
1932 // loop to determine which way the loop exited.
1933 // Loop predicate If node connects to Bool node through Opaque1 node.
1934 if (use->is_If() || use->is_CMove() || C->is_predicate_opaq(use) || use->Opcode() == Op_Opaque4) {
1935 // Since this code is highly unlikely, we lazily build the worklist
1936 // of such Nodes to go split.
1937 if (!split_if_set) {
1938 split_if_set = new Node_List();
1939 }
1940 split_if_set->push(use);
1941 }
1942 if (use->is_Bool()) {
1943 if (!split_bool_set) {
1944 split_bool_set = new Node_List();
1945 }
1946 split_bool_set->push(use);
1947 }
1948 if (use->Opcode() == Op_CreateEx) {
1949 if (!split_cex_set) {
1950 split_cex_set = new Node_List();
1951 }
1952 split_cex_set->push(use);
1953 }
1954
1955
1956 // Get "block" use is in
1957 uint idx = 0;
1958 while( use->in(idx) != old ) idx++;
1959 Node *prev = use->is_CFG() ? use : get_ctrl(use);
1960 assert(!loop->is_member(get_loop(prev)) && !outer_loop->is_member(get_loop(prev)), "" )do { if (!(!loop->is_member(get_loop(prev)) && !outer_loop
->is_member(get_loop(prev)))) { (*g_assert_poison) = 'X';;
report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1960, "assert(" "!loop->is_member(get_loop(prev)) && !outer_loop->is_member(get_loop(prev))"
") failed", ""); ::breakpoint(); } } while (0)
;
1961 Node *cfg = prev->_idx >= new_counter
1962 ? prev->in(2)
1963 : idom(prev);
1964 if( use->is_Phi() ) // Phi use is in prior block
1965 cfg = prev->in(idx); // NOT in block of Phi itself
1966 if (cfg->is_top()) { // Use is dead?
1967 _igvn.replace_input_of(use, idx, C->top());
1968 continue;
1969 }
1970
1971 // If use is referenced through control edge... (idx == 0)
1972 if (mode == IgnoreStripMined && idx == 0) {
1973 LoopNode *head = loop->_head->as_Loop();
1974 if (head->is_strip_mined() && is_dominator(head->outer_loop_exit(), prev)) {
1975 // That node is outside the inner loop, leave it outside the
1976 // outer loop as well to not confuse verification code.
1977 assert(!loop->_parent->is_member(use_loop), "should be out of the outer loop")do { if (!(!loop->_parent->is_member(use_loop))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 1977, "assert(" "!loop->_parent->is_member(use_loop)"
") failed", "should be out of the outer loop"); ::breakpoint
(); } } while (0)
;
1978 _igvn.replace_input_of(use, 0, head->outer_loop_exit());
1979 continue;
1980 }
1981 }
1982
1983 while(!outer_loop->is_member(get_loop(cfg))) {
1984 prev = cfg;
1985 cfg = cfg->_idx >= new_counter ? cfg->in(2) : idom(cfg);
1986 }
1987 // If the use occurs after merging several exits from the loop, then
1988 // old value must have dominated all those exits. Since the same old
1989 // value was used on all those exits we did not need a Phi at this
1990 // merge point. NOW we do need a Phi here. Each loop exit value
1991 // is now merged with the peeled body exit; each exit gets its own
1992 // private Phi and those Phis need to be merged here.
1993 Node *phi;
1994 if( prev->is_Region() ) {
1995 if( idx == 0 ) { // Updating control edge?
1996 phi = prev; // Just use existing control
1997 } else { // Else need a new Phi
1998 phi = PhiNode::make( prev, old );
1999 // Now recursively fix up the new uses of old!
2000 for( uint i = 1; i < prev->req(); i++ ) {
2001 worklist.push(phi); // Onto worklist once for each 'old' input
2002 }
2003 }
2004 } else {
2005 // Get new RegionNode merging old and new loop exits
2006 prev = old_new[prev->_idx];
2007 assert( prev, "just made this in step 7" )do { if (!(prev)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2007, "assert(" "prev" ") failed", "just made this in step 7"
); ::breakpoint(); } } while (0)
;
2008 if( idx == 0) { // Updating control edge?
2009 phi = prev; // Just use existing control
2010 } else { // Else need a new Phi
2011 // Make a new Phi merging data values properly
2012 phi = PhiNode::make( prev, old );
2013 phi->set_req( 1, nnn );
2014 }
2015 }
2016 // If inserting a new Phi, check for prior hits
2017 if( idx != 0 ) {
2018 Node *hit = _igvn.hash_find_insert(phi);
2019 if( hit == NULL__null ) {
2020 _igvn.register_new_node_with_optimizer(phi); // Register new phi
2021 } else { // or
2022 // Remove the new phi from the graph and use the hit
2023 _igvn.remove_dead_node(phi);
2024 phi = hit; // Use existing phi
2025 }
2026 set_ctrl(phi, prev);
2027 }
2028 // Make 'use' use the Phi instead of the old loop body exit value
2029 _igvn.replace_input_of(use, idx, phi);
2030 if( use->_idx >= new_counter ) { // If updating new phis
2031 // Not needed for correctness, but prevents a weak assert
2032 // in AddPNode from tripping (when we end up with different
2033 // base & derived Phis that will become the same after
2034 // IGVN does CSE).
2035 Node *hit = _igvn.hash_find_insert(use);
2036 if( hit ) // Go ahead and re-hash for hits.
2037 _igvn.replace_node( use, hit );
2038 }
2039
2040 // If 'use' was in the loop-exit block, it now needs to be sunk
2041 // below the post-loop merge point.
2042 sink_use( use, prev );
2043 }
2044 }
2045}
2046
2047static void clone_outer_loop_helper(Node* n, const IdealLoopTree *loop, const IdealLoopTree* outer_loop,
2048 const Node_List &old_new, Unique_Node_List& wq, PhaseIdealLoop* phase,
2049 bool check_old_new) {
2050 for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++) {
2051 Node* u = n->fast_out(j);
2052 assert(check_old_new || old_new[u->_idx] == NULL, "shouldn't have been cloned")do { if (!(check_old_new || old_new[u->_idx] == __null)) {
(*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2052, "assert(" "check_old_new || old_new[u->_idx] == __null"
") failed", "shouldn't have been cloned"); ::breakpoint(); }
} while (0)
;
2053 if (!u->is_CFG() && (!check_old_new || old_new[u->_idx] == NULL__null)) {
2054 Node* c = phase->get_ctrl(u);
2055 IdealLoopTree* u_loop = phase->get_loop(c);
2056 assert(!loop->is_member(u_loop), "can be in outer loop or out of both loops only")do { if (!(!loop->is_member(u_loop))) { (*g_assert_poison)
= 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2056, "assert(" "!loop->is_member(u_loop)" ") failed", "can be in outer loop or out of both loops only"
); ::breakpoint(); } } while (0)
;
2057 if (outer_loop->is_member(u_loop) ||
2058 // nodes pinned with control in the outer loop but not referenced from the safepoint must be moved out of
2059 // the outer loop too
2060 (u->in(0) != NULL__null && outer_loop->is_member(phase->get_loop(u->in(0))))) {
2061 wq.push(u);
2062 }
2063 }
2064 }
2065}
2066
2067void PhaseIdealLoop::clone_outer_loop(LoopNode* head, CloneLoopMode mode, IdealLoopTree *loop,
2068 IdealLoopTree* outer_loop, int dd, Node_List &old_new,
2069 Node_List& extra_data_nodes) {
2070 if (head->is_strip_mined() && mode != IgnoreStripMined) {
2071 CountedLoopNode* cl = head->as_CountedLoop();
2072 Node* l = cl->outer_loop();
2073 Node* tail = cl->outer_loop_tail();
2074 IfNode* le = cl->outer_loop_end();
2075 Node* sfpt = cl->outer_safepoint();
2076 CountedLoopEndNode* cle = cl->loopexit();
2077 CountedLoopNode* new_cl = old_new[cl->_idx]->as_CountedLoop();
2078 CountedLoopEndNode* new_cle = new_cl->as_CountedLoop()->loopexit_or_null();
2079 Node* cle_out = cle->proj_out(false);
2080
2081 Node* new_sfpt = NULL__null;
2082 Node* new_cle_out = cle_out->clone();
2083 old_new.map(cle_out->_idx, new_cle_out);
2084 if (mode == CloneIncludesStripMined) {
2085 // clone outer loop body
2086 Node* new_l = l->clone();
2087 Node* new_tail = tail->clone();
2088 IfNode* new_le = le->clone()->as_If();
2089 new_sfpt = sfpt->clone();
2090
2091 set_loop(new_l, outer_loop->_parent);
2092 set_idom(new_l, new_l->in(LoopNode::EntryControl), dd);
2093 set_loop(new_cle_out, outer_loop->_parent);
2094 set_idom(new_cle_out, new_cle, dd);
2095 set_loop(new_sfpt, outer_loop->_parent);
2096 set_idom(new_sfpt, new_cle_out, dd);
2097 set_loop(new_le, outer_loop->_parent);
2098 set_idom(new_le, new_sfpt, dd);
2099 set_loop(new_tail, outer_loop->_parent);
2100 set_idom(new_tail, new_le, dd);
2101 set_idom(new_cl, new_l, dd);
2102
2103 old_new.map(l->_idx, new_l);
2104 old_new.map(tail->_idx, new_tail);
2105 old_new.map(le->_idx, new_le);
2106 old_new.map(sfpt->_idx, new_sfpt);
2107
2108 new_l->set_req(LoopNode::LoopBackControl, new_tail);
2109 new_l->set_req(0, new_l);
2110 new_tail->set_req(0, new_le);
2111 new_le->set_req(0, new_sfpt);
2112 new_sfpt->set_req(0, new_cle_out);
2113 new_cle_out->set_req(0, new_cle);
2114 new_cl->set_req(LoopNode::EntryControl, new_l);
2115
2116 _igvn.register_new_node_with_optimizer(new_l);
2117 _igvn.register_new_node_with_optimizer(new_tail);
2118 _igvn.register_new_node_with_optimizer(new_le);
2119 } else {
2120 Node *newhead = old_new[loop->_head->_idx];
2121 newhead->as_Loop()->clear_strip_mined();
2122 _igvn.replace_input_of(newhead, LoopNode::EntryControl, newhead->in(LoopNode::EntryControl)->in(LoopNode::EntryControl));
2123 set_idom(newhead, newhead->in(LoopNode::EntryControl), dd);
2124 }
2125 // Look at data node that were assigned a control in the outer
2126 // loop: they are kept in the outer loop by the safepoint so start
2127 // from the safepoint node's inputs.
2128 IdealLoopTree* outer_loop = get_loop(l);
2129 Node_Stack stack(2);
2130 stack.push(sfpt, 1);
2131 uint new_counter = C->unique();
2132 while (stack.size() > 0) {
2133 Node* n = stack.node();
2134 uint i = stack.index();
2135 while (i < n->req() &&
2136 (n->in(i) == NULL__null ||
2137 !has_ctrl(n->in(i)) ||
2138 get_loop(get_ctrl(n->in(i))) != outer_loop ||
2139 (old_new[n->in(i)->_idx] != NULL__null && old_new[n->in(i)->_idx]->_idx >= new_counter))) {
2140 i++;
2141 }
2142 if (i < n->req()) {
2143 stack.set_index(i+1);
2144 stack.push(n->in(i), 0);
2145 } else {
2146 assert(old_new[n->_idx] == NULL || n == sfpt || old_new[n->_idx]->_idx < new_counter, "no clone yet")do { if (!(old_new[n->_idx] == __null || n == sfpt || old_new
[n->_idx]->_idx < new_counter)) { (*g_assert_poison)
= 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2146, "assert(" "old_new[n->_idx] == __null || n == sfpt || old_new[n->_idx]->_idx < new_counter"
") failed", "no clone yet"); ::breakpoint(); } } while (0)
;
2147 Node* m = n == sfpt ? new_sfpt : n->clone();
2148 if (m != NULL__null) {
2149 for (uint i = 0; i < n->req(); i++) {
2150 if (m->in(i) != NULL__null && old_new[m->in(i)->_idx] != NULL__null) {
2151 m->set_req(i, old_new[m->in(i)->_idx]);
2152 }
2153 }
2154 } else {
2155 assert(n == sfpt && mode != CloneIncludesStripMined, "where's the safepoint clone?")do { if (!(n == sfpt && mode != CloneIncludesStripMined
)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2155, "assert(" "n == sfpt && mode != CloneIncludesStripMined"
") failed", "where's the safepoint clone?"); ::breakpoint();
} } while (0)
;
2156 }
2157 if (n != sfpt) {
2158 extra_data_nodes.push(n);
2159 _igvn.register_new_node_with_optimizer(m);
2160 assert(get_ctrl(n) == cle_out, "what other control?")do { if (!(get_ctrl(n) == cle_out)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2160, "assert(" "get_ctrl(n) == cle_out" ") failed", "what other control?"
); ::breakpoint(); } } while (0)
;
2161 set_ctrl(m, new_cle_out);
2162 old_new.map(n->_idx, m);
2163 }
2164 stack.pop();
2165 }
2166 }
2167 if (mode == CloneIncludesStripMined) {
2168 _igvn.register_new_node_with_optimizer(new_sfpt);
2169 _igvn.register_new_node_with_optimizer(new_cle_out);
2170 }
2171 // Some other transformation may have pessimistically assign some
2172 // data nodes to the outer loop. Set their control so they are out
2173 // of the outer loop.
2174 ResourceMark rm;
2175 Unique_Node_List wq;
2176 for (uint i = 0; i < extra_data_nodes.size(); i++) {
2177 Node* old = extra_data_nodes.at(i);
2178 clone_outer_loop_helper(old, loop, outer_loop, old_new, wq, this, true);
2179 }
2180
2181 Node* inner_out = sfpt->in(0);
2182 if (inner_out->outcnt() > 1) {
2183 clone_outer_loop_helper(inner_out, loop, outer_loop, old_new, wq, this, true);
2184 }
2185
2186 Node* new_ctrl = cl->outer_loop_exit();
2187 assert(get_loop(new_ctrl) != outer_loop, "must be out of the loop nest")do { if (!(get_loop(new_ctrl) != outer_loop)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2187, "assert(" "get_loop(new_ctrl) != outer_loop" ") failed"
, "must be out of the loop nest"); ::breakpoint(); } } while (
0)
;
2188 for (uint i = 0; i < wq.size(); i++) {
2189 Node* n = wq.at(i);
2190 set_ctrl(n, new_ctrl);
2191 if (n->in(0) != NULL__null) {
2192 _igvn.replace_input_of(n, 0, new_ctrl);
2193 }
2194 clone_outer_loop_helper(n, loop, outer_loop, old_new, wq, this, false);
2195 }
2196 } else {
2197 Node *newhead = old_new[loop->_head->_idx];
2198 set_idom(newhead, newhead->in(LoopNode::EntryControl), dd);
2199 }
2200}
2201
2202//------------------------------clone_loop-------------------------------------
2203//
2204// C L O N E A L O O P B O D Y
2205//
2206// This is the basic building block of the loop optimizations. It clones an
2207// entire loop body. It makes an old_new loop body mapping; with this mapping
2208// you can find the new-loop equivalent to an old-loop node. All new-loop
2209// nodes are exactly equal to their old-loop counterparts, all edges are the
2210// same. All exits from the old-loop now have a RegionNode that merges the
2211// equivalent new-loop path. This is true even for the normal "loop-exit"
2212// condition. All uses of loop-invariant old-loop values now come from (one
2213// or more) Phis that merge their new-loop equivalents.
2214//
2215// This operation leaves the graph in an illegal state: there are two valid
2216// control edges coming from the loop pre-header to both loop bodies. I'll
2217// definitely have to hack the graph after running this transform.
2218//
2219// From this building block I will further edit edges to perform loop peeling
2220// or loop unrolling or iteration splitting (Range-Check-Elimination), etc.
2221//
2222// Parameter side_by_size_idom:
2223// When side_by_size_idom is NULL, the dominator tree is constructed for
2224// the clone loop to dominate the original. Used in construction of
2225// pre-main-post loop sequence.
2226// When nonnull, the clone and original are side-by-side, both are
2227// dominated by the side_by_side_idom node. Used in construction of
2228// unswitched loops.
2229void PhaseIdealLoop::clone_loop( IdealLoopTree *loop, Node_List &old_new, int dd,
2230 CloneLoopMode mode, Node* side_by_side_idom) {
2231
2232 LoopNode* head = loop->_head->as_Loop();
2233 head->verify_strip_mined(1);
2234
2235 if (C->do_vector_loop() && PrintOpto) {
2236 const char* mname = C->method()->name()->as_quoted_ascii();
2237 if (mname != NULL__null) {
2238 tty->print("PhaseIdealLoop::clone_loop: for vectorize method %s\n", mname);
2239 }
2240 }
2241
2242 CloneMap& cm = C->clone_map();
2243 Dict* dict = cm.dict();
Value stored to 'dict' during its initialization is never read
2244 if (C->do_vector_loop()) {
2245 cm.set_clone_idx(cm.max_gen()+1);
2246#ifndef PRODUCT
2247 if (PrintOpto) {
2248 tty->print_cr("PhaseIdealLoop::clone_loop: _clone_idx %d", cm.clone_idx());
2249 loop->dump_head();
2250 }
2251#endif
2252 }
2253
2254 // Step 1: Clone the loop body. Make the old->new mapping.
2255 uint i;
2256 for (i = 0; i < loop->_body.size(); i++) {
2257 Node* old = loop->_body.at(i);
2258 Node* nnn = old->clone();
2259 old_new.map(old->_idx, nnn);
2260 if (old->is_reduction()) {
2261 // Reduction flag is not copied by default. Copy it here when cloning the entire loop body.
2262 nnn->add_flag(Node::Flag_is_reduction);
2263 }
2264 if (C->do_vector_loop()) {
2265 cm.verify_insert_and_clone(old, nnn, cm.clone_idx());
2266 }
2267 _igvn.register_new_node_with_optimizer(nnn);
2268 }
2269
2270 IdealLoopTree* outer_loop = (head->is_strip_mined() && mode != IgnoreStripMined) ? get_loop(head->as_CountedLoop()->outer_loop()) : loop;
2271
2272 // Step 2: Fix the edges in the new body. If the old input is outside the
2273 // loop use it. If the old input is INside the loop, use the corresponding
2274 // new node instead.
2275 for( i = 0; i < loop->_body.size(); i++ ) {
2276 Node *old = loop->_body.at(i);
2277 Node *nnn = old_new[old->_idx];
2278 // Fix CFG/Loop controlling the new node
2279 if (has_ctrl(old)) {
2280 set_ctrl(nnn, old_new[get_ctrl(old)->_idx]);
2281 } else {
2282 set_loop(nnn, outer_loop->_parent);
2283 if (old->outcnt() > 0) {
2284 set_idom( nnn, old_new[idom(old)->_idx], dd );
2285 }
2286 }
2287 // Correct edges to the new node
2288 for( uint j = 0; j < nnn->req(); j++ ) {
2289 Node *n = nnn->in(j);
2290 if( n ) {
2291 IdealLoopTree *old_in_loop = get_loop( has_ctrl(n) ? get_ctrl(n) : n );
2292 if( loop->is_member( old_in_loop ) )
2293 nnn->set_req(j, old_new[n->_idx]);
2294 }
2295 }
2296 _igvn.hash_find_insert(nnn);
2297 }
2298
2299 Node_List extra_data_nodes; // data nodes in the outer strip mined loop
2300 clone_outer_loop(head, mode, loop, outer_loop, dd, old_new, extra_data_nodes);
2301
2302 // Step 3: Now fix control uses. Loop varying control uses have already
2303 // been fixed up (as part of all input edges in Step 2). Loop invariant
2304 // control uses must be either an IfFalse or an IfTrue. Make a merge
2305 // point to merge the old and new IfFalse/IfTrue nodes; make the use
2306 // refer to this.
2307 Node_List worklist;
2308 uint new_counter = C->unique();
2309 for( i = 0; i < loop->_body.size(); i++ ) {
2310 Node* old = loop->_body.at(i);
2311 if( !old->is_CFG() ) continue;
2312
2313 // Copy uses to a worklist, so I can munge the def-use info
2314 // with impunity.
2315 for (DUIterator_Fast jmax, j = old->fast_outs(jmax); j < jmax; j++)
2316 worklist.push(old->fast_out(j));
2317
2318 while( worklist.size() ) { // Visit all uses
2319 Node *use = worklist.pop();
2320 if (!has_node(use)) continue; // Ignore dead nodes
2321 IdealLoopTree *use_loop = get_loop( has_ctrl(use) ? get_ctrl(use) : use );
2322 if( !loop->is_member( use_loop ) && use->is_CFG() ) {
2323 // Both OLD and USE are CFG nodes here.
2324 assert( use->is_Proj(), "" )do { if (!(use->is_Proj())) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2324, "assert(" "use->is_Proj()" ") failed", ""); ::breakpoint
(); } } while (0)
;
2325 Node* nnn = old_new[old->_idx];
2326
2327 Node* newuse = NULL__null;
2328 if (head->is_strip_mined() && mode != IgnoreStripMined) {
2329 CountedLoopNode* cl = head->as_CountedLoop();
2330 CountedLoopEndNode* cle = cl->loopexit();
2331 Node* cle_out = cle->proj_out_or_null(false);
2332 if (use == cle_out) {
2333 IfNode* le = cl->outer_loop_end();
2334 use = le->proj_out(false);
2335 use_loop = get_loop(use);
2336 if (mode == CloneIncludesStripMined) {
2337 nnn = old_new[le->_idx];
2338 } else {
2339 newuse = old_new[cle_out->_idx];
2340 }
2341 }
2342 }
2343 if (newuse == NULL__null) {
2344 newuse = use->clone();
2345 }
2346
2347 // Clone the loop exit control projection
2348 if (C->do_vector_loop()) {
2349 cm.verify_insert_and_clone(use, newuse, cm.clone_idx());
2350 }
2351 newuse->set_req(0,nnn);
2352 _igvn.register_new_node_with_optimizer(newuse);
2353 set_loop(newuse, use_loop);
2354 set_idom(newuse, nnn, dom_depth(nnn) + 1 );
2355
2356 // We need a Region to merge the exit from the peeled body and the
2357 // exit from the old loop body.
2358 RegionNode *r = new RegionNode(3);
2359 // Map the old use to the new merge point
2360 old_new.map( use->_idx, r );
2361 uint dd_r = MIN2(dom_depth(newuse),dom_depth(use));
2362 assert( dd_r >= dom_depth(dom_lca(newuse,use)), "" )do { if (!(dd_r >= dom_depth(dom_lca(newuse,use)))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2362, "assert(" "dd_r >= dom_depth(dom_lca(newuse,use))"
") failed", ""); ::breakpoint(); } } while (0)
;
2363
2364 // The original user of 'use' uses 'r' instead.
2365 for (DUIterator_Last lmin, l = use->last_outs(lmin); l >= lmin;) {
2366 Node* useuse = use->last_out(l);
2367 _igvn.rehash_node_delayed(useuse);
2368 uint uses_found = 0;
2369 if( useuse->in(0) == use ) {
2370 useuse->set_req(0, r);
2371 uses_found++;
2372 if( useuse->is_CFG() ) {
2373 // This is not a dom_depth > dd_r because when new
2374 // control flow is constructed by a loop opt, a node and
2375 // its dominator can end up at the same dom_depth
2376 assert(dom_depth(useuse) >= dd_r, "")do { if (!(dom_depth(useuse) >= dd_r)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2376, "assert(" "dom_depth(useuse) >= dd_r" ") failed", ""
); ::breakpoint(); } } while (0)
;
2377 set_idom(useuse, r, dom_depth(useuse));
2378 }
2379 }
2380 for( uint k = 1; k < useuse->req(); k++ ) {
2381 if( useuse->in(k) == use ) {
2382 useuse->set_req(k, r);
2383 uses_found++;
2384 if (useuse->is_Loop() && k == LoopNode::EntryControl) {
2385 // This is not a dom_depth > dd_r because when new
2386 // control flow is constructed by a loop opt, a node
2387 // and its dominator can end up at the same dom_depth
2388 assert(dom_depth(useuse) >= dd_r , "")do { if (!(dom_depth(useuse) >= dd_r)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2388, "assert(" "dom_depth(useuse) >= dd_r" ") failed", ""
); ::breakpoint(); } } while (0)
;
2389 set_idom(useuse, r, dom_depth(useuse));
2390 }
2391 }
2392 }
2393 l -= uses_found; // we deleted 1 or more copies of this edge
2394 }
2395
2396 // Now finish up 'r'
2397 r->set_req( 1, newuse );
2398 r->set_req( 2, use );
2399 _igvn.register_new_node_with_optimizer(r);
2400 set_loop(r, use_loop);
2401 set_idom(r, !side_by_side_idom ? newuse->in(0) : side_by_side_idom, dd_r);
2402 } // End of if a loop-exit test
2403 }
2404 }
2405
2406 // Step 4: If loop-invariant use is not control, it must be dominated by a
2407 // loop exit IfFalse/IfTrue. Find "proper" loop exit. Make a Region
2408 // there if needed. Make a Phi there merging old and new used values.
2409 Node_List *split_if_set = NULL__null;
2410 Node_List *split_bool_set = NULL__null;
2411 Node_List *split_cex_set = NULL__null;
2412 for( i = 0; i < loop->_body.size(); i++ ) {
2413 Node* old = loop->_body.at(i);
2414 clone_loop_handle_data_uses(old, old_new, loop, outer_loop, split_if_set,
2415 split_bool_set, split_cex_set, worklist, new_counter,
2416 mode);
2417 }
2418
2419 for (i = 0; i < extra_data_nodes.size(); i++) {
2420 Node* old = extra_data_nodes.at(i);
2421 clone_loop_handle_data_uses(old, old_new, loop, outer_loop, split_if_set,
2422 split_bool_set, split_cex_set, worklist, new_counter,
2423 mode);
2424 }
2425
2426 // Check for IFs that need splitting/cloning. Happens if an IF outside of
2427 // the loop uses a condition set in the loop. The original IF probably
2428 // takes control from one or more OLD Regions (which in turn get from NEW
2429 // Regions). In any case, there will be a set of Phis for each merge point
2430 // from the IF up to where the original BOOL def exists the loop.
2431 if (split_if_set) {
2432 while (split_if_set->size()) {
2433 Node *iff = split_if_set->pop();
2434 if (iff->in(1)->is_Phi()) {
2435 Node *b = clone_iff(iff->in(1)->as_Phi(), loop);
2436 _igvn.replace_input_of(iff, 1, b);
2437 }
2438 }
2439 }
2440 if (split_bool_set) {
2441 while (split_bool_set->size()) {
2442 Node *b = split_bool_set->pop();
2443 Node *phi = b->in(1);
2444 assert(phi->is_Phi(), "")do { if (!(phi->is_Phi())) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2444, "assert(" "phi->is_Phi()" ") failed", ""); ::breakpoint
(); } } while (0)
;
2445 CmpNode *cmp = clone_bool((PhiNode*)phi, loop);
2446 _igvn.replace_input_of(b, 1, cmp);
2447 }
2448 }
2449 if (split_cex_set) {
2450 while (split_cex_set->size()) {
2451 Node *b = split_cex_set->pop();
2452 assert(b->in(0)->is_Region(), "")do { if (!(b->in(0)->is_Region())) { (*g_assert_poison)
= 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2452, "assert(" "b->in(0)->is_Region()" ") failed", ""
); ::breakpoint(); } } while (0)
;
2453 assert(b->in(1)->is_Phi(), "")do { if (!(b->in(1)->is_Phi())) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2453, "assert(" "b->in(1)->is_Phi()" ") failed", "");
::breakpoint(); } } while (0)
;
2454 assert(b->in(0)->in(0) == b->in(1)->in(0), "")do { if (!(b->in(0)->in(0) == b->in(1)->in(0))) {
(*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2454, "assert(" "b->in(0)->in(0) == b->in(1)->in(0)"
") failed", ""); ::breakpoint(); } } while (0)
;
2455 split_up(b, b->in(0), NULL__null);
2456 }
2457 }
2458
2459}
2460
2461
2462//---------------------- stride_of_possible_iv -------------------------------------
2463// Looks for an iff/bool/comp with one operand of the compare
2464// being a cycle involving an add and a phi,
2465// with an optional truncation (left-shift followed by a right-shift)
2466// of the add. Returns zero if not an iv.
2467int PhaseIdealLoop::stride_of_possible_iv(Node* iff) {
2468 Node* trunc1 = NULL__null;
2469 Node* trunc2 = NULL__null;
2470 const TypeInteger* ttype = NULL__null;
2471 if (!iff->is_If() || iff->in(1) == NULL__null || !iff->in(1)->is_Bool()) {
2472 return 0;
2473 }
2474 BoolNode* bl = iff->in(1)->as_Bool();
2475 Node* cmp = bl->in(1);
2476 if (!cmp || (cmp->Opcode() != Op_CmpI && cmp->Opcode() != Op_CmpU)) {
2477 return 0;
2478 }
2479 // Must have an invariant operand
2480 if (is_member(get_loop(iff), get_ctrl(cmp->in(2)))) {
2481 return 0;
2482 }
2483 Node* add2 = NULL__null;
2484 Node* cmp1 = cmp->in(1);
2485 if (cmp1->is_Phi()) {
2486 // (If (Bool (CmpX phi:(Phi ...(Optional-trunc(AddI phi add2))) )))
2487 Node* phi = cmp1;
2488 for (uint i = 1; i < phi->req(); i++) {
2489 Node* in = phi->in(i);
2490 Node* add = CountedLoopNode::match_incr_with_optional_truncation(in,
2491 &trunc1, &trunc2, &ttype, T_INT);
2492 if (add && add->in(1) == phi) {
2493 add2 = add->in(2);
2494 break;
2495 }
2496 }
2497 } else {
2498 // (If (Bool (CmpX addtrunc:(Optional-trunc((AddI (Phi ...addtrunc...) add2)) )))
2499 Node* addtrunc = cmp1;
2500 Node* add = CountedLoopNode::match_incr_with_optional_truncation(addtrunc,
2501 &trunc1, &trunc2, &ttype, T_INT);
2502 if (add && add->in(1)->is_Phi()) {
2503 Node* phi = add->in(1);
2504 for (uint i = 1; i < phi->req(); i++) {
2505 if (phi->in(i) == addtrunc) {
2506 add2 = add->in(2);
2507 break;
2508 }
2509 }
2510 }
2511 }
2512 if (add2 != NULL__null) {
2513 const TypeInt* add2t = _igvn.type(add2)->is_int();
2514 if (add2t->is_con()) {
2515 return add2t->get_con();
2516 }
2517 }
2518 return 0;
2519}
2520
2521
2522//---------------------- stay_in_loop -------------------------------------
2523// Return the (unique) control output node that's in the loop (if it exists.)
2524Node* PhaseIdealLoop::stay_in_loop( Node* n, IdealLoopTree *loop) {
2525 Node* unique = NULL__null;
2526 if (!n) return NULL__null;
2527 for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) {
2528 Node* use = n->fast_out(i);
2529 if (!has_ctrl(use) && loop->is_member(get_loop(use))) {
2530 if (unique != NULL__null) {
2531 return NULL__null;
2532 }
2533 unique = use;
2534 }
2535 }
2536 return unique;
2537}
2538
2539//------------------------------ register_node -------------------------------------
2540// Utility to register node "n" with PhaseIdealLoop
2541void PhaseIdealLoop::register_node(Node* n, IdealLoopTree *loop, Node* pred, int ddepth) {
2542 _igvn.register_new_node_with_optimizer(n);
2543 loop->_body.push(n);
2544 if (n->is_CFG()) {
2545 set_loop(n, loop);
2546 set_idom(n, pred, ddepth);
2547 } else {
2548 set_ctrl(n, pred);
2549 }
2550}
2551
2552//------------------------------ proj_clone -------------------------------------
2553// Utility to create an if-projection
2554ProjNode* PhaseIdealLoop::proj_clone(ProjNode* p, IfNode* iff) {
2555 ProjNode* c = p->clone()->as_Proj();
2556 c->set_req(0, iff);
2557 return c;
2558}
2559
2560//------------------------------ short_circuit_if -------------------------------------
2561// Force the iff control output to be the live_proj
2562Node* PhaseIdealLoop::short_circuit_if(IfNode* iff, ProjNode* live_proj) {
2563 guarantee(live_proj != NULL, "null projection")do { if (!(live_proj != __null)) { (*g_assert_poison) = 'X';;
report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2563, "guarantee(" "live_proj != NULL" ") failed", "null projection"
); ::breakpoint(); } } while (0)
;
2564 int proj_con = live_proj->_con;
2565 assert(proj_con == 0 || proj_con == 1, "false or true projection")do { if (!(proj_con == 0 || proj_con == 1)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2565, "assert(" "proj_con == 0 || proj_con == 1" ") failed"
, "false or true projection"); ::breakpoint(); } } while (0)
;
2566 Node *con = _igvn.intcon(proj_con);
2567 set_ctrl(con, C->root());
2568 if (iff) {
2569 iff->set_req(1, con);
2570 }
2571 return con;
2572}
2573
2574//------------------------------ insert_if_before_proj -------------------------------------
2575// Insert a new if before an if projection (* - new node)
2576//
2577// before
2578// if(test)
2579// / \
2580// v v
2581// other-proj proj (arg)
2582//
2583// after
2584// if(test)
2585// / \
2586// / v
2587// | * proj-clone
2588// v |
2589// other-proj v
2590// * new_if(relop(cmp[IU](left,right)))
2591// / \
2592// v v
2593// * new-proj proj
2594// (returned)
2595//
2596ProjNode* PhaseIdealLoop::insert_if_before_proj(Node* left, bool Signed, BoolTest::mask relop, Node* right, ProjNode* proj) {
2597 IfNode* iff = proj->in(0)->as_If();
2598 IdealLoopTree *loop = get_loop(proj);
2599 ProjNode *other_proj = iff->proj_out(!proj->is_IfTrue())->as_Proj();
2600 int ddepth = dom_depth(proj);
2601
2602 _igvn.rehash_node_delayed(iff);
2603 _igvn.rehash_node_delayed(proj);
2604
2605 proj->set_req(0, NULL__null); // temporary disconnect
2606 ProjNode* proj2 = proj_clone(proj, iff);
2607 register_node(proj2, loop, iff, ddepth);
2608
2609 Node* cmp = Signed ? (Node*) new CmpINode(left, right) : (Node*) new CmpUNode(left, right);
2610 register_node(cmp, loop, proj2, ddepth);
2611
2612 BoolNode* bol = new BoolNode(cmp, relop);
2613 register_node(bol, loop, proj2, ddepth);
2614
2615 int opcode = iff->Opcode();
2616 assert(opcode == Op_If || opcode == Op_RangeCheck, "unexpected opcode")do { if (!(opcode == Op_If || opcode == Op_RangeCheck)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2616, "assert(" "opcode == Op_If || opcode == Op_RangeCheck"
") failed", "unexpected opcode"); ::breakpoint(); } } while (
0)
;
2617 IfNode* new_if = (opcode == Op_If) ? new IfNode(proj2, bol, iff->_prob, iff->_fcnt):
2618 new RangeCheckNode(proj2, bol, iff->_prob, iff->_fcnt);
2619 register_node(new_if, loop, proj2, ddepth);
2620
2621 proj->set_req(0, new_if); // reattach
2622 set_idom(proj, new_if, ddepth);
2623
2624 ProjNode* new_exit = proj_clone(other_proj, new_if)->as_Proj();
2625 guarantee(new_exit != NULL, "null exit node")do { if (!(new_exit != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2625, "guarantee(" "new_exit != NULL" ") failed", "null exit node"
); ::breakpoint(); } } while (0)
;
2626 register_node(new_exit, get_loop(other_proj), new_if, ddepth);
2627
2628 return new_exit;
2629}
2630
2631//------------------------------ insert_region_before_proj -------------------------------------
2632// Insert a region before an if projection (* - new node)
2633//
2634// before
2635// if(test)
2636// / |
2637// v |
2638// proj v
2639// other-proj
2640//
2641// after
2642// if(test)
2643// / |
2644// v |
2645// * proj-clone v
2646// | other-proj
2647// v
2648// * new-region
2649// |
2650// v
2651// * dum_if
2652// / \
2653// v \
2654// * dum-proj v
2655// proj
2656//
2657RegionNode* PhaseIdealLoop::insert_region_before_proj(ProjNode* proj) {
2658 IfNode* iff = proj->in(0)->as_If();
2659 IdealLoopTree *loop = get_loop(proj);
2660 ProjNode *other_proj = iff->proj_out(!proj->is_IfTrue())->as_Proj();
2661 int ddepth = dom_depth(proj);
2662
2663 _igvn.rehash_node_delayed(iff);
2664 _igvn.rehash_node_delayed(proj);
2665
2666 proj->set_req(0, NULL__null); // temporary disconnect
2667 ProjNode* proj2 = proj_clone(proj, iff);
2668 register_node(proj2, loop, iff, ddepth);
2669
2670 RegionNode* reg = new RegionNode(2);
2671 reg->set_req(1, proj2);
2672 register_node(reg, loop, iff, ddepth);
2673
2674 IfNode* dum_if = new IfNode(reg, short_circuit_if(NULL__null, proj), iff->_prob, iff->_fcnt);
2675 register_node(dum_if, loop, reg, ddepth);
2676
2677 proj->set_req(0, dum_if); // reattach
2678 set_idom(proj, dum_if, ddepth);
2679
2680 ProjNode* dum_proj = proj_clone(other_proj, dum_if);
2681 register_node(dum_proj, loop, dum_if, ddepth);
2682
2683 return reg;
2684}
2685
2686//------------------------------ insert_cmpi_loop_exit -------------------------------------
2687// Clone a signed compare loop exit from an unsigned compare and
2688// insert it before the unsigned cmp on the stay-in-loop path.
2689// All new nodes inserted in the dominator tree between the original
2690// if and it's projections. The original if test is replaced with
2691// a constant to force the stay-in-loop path.
2692//
2693// This is done to make sure that the original if and it's projections
2694// still dominate the same set of control nodes, that the ctrl() relation
2695// from data nodes to them is preserved, and that their loop nesting is
2696// preserved.
2697//
2698// before
2699// if(i <u limit) unsigned compare loop exit
2700// / |
2701// v v
2702// exit-proj stay-in-loop-proj
2703//
2704// after
2705// if(stay-in-loop-const) original if
2706// / |
2707// / v
2708// / if(i < limit) new signed test
2709// / / |
2710// / / v
2711// / / if(i <u limit) new cloned unsigned test
2712// / / / |
2713// v v v |
2714// region |
2715// | |
2716// dum-if |
2717// / | |
2718// ether | |
2719// v v
2720// exit-proj stay-in-loop-proj
2721//
2722IfNode* PhaseIdealLoop::insert_cmpi_loop_exit(IfNode* if_cmpu, IdealLoopTree *loop) {
2723 const bool Signed = true;
2724 const bool Unsigned = false;
2725
2726 BoolNode* bol = if_cmpu->in(1)->as_Bool();
2727 if (bol->_test._test != BoolTest::lt) return NULL__null;
2728 CmpNode* cmpu = bol->in(1)->as_Cmp();
2729 if (cmpu->Opcode() != Op_CmpU) return NULL__null;
2730 int stride = stride_of_possible_iv(if_cmpu);
2731 if (stride == 0) return NULL__null;
2732
2733 Node* lp_proj = stay_in_loop(if_cmpu, loop);
2734 guarantee(lp_proj != NULL, "null loop node")do { if (!(lp_proj != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2734, "guarantee(" "lp_proj != NULL" ") failed", "null loop node"
); ::breakpoint(); } } while (0)
;
2735
2736 ProjNode* lp_continue = lp_proj->as_Proj();
2737 ProjNode* lp_exit = if_cmpu->proj_out(!lp_continue->is_IfTrue())->as_Proj();
2738 if (!lp_exit->is_IfFalse()) {
2739 // The loop exit condition is (i <u limit) ==> (i >= 0 && i < limit).
2740 // We therefore can't add a single exit condition.
2741 return NULL__null;
2742 }
2743 // The loop exit condition is !(i <u limit) ==> (i < 0 || i >= limit).
2744 // Split out the exit condition (i < 0) for stride < 0 or (i >= limit) for stride > 0.
2745 Node* limit = NULL__null;
2746 if (stride > 0) {
2747 limit = cmpu->in(2);
2748 } else {
2749 limit = _igvn.makecon(TypeInt::ZERO);
2750 set_ctrl(limit, C->root());
2751 }
2752 // Create a new region on the exit path
2753 RegionNode* reg = insert_region_before_proj(lp_exit);
2754 guarantee(reg != NULL, "null region node")do { if (!(reg != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2754, "guarantee(" "reg != NULL" ") failed", "null region node"
); ::breakpoint(); } } while (0)
;
2755
2756 // Clone the if-cmpu-true-false using a signed compare
2757 BoolTest::mask rel_i = stride > 0 ? bol->_test._test : BoolTest::ge;
2758 ProjNode* cmpi_exit = insert_if_before_proj(cmpu->in(1), Signed, rel_i, limit, lp_continue);
2759 reg->add_req(cmpi_exit);
2760
2761 // Clone the if-cmpu-true-false
2762 BoolTest::mask rel_u = bol->_test._test;
2763 ProjNode* cmpu_exit = insert_if_before_proj(cmpu->in(1), Unsigned, rel_u, cmpu->in(2), lp_continue);
2764 reg->add_req(cmpu_exit);
2765
2766 // Force original if to stay in loop.
2767 short_circuit_if(if_cmpu, lp_continue);
2768
2769 return cmpi_exit->in(0)->as_If();
2770}
2771
2772//------------------------------ remove_cmpi_loop_exit -------------------------------------
2773// Remove a previously inserted signed compare loop exit.
2774void PhaseIdealLoop::remove_cmpi_loop_exit(IfNode* if_cmp, IdealLoopTree *loop) {
2775 Node* lp_proj = stay_in_loop(if_cmp, loop);
2776 assert(if_cmp->in(1)->in(1)->Opcode() == Op_CmpI &&do { if (!(if_cmp->in(1)->in(1)->Opcode() == Op_CmpI
&& stay_in_loop(lp_proj, loop)->is_If() &&
stay_in_loop(lp_proj, loop)->in(1)->in(1)->Opcode()
== Op_CmpU)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2778, "assert(" "if_cmp->in(1)->in(1)->Opcode() == Op_CmpI && stay_in_loop(lp_proj, loop)->is_If() && stay_in_loop(lp_proj, loop)->in(1)->in(1)->Opcode() == Op_CmpU"
") failed", "inserted cmpi before cmpu"); ::breakpoint(); } }
while (0)
2777 stay_in_loop(lp_proj, loop)->is_If() &&do { if (!(if_cmp->in(1)->in(1)->Opcode() == Op_CmpI
&& stay_in_loop(lp_proj, loop)->is_If() &&
stay_in_loop(lp_proj, loop)->in(1)->in(1)->Opcode()
== Op_CmpU)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2778, "assert(" "if_cmp->in(1)->in(1)->Opcode() == Op_CmpI && stay_in_loop(lp_proj, loop)->is_If() && stay_in_loop(lp_proj, loop)->in(1)->in(1)->Opcode() == Op_CmpU"
") failed", "inserted cmpi before cmpu"); ::breakpoint(); } }
while (0)
2778 stay_in_loop(lp_proj, loop)->in(1)->in(1)->Opcode() == Op_CmpU, "inserted cmpi before cmpu")do { if (!(if_cmp->in(1)->in(1)->Opcode() == Op_CmpI
&& stay_in_loop(lp_proj, loop)->is_If() &&
stay_in_loop(lp_proj, loop)->in(1)->in(1)->Opcode()
== Op_CmpU)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2778, "assert(" "if_cmp->in(1)->in(1)->Opcode() == Op_CmpI && stay_in_loop(lp_proj, loop)->is_If() && stay_in_loop(lp_proj, loop)->in(1)->in(1)->Opcode() == Op_CmpU"
") failed", "inserted cmpi before cmpu"); ::breakpoint(); } }
while (0)
;
2779 Node *con = _igvn.makecon(lp_proj->is_IfTrue() ? TypeInt::ONE : TypeInt::ZERO);
2780 set_ctrl(con, C->root());
2781 if_cmp->set_req(1, con);
2782}
2783
2784//------------------------------ scheduled_nodelist -------------------------------------
2785// Create a post order schedule of nodes that are in the
2786// "member" set. The list is returned in "sched".
2787// The first node in "sched" is the loop head, followed by
2788// nodes which have no inputs in the "member" set, and then
2789// followed by the nodes that have an immediate input dependence
2790// on a node in "sched".
2791void PhaseIdealLoop::scheduled_nodelist( IdealLoopTree *loop, VectorSet& member, Node_List &sched ) {
2792
2793 assert(member.test(loop->_head->_idx), "loop head must be in member set")do { if (!(member.test(loop->_head->_idx))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2793, "assert(" "member.test(loop->_head->_idx)" ") failed"
, "loop head must be in member set"); ::breakpoint(); } } while
(0)
;
2794 VectorSet visited;
2795 Node_Stack nstack(loop->_body.size());
2796
2797 Node* n = loop->_head; // top of stack is cached in "n"
2798 uint idx = 0;
2799 visited.set(n->_idx);
2800
2801 // Initially push all with no inputs from within member set
2802 for(uint i = 0; i < loop->_body.size(); i++ ) {
2803 Node *elt = loop->_body.at(i);
2804 if (member.test(elt->_idx)) {
2805 bool found = false;
2806 for (uint j = 0; j < elt->req(); j++) {
2807 Node* def = elt->in(j);
2808 if (def && member.test(def->_idx) && def != elt) {
2809 found = true;
2810 break;
2811 }
2812 }
2813 if (!found && elt != loop->_head) {
2814 nstack.push(n, idx);
2815 n = elt;
2816 assert(!visited.test(n->_idx), "not seen yet")do { if (!(!visited.test(n->_idx))) { (*g_assert_poison) =
'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2816, "assert(" "!visited.test(n->_idx)" ") failed", "not seen yet"
); ::breakpoint(); } } while (0)
;
2817 visited.set(n->_idx);
2818 }
2819 }
2820 }
2821
2822 // traverse out's that are in the member set
2823 while (true) {
2824 if (idx < n->outcnt()) {
2825 Node* use = n->raw_out(idx);
2826 idx++;
2827 if (!visited.test_set(use->_idx)) {
2828 if (member.test(use->_idx)) {
2829 nstack.push(n, idx);
2830 n = use;
2831 idx = 0;
2832 }
2833 }
2834 } else {
2835 // All outputs processed
2836 sched.push(n);
2837 if (nstack.is_empty()) break;
2838 n = nstack.node();
2839 idx = nstack.index();
2840 nstack.pop();
2841 }
2842 }
2843}
2844
2845
2846//------------------------------ has_use_in_set -------------------------------------
2847// Has a use in the vector set
2848bool PhaseIdealLoop::has_use_in_set( Node* n, VectorSet& vset ) {
2849 for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++) {
2850 Node* use = n->fast_out(j);
2851 if (vset.test(use->_idx)) {
2852 return true;
2853 }
2854 }
2855 return false;
2856}
2857
2858
2859//------------------------------ has_use_internal_to_set -------------------------------------
2860// Has use internal to the vector set (ie. not in a phi at the loop head)
2861bool PhaseIdealLoop::has_use_internal_to_set( Node* n, VectorSet& vset, IdealLoopTree *loop ) {
2862 Node* head = loop->_head;
2863 for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++) {
2864 Node* use = n->fast_out(j);
2865 if (vset.test(use->_idx) && !(use->is_Phi() && use->in(0) == head)) {
2866 return true;
2867 }
2868 }
2869 return false;
2870}
2871
2872
2873//------------------------------ clone_for_use_outside_loop -------------------------------------
2874// clone "n" for uses that are outside of loop
2875int PhaseIdealLoop::clone_for_use_outside_loop( IdealLoopTree *loop, Node* n, Node_List& worklist ) {
2876 int cloned = 0;
2877 assert(worklist.size() == 0, "should be empty")do { if (!(worklist.size() == 0)) { (*g_assert_poison) = 'X';
; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2877, "assert(" "worklist.size() == 0" ") failed", "should be empty"
); ::breakpoint(); } } while (0)
;
2878 for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++) {
2879 Node* use = n->fast_out(j);
2880 if( !loop->is_member(get_loop(has_ctrl(use) ? get_ctrl(use) : use)) ) {
2881 worklist.push(use);
2882 }
2883 }
2884
2885 if (C->check_node_count(worklist.size() + NodeLimitFudgeFactor,
2886 "Too many clones required in clone_for_use_outside_loop in partial peeling")) {
2887 return -1;
2888 }
2889
2890 while( worklist.size() ) {
2891 Node *use = worklist.pop();
2892 if (!has_node(use) || use->in(0) == C->top()) continue;
2893 uint j;
2894 for (j = 0; j < use->req(); j++) {
2895 if (use->in(j) == n) break;
2896 }
2897 assert(j < use->req(), "must be there")do { if (!(j < use->req())) { (*g_assert_poison) = 'X';
; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2897, "assert(" "j < use->req()" ") failed", "must be there"
); ::breakpoint(); } } while (0)
;
2898
2899 // clone "n" and insert it between the inputs of "n" and the use outside the loop
2900 Node* n_clone = n->clone();
2901 _igvn.replace_input_of(use, j, n_clone);
2902 cloned++;
2903 Node* use_c;
2904 if (!use->is_Phi()) {
2905 use_c = has_ctrl(use) ? get_ctrl(use) : use->in(0);
2906 } else {
2907 // Use in a phi is considered a use in the associated predecessor block
2908 use_c = use->in(0)->in(j);
2909 }
2910 set_ctrl(n_clone, use_c);
2911 assert(!loop->is_member(get_loop(use_c)), "should be outside loop")do { if (!(!loop->is_member(get_loop(use_c)))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2911, "assert(" "!loop->is_member(get_loop(use_c))" ") failed"
, "should be outside loop"); ::breakpoint(); } } while (0)
;
2912 get_loop(use_c)->_body.push(n_clone);
2913 _igvn.register_new_node_with_optimizer(n_clone);
2914#ifndef PRODUCT
2915 if (TracePartialPeeling) {
2916 tty->print_cr("loop exit cloning old: %d new: %d newbb: %d", n->_idx, n_clone->_idx, get_ctrl(n_clone)->_idx);
2917 }
2918#endif
2919 }
2920 return cloned;
2921}
2922
2923
2924//------------------------------ clone_for_special_use_inside_loop -------------------------------------
2925// clone "n" for special uses that are in the not_peeled region.
2926// If these def-uses occur in separate blocks, the code generator
2927// marks the method as not compilable. For example, if a "BoolNode"
2928// is in a different basic block than the "IfNode" that uses it, then
2929// the compilation is aborted in the code generator.
2930void PhaseIdealLoop::clone_for_special_use_inside_loop( IdealLoopTree *loop, Node* n,
2931 VectorSet& not_peel, Node_List& sink_list, Node_List& worklist ) {
2932 if (n->is_Phi() || n->is_Load()) {
2933 return;
2934 }
2935 assert(worklist.size() == 0, "should be empty")do { if (!(worklist.size() == 0)) { (*g_assert_poison) = 'X';
; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 2935, "assert(" "worklist.size() == 0" ") failed", "should be empty"
); ::breakpoint(); } } while (0)
;
2936 for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++) {
2937 Node* use = n->fast_out(j);
2938 if ( not_peel.test(use->_idx) &&
2939 (use->is_If() || use->is_CMove() || use->is_Bool()) &&
2940 use->in(1) == n) {
2941 worklist.push(use);
2942 }
2943 }
2944 if (worklist.size() > 0) {
2945 // clone "n" and insert it between inputs of "n" and the use
2946 Node* n_clone = n->clone();
2947 loop->_body.push(n_clone);
2948 _igvn.register_new_node_with_optimizer(n_clone);
2949 set_ctrl(n_clone, get_ctrl(n));
2950 sink_list.push(n_clone);
2951 not_peel.set(n_clone->_idx);
2952#ifndef PRODUCT
2953 if (TracePartialPeeling) {
2954 tty->print_cr("special not_peeled cloning old: %d new: %d", n->_idx, n_clone->_idx);
2955 }
2956#endif
2957 while( worklist.size() ) {
2958 Node *use = worklist.pop();
2959 _igvn.rehash_node_delayed(use);
2960 for (uint j = 1; j < use->req(); j++) {
2961 if (use->in(j) == n) {
2962 use->set_req(j, n_clone);
2963 }
2964 }
2965 }
2966 }
2967}
2968
2969
2970//------------------------------ insert_phi_for_loop -------------------------------------
2971// Insert phi(lp_entry_val, back_edge_val) at use->in(idx) for loop lp if phi does not already exist
2972void PhaseIdealLoop::insert_phi_for_loop( Node* use, uint idx, Node* lp_entry_val, Node* back_edge_val, LoopNode* lp ) {
2973 Node *phi = PhiNode::make(lp, back_edge_val);
2974 phi->set_req(LoopNode::EntryControl, lp_entry_val);
2975 // Use existing phi if it already exists
2976 Node *hit = _igvn.hash_find_insert(phi);
2977 if( hit == NULL__null ) {
2978 _igvn.register_new_node_with_optimizer(phi);
2979 set_ctrl(phi, lp);
2980 } else {
2981 // Remove the new phi from the graph and use the hit
2982 _igvn.remove_dead_node(phi);
2983 phi = hit;
2984 }
2985 _igvn.replace_input_of(use, idx, phi);
2986}
2987
2988#ifdef ASSERT1
2989//------------------------------ is_valid_loop_partition -------------------------------------
2990// Validate the loop partition sets: peel and not_peel
2991bool PhaseIdealLoop::is_valid_loop_partition( IdealLoopTree *loop, VectorSet& peel, Node_List& peel_list,
2992 VectorSet& not_peel ) {
2993 uint i;
2994 // Check that peel_list entries are in the peel set
2995 for (i = 0; i < peel_list.size(); i++) {
2996 if (!peel.test(peel_list.at(i)->_idx)) {
2997 return false;
2998 }
2999 }
3000 // Check at loop members are in one of peel set or not_peel set
3001 for (i = 0; i < loop->_body.size(); i++ ) {
3002 Node *def = loop->_body.at(i);
3003 uint di = def->_idx;
3004 // Check that peel set elements are in peel_list
3005 if (peel.test(di)) {
3006 if (not_peel.test(di)) {
3007 return false;
3008 }
3009 // Must be in peel_list also
3010 bool found = false;
3011 for (uint j = 0; j < peel_list.size(); j++) {
3012 if (peel_list.at(j)->_idx == di) {
3013 found = true;
3014 break;
3015 }
3016 }
3017 if (!found) {
3018 return false;
3019 }
3020 } else if (not_peel.test(di)) {
3021 if (peel.test(di)) {
3022 return false;
3023 }
3024 } else {
3025 return false;
3026 }
3027 }
3028 return true;
3029}
3030
3031//------------------------------ is_valid_clone_loop_exit_use -------------------------------------
3032// Ensure a use outside of loop is of the right form
3033bool PhaseIdealLoop::is_valid_clone_loop_exit_use( IdealLoopTree *loop, Node* use, uint exit_idx) {
3034 Node *use_c = has_ctrl(use) ? get_ctrl(use) : use;
3035 return (use->is_Phi() &&
3036 use_c->is_Region() && use_c->req() == 3 &&
3037 (use_c->in(exit_idx)->Opcode() == Op_IfTrue ||
3038 use_c->in(exit_idx)->Opcode() == Op_IfFalse ||
3039 use_c->in(exit_idx)->Opcode() == Op_JumpProj) &&
3040 loop->is_member( get_loop( use_c->in(exit_idx)->in(0) ) ) );
3041}
3042
3043//------------------------------ is_valid_clone_loop_form -------------------------------------
3044// Ensure that all uses outside of loop are of the right form
3045bool PhaseIdealLoop::is_valid_clone_loop_form( IdealLoopTree *loop, Node_List& peel_list,
3046 uint orig_exit_idx, uint clone_exit_idx) {
3047 uint len = peel_list.size();
3048 for (uint i = 0; i < len; i++) {
3049 Node *def = peel_list.at(i);
3050
3051 for (DUIterator_Fast jmax, j = def->fast_outs(jmax); j < jmax; j++) {
3052 Node *use = def->fast_out(j);
3053 Node *use_c = has_ctrl(use) ? get_ctrl(use) : use;
3054 if (!loop->is_member(get_loop(use_c))) {
3055 // use is not in the loop, check for correct structure
3056 if (use->in(0) == def) {
3057 // Okay
3058 } else if (!is_valid_clone_loop_exit_use(loop, use, orig_exit_idx)) {
3059 return false;
3060 }
3061 }
3062 }
3063 }
3064 return true;
3065}
3066#endif
3067
3068//------------------------------ partial_peel -------------------------------------
3069// Partially peel (aka loop rotation) the top portion of a loop (called
3070// the peel section below) by cloning it and placing one copy just before
3071// the new loop head and the other copy at the bottom of the new loop.
3072//
3073// before after where it came from
3074//
3075// stmt1 stmt1
3076// loop: stmt2 clone
3077// stmt2 if condA goto exitA clone
3078// if condA goto exitA new_loop: new
3079// stmt3 stmt3 clone
3080// if !condB goto loop if condB goto exitB clone
3081// exitB: stmt2 orig
3082// stmt4 if !condA goto new_loop orig
3083// exitA: goto exitA
3084// exitB:
3085// stmt4
3086// exitA:
3087//
3088// Step 1: find the cut point: an exit test on probable
3089// induction variable.
3090// Step 2: schedule (with cloning) operations in the peel
3091// section that can be executed after the cut into
3092// the section that is not peeled. This may need
3093// to clone operations into exit blocks. For
3094// instance, a reference to A[i] in the not-peel
3095// section and a reference to B[i] in an exit block
3096// may cause a left-shift of i by 2 to be placed
3097// in the peel block. This step will clone the left
3098// shift into the exit block and sink the left shift
3099// from the peel to the not-peel section.
3100// Step 3: clone the loop, retarget the control, and insert
3101// phis for values that are live across the new loop
3102// head. This is very dependent on the graph structure
3103// from clone_loop. It creates region nodes for
3104// exit control and associated phi nodes for values
3105// flow out of the loop through that exit. The region
3106// node is dominated by the clone's control projection.
3107// So the clone's peel section is placed before the
3108// new loop head, and the clone's not-peel section is
3109// forms the top part of the new loop. The original
3110// peel section forms the tail of the new loop.
3111// Step 4: update the dominator tree and recompute the
3112// dominator depth.
3113//
3114// orig
3115//
3116// stmt1
3117// |
3118// v
3119// loop predicate
3120// |
3121// v
3122// loop<----+
3123// | |
3124// stmt2 |
3125// | |
3126// v |
3127// ifA |
3128// / | |
3129// v v |
3130// false true ^ <-- last_peel
3131// / | |
3132// / ===|==cut |
3133// / stmt3 | <-- first_not_peel
3134// / | |
3135// | v |
3136// v ifB |
3137// exitA: / \ |
3138// / \ |
3139// v v |
3140// false true |
3141// / \ |
3142// / ----+
3143// |
3144// v
3145// exitB:
3146// stmt4
3147//
3148//
3149// after clone loop
3150//
3151// stmt1
3152// |
3153// v
3154// loop predicate
3155// / \
3156// clone / \ orig
3157// / \
3158// / \
3159// v v
3160// +---->loop loop<----+
3161// | | | |
3162// | stmt2 stmt2 |
3163// | | | |
3164// | v v |
3165// | ifA ifA |
3166// | | \ / | |
3167// | v v v v |
3168// ^ true false false true ^ <-- last_peel
3169// | | ^ \ / | |
3170// | cut==|== \ \ / ===|==cut |
3171// | stmt3 \ \ / stmt3 | <-- first_not_peel
3172// | | dom | | | |
3173// | v \ 1v v2 v |
3174// | ifB regionA ifB |
3175// | / \ | / \ |
3176// | / \ v / \ |
3177// | v v exitA: v v |
3178// | true false false true |
3179// | / ^ \ / \ |
3180// +---- \ \ / ----+
3181// dom \ /
3182// \ 1v v2
3183// regionB
3184// |
3185// v
3186// exitB:
3187// stmt4
3188//
3189//
3190// after partial peel
3191//
3192// stmt1
3193// |
3194// v
3195// loop predicate
3196// /
3197// clone / orig
3198// / TOP
3199// / \
3200// v v
3201// TOP->loop loop----+
3202// | | |
3203// stmt2 stmt2 |
3204// | | |
3205// v v |
3206// ifA ifA |
3207// | \ / | |
3208// v v v v |
3209// true false false true | <-- last_peel
3210// | ^ \ / +------|---+
3211// +->newloop \ \ / === ==cut | |
3212// | stmt3 \ \ / TOP | |
3213// | | dom | | stmt3 | | <-- first_not_peel
3214// | v \ 1v v2 v | |
3215// | ifB regionA ifB ^ v
3216// | / \ | / \ | |
3217// | / \ v / \ | |
3218// | v v exitA: v v | |
3219// | true false false true | |
3220// | / ^ \ / \ | |
3221// | | \ \ / v | |
3222// | | dom \ / TOP | |
3223// | | \ 1v v2 | |
3224// ^ v regionB | |
3225// | | | | |
3226// | | v ^ v
3227// | | exitB: | |
3228// | | stmt4 | |
3229// | +------------>-----------------+ |
3230// | |
3231// +-----------------<---------------------+
3232//
3233//
3234// final graph
3235//
3236// stmt1
3237// |
3238// v
3239// loop predicate
3240// |
3241// v
3242// stmt2 clone
3243// |
3244// v
3245// ........> ifA clone
3246// : / |
3247// dom / |
3248// : v v
3249// : false true
3250// : | |
3251// : | v
3252// : | newloop<-----+
3253// : | | |
3254// : | stmt3 clone |
3255// : | | |
3256// : | v |
3257// : | ifB |
3258// : | / \ |
3259// : | v v |
3260// : | false true |
3261// : | | | |
3262// : | v stmt2 |
3263// : | exitB: | |
3264// : | stmt4 v |
3265// : | ifA orig |
3266// : | / \ |
3267// : | / \ |
3268// : | v v |
3269// : | false true |
3270// : | / \ |
3271// : v v -----+
3272// RegionA
3273// |
3274// v
3275// exitA
3276//
3277bool PhaseIdealLoop::partial_peel( IdealLoopTree *loop, Node_List &old_new ) {
3278
3279 assert(!loop->_head->is_CountedLoop(), "Non-counted loop only")do { if (!(!loop->_head->is_CountedLoop())) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 3279, "assert(" "!loop->_head->is_CountedLoop()" ") failed"
, "Non-counted loop only"); ::breakpoint(); } } while (0)
;
3280 if (!loop->_head->is_Loop()) {
3281 return false;
3282 }
3283 LoopNode *head = loop->_head->as_Loop();
3284
3285 if (head->is_partial_peel_loop() || head->partial_peel_has_failed()) {
3286 return false;
3287 }
3288
3289 // Check for complex exit control
3290 for (uint ii = 0; ii < loop->_body.size(); ii++) {
3291 Node *n = loop->_body.at(ii);
3292 int opc = n->Opcode();
3293 if (n->is_Call() ||
3294 opc == Op_Catch ||
3295 opc == Op_CatchProj ||
3296 opc == Op_Jump ||
3297 opc == Op_JumpProj) {
3298#ifndef PRODUCT
3299 if (TracePartialPeeling) {
3300 tty->print_cr("\nExit control too complex: lp: %d", head->_idx);
3301 }
3302#endif
3303 return false;
3304 }
3305 }
3306
3307 int dd = dom_depth(head);
3308
3309 // Step 1: find cut point
3310
3311 // Walk up dominators to loop head looking for first loop exit
3312 // which is executed on every path thru loop.
3313 IfNode *peel_if = NULL__null;
3314 IfNode *peel_if_cmpu = NULL__null;
3315
3316 Node *iff = loop->tail();
3317 while (iff != head) {
3318 if (iff->is_If()) {
3319 Node *ctrl = get_ctrl(iff->in(1));
3320 if (ctrl->is_top()) return false; // Dead test on live IF.
3321 // If loop-varying exit-test, check for induction variable
3322 if (loop->is_member(get_loop(ctrl)) &&
3323 loop->is_loop_exit(iff) &&
3324 is_possible_iv_test(iff)) {
3325 Node* cmp = iff->in(1)->in(1);
3326 if (cmp->Opcode() == Op_CmpI) {
3327 peel_if = iff->as_If();
3328 } else {
3329 assert(cmp->Opcode() == Op_CmpU, "must be CmpI or CmpU")do { if (!(cmp->Opcode() == Op_CmpU)) { (*g_assert_poison)
= 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 3329, "assert(" "cmp->Opcode() == Op_CmpU" ") failed", "must be CmpI or CmpU"
); ::breakpoint(); } } while (0)
;
3330 peel_if_cmpu = iff->as_If();
3331 }
3332 }
3333 }
3334 iff = idom(iff);
3335 }
3336
3337 // Prefer signed compare over unsigned compare.
3338 IfNode* new_peel_if = NULL__null;
3339 if (peel_if == NULL__null) {
3340 if (!PartialPeelAtUnsignedTests || peel_if_cmpu == NULL__null) {
3341 return false; // No peel point found
3342 }
3343 new_peel_if = insert_cmpi_loop_exit(peel_if_cmpu, loop);
3344 if (new_peel_if == NULL__null) {
3345 return false; // No peel point found
3346 }
3347 peel_if = new_peel_if;
3348 }
3349 Node* last_peel = stay_in_loop(peel_if, loop);
3350 Node* first_not_peeled = stay_in_loop(last_peel, loop);
3351 if (first_not_peeled == NULL__null || first_not_peeled == head) {
3352 return false;
3353 }
3354
3355#ifndef PRODUCT
3356 if (TraceLoopOpts) {
3357 tty->print("PartialPeel ");
3358 loop->dump_head();
3359 }
3360
3361 if (TracePartialPeeling) {
3362 tty->print_cr("before partial peel one iteration");
3363 Node_List wl;
3364 Node* t = head->in(2);
3365 while (true) {
3366 wl.push(t);
3367 if (t == head) break;
3368 t = idom(t);
3369 }
3370 while (wl.size() > 0) {
3371 Node* tt = wl.pop();
3372 tt->dump();
3373 if (tt == last_peel) tty->print_cr("-- cut --");
3374 }
3375 }
3376#endif
3377 VectorSet peel;
3378 VectorSet not_peel;
3379 Node_List peel_list;
3380 Node_List worklist;
3381 Node_List sink_list;
3382
3383 uint estimate = loop->est_loop_clone_sz(1);
3384 if (exceeding_node_budget(estimate)) {
3385 return false;
3386 }
3387
3388 // Set of cfg nodes to peel are those that are executable from
3389 // the head through last_peel.
3390 assert(worklist.size() == 0, "should be empty")do { if (!(worklist.size() == 0)) { (*g_assert_poison) = 'X';
; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 3390, "assert(" "worklist.size() == 0" ") failed", "should be empty"
); ::breakpoint(); } } while (0)
;
3391 worklist.push(head);
3392 peel.set(head->_idx);
3393 while (worklist.size() > 0) {
3394 Node *n = worklist.pop();
3395 if (n != last_peel) {
3396 for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++) {
3397 Node* use = n->fast_out(j);
3398 if (use->is_CFG() &&
3399 loop->is_member(get_loop(use)) &&
3400 !peel.test_set(use->_idx)) {
3401 worklist.push(use);
3402 }
3403 }
3404 }
3405 }
3406
3407 // Set of non-cfg nodes to peel are those that are control
3408 // dependent on the cfg nodes.
3409 for (uint i = 0; i < loop->_body.size(); i++) {
3410 Node *n = loop->_body.at(i);
3411 Node *n_c = has_ctrl(n) ? get_ctrl(n) : n;
3412 if (peel.test(n_c->_idx)) {
3413 peel.set(n->_idx);
3414 } else {
3415 not_peel.set(n->_idx);
3416 }
3417 }
3418
3419 // Step 2: move operations from the peeled section down into the
3420 // not-peeled section
3421
3422 // Get a post order schedule of nodes in the peel region
3423 // Result in right-most operand.
3424 scheduled_nodelist(loop, peel, peel_list);
3425
3426 assert(is_valid_loop_partition(loop, peel, peel_list, not_peel), "bad partition")do { if (!(is_valid_loop_partition(loop, peel, peel_list, not_peel
))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 3426, "assert(" "is_valid_loop_partition(loop, peel, peel_list, not_peel)"
") failed", "bad partition"); ::breakpoint(); } } while (0)
;
3427
3428 // For future check for too many new phis
3429 uint old_phi_cnt = 0;
3430 for (DUIterator_Fast jmax, j = head->fast_outs(jmax); j < jmax; j++) {
3431 Node* use = head->fast_out(j);
3432 if (use->is_Phi()) old_phi_cnt++;
3433 }
3434
3435#ifndef PRODUCT
3436 if (TracePartialPeeling) {
3437 tty->print_cr("\npeeled list");
3438 }
3439#endif
3440
3441 // Evacuate nodes in peel region into the not_peeled region if possible
3442 bool too_many_clones = false;
3443 uint new_phi_cnt = 0;
3444 uint cloned_for_outside_use = 0;
3445 for (uint i = 0; i < peel_list.size();) {
3446 Node* n = peel_list.at(i);
3447#ifndef PRODUCT
3448 if (TracePartialPeeling) n->dump();
3449#endif
3450 bool incr = true;
3451 if (!n->is_CFG()) {
3452 if (has_use_in_set(n, not_peel)) {
3453 // If not used internal to the peeled region,
3454 // move "n" from peeled to not_peeled region.
3455 if (!has_use_internal_to_set(n, peel, loop)) {
3456 // if not pinned and not a load (which maybe anti-dependent on a store)
3457 // and not a CMove (Matcher expects only bool->cmove).
3458 if (n->in(0) == NULL__null && !n->is_Load() && !n->is_CMove()) {
3459 int new_clones = clone_for_use_outside_loop(loop, n, worklist);
3460 if (new_clones == -1) {
3461 too_many_clones = true;
3462 break;
3463 }
3464 cloned_for_outside_use += new_clones;
3465 sink_list.push(n);
3466 peel.remove(n->_idx);
3467 not_peel.set(n->_idx);
3468 peel_list.remove(i);
3469 incr = false;
3470#ifndef PRODUCT
3471 if (TracePartialPeeling) {
3472 tty->print_cr("sink to not_peeled region: %d newbb: %d",
3473 n->_idx, get_ctrl(n)->_idx);
3474 }
3475#endif
3476 }
3477 } else {
3478 // Otherwise check for special def-use cases that span
3479 // the peel/not_peel boundary such as bool->if
3480 clone_for_special_use_inside_loop(loop, n, not_peel, sink_list, worklist);
3481 new_phi_cnt++;
3482 }
3483 }
3484 }
3485 if (incr) i++;
3486 }
3487
3488 estimate += cloned_for_outside_use + new_phi_cnt;
3489 bool exceed_node_budget = !may_require_nodes(estimate);
3490 bool exceed_phi_limit = new_phi_cnt > old_phi_cnt + PartialPeelNewPhiDelta;
3491
3492 if (too_many_clones || exceed_node_budget || exceed_phi_limit) {
3493#ifndef PRODUCT
3494 if (TracePartialPeeling && exceed_phi_limit) {
3495 tty->print_cr("\nToo many new phis: %d old %d new cmpi: %c",
3496 new_phi_cnt, old_phi_cnt, new_peel_if != NULL__null?'T':'F');
3497 }
3498#endif
3499 if (new_peel_if != NULL__null) {
3500 remove_cmpi_loop_exit(new_peel_if, loop);
3501 }
3502 // Inhibit more partial peeling on this loop
3503 assert(!head->is_partial_peel_loop(), "not partial peeled")do { if (!(!head->is_partial_peel_loop())) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 3503, "assert(" "!head->is_partial_peel_loop()" ") failed"
, "not partial peeled"); ::breakpoint(); } } while (0)
;
3504 head->mark_partial_peel_failed();
3505 if (cloned_for_outside_use > 0) {
3506 // Terminate this round of loop opts because
3507 // the graph outside this loop was changed.
3508 C->set_major_progress();
3509 return true;
3510 }
3511 return false;
3512 }
3513
3514 // Step 3: clone loop, retarget control, and insert new phis
3515
3516 // Create new loop head for new phis and to hang
3517 // the nodes being moved (sinked) from the peel region.
3518 LoopNode* new_head = new LoopNode(last_peel, last_peel);
3519 new_head->set_unswitch_count(head->unswitch_count()); // Preserve
3520 _igvn.register_new_node_with_optimizer(new_head);
3521 assert(first_not_peeled->in(0) == last_peel, "last_peel <- first_not_peeled")do { if (!(first_not_peeled->in(0) == last_peel)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 3521, "assert(" "first_not_peeled->in(0) == last_peel" ") failed"
, "last_peel <- first_not_peeled"); ::breakpoint(); } } while
(0)
;
3522 _igvn.replace_input_of(first_not_peeled, 0, new_head);
3523 set_loop(new_head, loop);
3524 loop->_body.push(new_head);
3525 not_peel.set(new_head->_idx);
3526 set_idom(new_head, last_peel, dom_depth(first_not_peeled));
3527 set_idom(first_not_peeled, new_head, dom_depth(first_not_peeled));
3528
3529 while (sink_list.size() > 0) {
3530 Node* n = sink_list.pop();
3531 set_ctrl(n, new_head);
3532 }
3533
3534 assert(is_valid_loop_partition(loop, peel, peel_list, not_peel), "bad partition")do { if (!(is_valid_loop_partition(loop, peel, peel_list, not_peel
))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 3534, "assert(" "is_valid_loop_partition(loop, peel, peel_list, not_peel)"
") failed", "bad partition"); ::breakpoint(); } } while (0)
;
3535
3536 clone_loop(loop, old_new, dd, IgnoreStripMined);
3537
3538 const uint clone_exit_idx = 1;
3539 const uint orig_exit_idx = 2;
3540 assert(is_valid_clone_loop_form(loop, peel_list, orig_exit_idx, clone_exit_idx), "bad clone loop")do { if (!(is_valid_clone_loop_form(loop, peel_list, orig_exit_idx
, clone_exit_idx))) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 3540, "assert(" "is_valid_clone_loop_form(loop, peel_list, orig_exit_idx, clone_exit_idx)"
") failed", "bad clone loop"); ::breakpoint(); } } while (0)
;
3541
3542 Node* head_clone = old_new[head->_idx];
3543 LoopNode* new_head_clone = old_new[new_head->_idx]->as_Loop();
3544 Node* orig_tail_clone = head_clone->in(2);
3545
3546 // Add phi if "def" node is in peel set and "use" is not
3547
3548 for (uint i = 0; i < peel_list.size(); i++) {
3549 Node *def = peel_list.at(i);
3550 if (!def->is_CFG()) {
3551 for (DUIterator_Fast jmax, j = def->fast_outs(jmax); j < jmax; j++) {
3552 Node *use = def->fast_out(j);
3553 if (has_node(use) && use->in(0) != C->top() &&
3554 (!peel.test(use->_idx) ||
3555 (use->is_Phi() && use->in(0) == head)) ) {
3556 worklist.push(use);
3557 }
3558 }
3559 while( worklist.size() ) {
3560 Node *use = worklist.pop();
3561 for (uint j = 1; j < use->req(); j++) {
3562 Node* n = use->in(j);
3563 if (n == def) {
3564
3565 // "def" is in peel set, "use" is not in peel set
3566 // or "use" is in the entry boundary (a phi) of the peel set
3567
3568 Node* use_c = has_ctrl(use) ? get_ctrl(use) : use;
3569
3570 if ( loop->is_member(get_loop( use_c )) ) {
3571 // use is in loop
3572 if (old_new[use->_idx] != NULL__null) { // null for dead code
3573 Node* use_clone = old_new[use->_idx];
3574 _igvn.replace_input_of(use, j, C->top());
3575 insert_phi_for_loop( use_clone, j, old_new[def->_idx], def, new_head_clone );
3576 }
3577 } else {
3578 assert(is_valid_clone_loop_exit_use(loop, use, orig_exit_idx), "clone loop format")do { if (!(is_valid_clone_loop_exit_use(loop, use, orig_exit_idx
))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 3578, "assert(" "is_valid_clone_loop_exit_use(loop, use, orig_exit_idx)"
") failed", "clone loop format"); ::breakpoint(); } } while (
0)
;
3579 // use is not in the loop, check if the live range includes the cut
3580 Node* lp_if = use_c->in(orig_exit_idx)->in(0);
3581 if (not_peel.test(lp_if->_idx)) {
3582 assert(j == orig_exit_idx, "use from original loop")do { if (!(j == orig_exit_idx)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/opto/loopopts.cpp"
, 3582, "assert(" "j == orig_exit_idx" ") failed", "use from original loop"
); ::breakpoint(); } } while (0)
;
3583 insert_phi_for_loop( use, clone_exit_idx, old_new[def->_idx], def, new_head_clone );
3584 }
3585 }
3586 }
3587 }
3588 }
3589 }
3590 }
3591
3592 // Step 3b: retarget control
3593
3594 // Redirect control to the new loop head if a cloned node in
3595 // the not_peeled region has control that points into the peeled region.
3596 // This necessary because the cloned peeled region will be outside
3597 // the loop.
3598 // from to
3599 // cloned-peeled <---+
3600 // new_head_clone: | <--+
3601 // cloned-not_peeled in(0) in(0)
3602 // orig-peeled
3603
3604 for (uint i = 0; i < loop->_body.size(); i++) {
3605 Node *n = loop->_body.at(i);
3606 if (!n->is_CFG() && n->in(0) != NULL__null &&
3607 not_peel.test(n->_idx) && peel.test(n->in(0)->_idx)) {
3608 Node* n_clone = old_new[n->_idx];
3609 _igvn.replace_input_of(n_clone, 0, new_head_clone);
3610 }
3611 }
3612
3613 // Backedge of the surviving new_head (the clone) is original last_peel
3614 _igvn.replace_input_of(new_head_clone, LoopNode::LoopBackControl, last_peel);
3615
3616 // Cut first node in original not_peel set
3617 _igvn.rehash_node_delayed(new_head); // Multiple edge updates:
3618 new_head->set_req(LoopNode::EntryControl, C->top()); // use rehash_node_delayed / set_req instead of
3619 new_head->set_req(LoopNode::LoopBackControl, C->top()); // multiple replace_input_of calls
3620
3621 // Copy head_clone back-branch info to original head
3622 // and remove original head's loop entry and
3623 // clone head's back-branch
3624 _igvn.rehash_node_delayed(head); // Multiple edge updates
3625 head->set_req(LoopNode::EntryControl, head_clone->in(LoopNode::LoopBackControl));
3626 head->set_req(LoopNode::LoopBackControl, C->top());
3627 _igvn.replace_input_of(head_clone, LoopNode::LoopBackControl, C->top());
3628
3629 // Similarly modify the phis
3630 for (DUIterator_Fast kmax, k = head->fast_outs(kmax); k < kmax; k++) {
3631 Node* use = head->fast_out(k);
3632 if (use->is_Phi() && use->outcnt() > 0) {
3633 Node* use_clone = old_new[use->_idx];
3634 _igvn.rehash_node_delayed(use); // Multiple edge updates
3635 use->set_req(LoopNode::EntryControl, use_clone->in(LoopNode::LoopBackControl));
3636 use->set_req(LoopNode::LoopBackControl, C->top());
3637 _igvn.replace_input_of(use_clone, LoopNode::LoopBackControl, C->top());
3638 }
3639 }
3640
3641 // Step 4: update dominator tree and dominator depth
3642
3643 set_idom(head, orig_tail_clone, dd);
3644 recompute_dom_depth();
3645
3646 // Inhibit more partial peeling on this loop
3647 new_head_clone->set_partial_peel_loop();
3648 C->set_major_progress();
3649 loop->record_for_igvn();
3650
3651#ifndef PRODUCT
3652 if (TracePartialPeeling) {
3653 tty->print_cr("\nafter partial peel one iteration");
3654 Node_List wl;
3655 Node* t = last_peel;
3656 while (true) {
3657 wl.push(t);
3658 if (t == head_clone) break;
3659 t = idom(t);
3660 }
3661 while (wl.size() > 0) {
3662 Node* tt = wl.pop();
3663 if (tt == head) tty->print_cr("orig head");
3664 else if (tt == new_head_clone) tty->print_cr("new head");
3665 else if (tt == head_clone) tty->print_cr("clone head");
3666 tt->dump();
3667 }
3668 }
3669#endif
3670 return true;
3671}
3672
3673//------------------------------reorg_offsets----------------------------------
3674// Reorganize offset computations to lower register pressure. Mostly
3675// prevent loop-fallout uses of the pre-incremented trip counter (which are
3676// then alive with the post-incremented trip counter forcing an extra
3677// register move)
3678void PhaseIdealLoop::reorg_offsets(IdealLoopTree *loop) {
3679 // Perform it only for canonical counted loops.
3680 // Loop's shape could be messed up by iteration_split_impl.
3681 if (!loop->_head->is_CountedLoop())
3682 return;
3683 if (!loop->_head->as_Loop()->is_valid_counted_loop(T_INT))
3684 return;
3685
3686 CountedLoopNode *cl = loop->_head->as_CountedLoop();
3687 CountedLoopEndNode *cle = cl->loopexit();
3688 Node *exit = cle->proj_out(false);
3689 Node *phi = cl->phi();
3690
3691 // Check for the special case when using the pre-incremented trip-counter on
3692 // the fall-out path (forces the pre-incremented and post-incremented trip
3693 // counter to be live at the same time). Fix this by adjusting to use the
3694 // post-increment trip counter.
3695
3696 bool progress = true;
3697 while (progress) {
3698 progress = false;
3699 for (DUIterator_Fast imax, i = phi->fast_outs(imax); i < imax; i++) {
3700 Node* use = phi->fast_out(i); // User of trip-counter
3701 if (!has_ctrl(use)) continue;
3702 Node *u_ctrl = get_ctrl(use);
3703 if (use->is_Phi()) {
3704 u_ctrl = NULL__null;
3705 for (uint j = 1; j < use->req(); j++)
3706 if (use->in(j) == phi)
3707 u_ctrl = dom_lca(u_ctrl, use->in(0)->in(j));
3708 }
3709 IdealLoopTree *u_loop = get_loop(u_ctrl);
3710 // Look for loop-invariant use
3711 if (u_loop == loop) continue;
3712 if (loop->is_member(u_loop)) continue;
3713 // Check that use is live out the bottom. Assuming the trip-counter
3714 // update is right at the bottom, uses of of the loop middle are ok.
3715 if (dom_lca(exit, u_ctrl) != exit) continue;
3716 // Hit! Refactor use to use the post-incremented tripcounter.
3717 // Compute a post-increment tripcounter.
3718 Node* c = exit;
3719 if (cl->is_strip_mined()) {
3720 IdealLoopTree* outer_loop = get_loop(cl->outer_loop());
3721 if (!outer_loop->is_member(u_loop)) {
3722 c = cl->outer_loop_exit();
3723 }
3724 }
3725 Node *opaq = new Opaque2Node(C, cle->incr());
3726 register_new_node(opaq, c);
3727 Node *neg_stride = _igvn.intcon(-cle->stride_con());
3728 set_ctrl(neg_stride, C->root());
3729 Node *post = new AddINode(opaq, neg_stride);
3730 register_new_node(post, c);
3731 _igvn.rehash_node_delayed(use);
3732 for (uint j = 1; j < use->req(); j++) {
3733 if (use->in(j) == phi)
3734 use->set_req(j, post);
3735 }
3736 // Since DU info changed, rerun loop
3737 progress = true;
3738 break;
3739 }
3740 }
3741
3742}