Mercurial > hg > truffle
annotate src/share/vm/opto/loopnode.hpp @ 1721:413ad0331a0c
6977924: Changes for 6975078 produce build error with certain gcc versions
Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error.
Reviewed-by: jcoomes, ysr, phh
author | johnc |
---|---|
date | Wed, 18 Aug 2010 10:59:06 -0700 |
parents | 6027dddc26c6 |
children | d6f45b55c972 |
rev | line source |
---|---|
0 | 1 /* |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1303
diff
changeset
|
2 * Copyright (c) 1998, 2009, Oracle and/or its affiliates. All rights reserved. |
0 | 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 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1303
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1303
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1303
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
25 class CmpNode; | |
26 class CountedLoopEndNode; | |
27 class CountedLoopNode; | |
28 class IdealLoopTree; | |
29 class LoopNode; | |
30 class Node; | |
31 class PhaseIdealLoop; | |
32 class VectorSet; | |
1172 | 33 class Invariance; |
0 | 34 struct small_cache; |
35 | |
36 // | |
37 // I D E A L I Z E D L O O P S | |
38 // | |
39 // Idealized loops are the set of loops I perform more interesting | |
40 // transformations on, beyond simple hoisting. | |
41 | |
42 //------------------------------LoopNode--------------------------------------- | |
43 // Simple loop header. Fall in path on left, loop-back path on right. | |
44 class LoopNode : public RegionNode { | |
45 // Size is bigger to hold the flags. However, the flags do not change | |
46 // the semantics so it does not appear in the hash & cmp functions. | |
47 virtual uint size_of() const { return sizeof(*this); } | |
48 protected: | |
49 short _loop_flags; | |
50 // Names for flag bitfields | |
51 enum { pre_post_main=0, inner_loop=8, partial_peel_loop=16, partial_peel_failed=32 }; | |
52 char _unswitch_count; | |
53 enum { _unswitch_max=3 }; | |
54 | |
55 public: | |
56 // Names for edge indices | |
57 enum { Self=0, EntryControl, LoopBackControl }; | |
58 | |
59 int is_inner_loop() const { return _loop_flags & inner_loop; } | |
60 void set_inner_loop() { _loop_flags |= inner_loop; } | |
61 | |
62 int is_partial_peel_loop() const { return _loop_flags & partial_peel_loop; } | |
63 void set_partial_peel_loop() { _loop_flags |= partial_peel_loop; } | |
64 int partial_peel_has_failed() const { return _loop_flags & partial_peel_failed; } | |
65 void mark_partial_peel_failed() { _loop_flags |= partial_peel_failed; } | |
66 | |
67 int unswitch_max() { return _unswitch_max; } | |
68 int unswitch_count() { return _unswitch_count; } | |
69 void set_unswitch_count(int val) { | |
70 assert (val <= unswitch_max(), "too many unswitches"); | |
71 _unswitch_count = val; | |
72 } | |
73 | |
74 LoopNode( Node *entry, Node *backedge ) : RegionNode(3), _loop_flags(0), _unswitch_count(0) { | |
75 init_class_id(Class_Loop); | |
76 init_req(EntryControl, entry); | |
77 init_req(LoopBackControl, backedge); | |
78 } | |
79 | |
80 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); | |
81 virtual int Opcode() const; | |
82 bool can_be_counted_loop(PhaseTransform* phase) const { | |
83 return req() == 3 && in(0) != NULL && | |
84 in(1) != NULL && phase->type(in(1)) != Type::TOP && | |
85 in(2) != NULL && phase->type(in(2)) != Type::TOP; | |
86 } | |
87 #ifndef PRODUCT | |
88 virtual void dump_spec(outputStream *st) const; | |
89 #endif | |
90 }; | |
91 | |
92 //------------------------------Counted Loops---------------------------------- | |
93 // Counted loops are all trip-counted loops, with exactly 1 trip-counter exit | |
94 // path (and maybe some other exit paths). The trip-counter exit is always | |
95 // last in the loop. The trip-counter does not have to stride by a constant, | |
96 // but it does have to stride by a loop-invariant amount; the exit value is | |
97 // also loop invariant. | |
98 | |
99 // CountedLoopNodes and CountedLoopEndNodes come in matched pairs. The | |
100 // CountedLoopNode has the incoming loop control and the loop-back-control | |
101 // which is always the IfTrue before the matching CountedLoopEndNode. The | |
102 // CountedLoopEndNode has an incoming control (possibly not the | |
103 // CountedLoopNode if there is control flow in the loop), the post-increment | |
104 // trip-counter value, and the limit. The trip-counter value is always of | |
105 // the form (Op old-trip-counter stride). The old-trip-counter is produced | |
106 // by a Phi connected to the CountedLoopNode. The stride is loop invariant. | |
107 // The Op is any commutable opcode, including Add, Mul, Xor. The | |
108 // CountedLoopEndNode also takes in the loop-invariant limit value. | |
109 | |
110 // From a CountedLoopNode I can reach the matching CountedLoopEndNode via the | |
111 // loop-back control. From CountedLoopEndNodes I can reach CountedLoopNodes | |
112 // via the old-trip-counter from the Op node. | |
113 | |
114 //------------------------------CountedLoopNode-------------------------------- | |
115 // CountedLoopNodes head simple counted loops. CountedLoopNodes have as | |
116 // inputs the incoming loop-start control and the loop-back control, so they | |
117 // act like RegionNodes. They also take in the initial trip counter, the | |
118 // loop-invariant stride and the loop-invariant limit value. CountedLoopNodes | |
119 // produce a loop-body control and the trip counter value. Since | |
120 // CountedLoopNodes behave like RegionNodes I still have a standard CFG model. | |
121 | |
122 class CountedLoopNode : public LoopNode { | |
123 // Size is bigger to hold _main_idx. However, _main_idx does not change | |
124 // the semantics so it does not appear in the hash & cmp functions. | |
125 virtual uint size_of() const { return sizeof(*this); } | |
126 | |
127 // For Pre- and Post-loops during debugging ONLY, this holds the index of | |
128 // the Main CountedLoop. Used to assert that we understand the graph shape. | |
129 node_idx_t _main_idx; | |
130 | |
131 // Known trip count calculated by policy_maximally_unroll | |
132 int _trip_count; | |
133 | |
134 // Expected trip count from profile data | |
135 float _profile_trip_cnt; | |
136 | |
137 // Log2 of original loop bodies in unrolled loop | |
138 int _unrolled_count_log2; | |
139 | |
140 // Node count prior to last unrolling - used to decide if | |
141 // unroll,optimize,unroll,optimize,... is making progress | |
142 int _node_count_before_unroll; | |
143 | |
144 public: | |
145 CountedLoopNode( Node *entry, Node *backedge ) | |
146 : LoopNode(entry, backedge), _trip_count(max_jint), | |
147 _profile_trip_cnt(COUNT_UNKNOWN), _unrolled_count_log2(0), | |
148 _node_count_before_unroll(0) { | |
149 init_class_id(Class_CountedLoop); | |
150 // Initialize _trip_count to the largest possible value. | |
151 // Will be reset (lower) if the loop's trip count is known. | |
152 } | |
153 | |
154 virtual int Opcode() const; | |
155 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); | |
156 | |
157 Node *init_control() const { return in(EntryControl); } | |
158 Node *back_control() const { return in(LoopBackControl); } | |
159 CountedLoopEndNode *loopexit() const; | |
160 Node *init_trip() const; | |
161 Node *stride() const; | |
162 int stride_con() const; | |
163 bool stride_is_con() const; | |
164 Node *limit() const; | |
165 Node *incr() const; | |
166 Node *phi() const; | |
167 | |
168 // Match increment with optional truncation | |
169 static Node* match_incr_with_optional_truncation(Node* expr, Node** trunc1, Node** trunc2, const TypeInt** trunc_type); | |
170 | |
171 // A 'main' loop has a pre-loop and a post-loop. The 'main' loop | |
172 // can run short a few iterations and may start a few iterations in. | |
173 // It will be RCE'd and unrolled and aligned. | |
174 | |
175 // A following 'post' loop will run any remaining iterations. Used | |
176 // during Range Check Elimination, the 'post' loop will do any final | |
177 // iterations with full checks. Also used by Loop Unrolling, where | |
178 // the 'post' loop will do any epilog iterations needed. Basically, | |
179 // a 'post' loop can not profitably be further unrolled or RCE'd. | |
180 | |
181 // A preceding 'pre' loop will run at least 1 iteration (to do peeling), | |
182 // it may do under-flow checks for RCE and may do alignment iterations | |
183 // so the following main loop 'knows' that it is striding down cache | |
184 // lines. | |
185 | |
186 // A 'main' loop that is ONLY unrolled or peeled, never RCE'd or | |
187 // Aligned, may be missing it's pre-loop. | |
188 enum { Normal=0, Pre=1, Main=2, Post=3, PrePostFlagsMask=3, Main_Has_No_Pre_Loop=4 }; | |
189 int is_normal_loop() const { return (_loop_flags&PrePostFlagsMask) == Normal; } | |
190 int is_pre_loop () const { return (_loop_flags&PrePostFlagsMask) == Pre; } | |
191 int is_main_loop () const { return (_loop_flags&PrePostFlagsMask) == Main; } | |
192 int is_post_loop () const { return (_loop_flags&PrePostFlagsMask) == Post; } | |
193 int is_main_no_pre_loop() const { return _loop_flags & Main_Has_No_Pre_Loop; } | |
194 void set_main_no_pre_loop() { _loop_flags |= Main_Has_No_Pre_Loop; } | |
195 | |
367
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
196
diff
changeset
|
196 int main_idx() const { return _main_idx; } |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
196
diff
changeset
|
197 |
0 | 198 |
199 void set_pre_loop (CountedLoopNode *main) { assert(is_normal_loop(),""); _loop_flags |= Pre ; _main_idx = main->_idx; } | |
200 void set_main_loop ( ) { assert(is_normal_loop(),""); _loop_flags |= Main; } | |
201 void set_post_loop (CountedLoopNode *main) { assert(is_normal_loop(),""); _loop_flags |= Post; _main_idx = main->_idx; } | |
202 void set_normal_loop( ) { _loop_flags &= ~PrePostFlagsMask; } | |
203 | |
204 void set_trip_count(int tc) { _trip_count = tc; } | |
205 int trip_count() { return _trip_count; } | |
206 | |
207 void set_profile_trip_cnt(float ptc) { _profile_trip_cnt = ptc; } | |
208 float profile_trip_cnt() { return _profile_trip_cnt; } | |
209 | |
210 void double_unrolled_count() { _unrolled_count_log2++; } | |
211 int unrolled_count() { return 1 << MIN2(_unrolled_count_log2, BitsPerInt-3); } | |
212 | |
213 void set_node_count_before_unroll(int ct) { _node_count_before_unroll = ct; } | |
214 int node_count_before_unroll() { return _node_count_before_unroll; } | |
215 | |
216 #ifndef PRODUCT | |
217 virtual void dump_spec(outputStream *st) const; | |
218 #endif | |
219 }; | |
220 | |
221 //------------------------------CountedLoopEndNode----------------------------- | |
222 // CountedLoopEndNodes end simple trip counted loops. They act much like | |
223 // IfNodes. | |
224 class CountedLoopEndNode : public IfNode { | |
225 public: | |
226 enum { TestControl, TestValue }; | |
227 | |
228 CountedLoopEndNode( Node *control, Node *test, float prob, float cnt ) | |
229 : IfNode( control, test, prob, cnt) { | |
230 init_class_id(Class_CountedLoopEnd); | |
231 } | |
232 virtual int Opcode() const; | |
233 | |
234 Node *cmp_node() const { return (in(TestValue)->req() >=2) ? in(TestValue)->in(1) : NULL; } | |
235 Node *incr() const { Node *tmp = cmp_node(); return (tmp && tmp->req()==3) ? tmp->in(1) : NULL; } | |
236 Node *limit() const { Node *tmp = cmp_node(); return (tmp && tmp->req()==3) ? tmp->in(2) : NULL; } | |
237 Node *stride() const { Node *tmp = incr (); return (tmp && tmp->req()==3) ? tmp->in(2) : NULL; } | |
238 Node *phi() const { Node *tmp = incr (); return (tmp && tmp->req()==3) ? tmp->in(1) : NULL; } | |
239 Node *init_trip() const { Node *tmp = phi (); return (tmp && tmp->req()==3) ? tmp->in(1) : NULL; } | |
240 int stride_con() const; | |
241 bool stride_is_con() const { Node *tmp = stride (); return (tmp != NULL && tmp->is_Con()); } | |
242 BoolTest::mask test_trip() const { return in(TestValue)->as_Bool()->_test._test; } | |
243 CountedLoopNode *loopnode() const { | |
244 Node *ln = phi()->in(0); | |
245 assert( ln->Opcode() == Op_CountedLoop, "malformed loop" ); | |
246 return (CountedLoopNode*)ln; } | |
247 | |
248 #ifndef PRODUCT | |
249 virtual void dump_spec(outputStream *st) const; | |
250 #endif | |
251 }; | |
252 | |
253 | |
254 inline CountedLoopEndNode *CountedLoopNode::loopexit() const { | |
255 Node *bc = back_control(); | |
256 if( bc == NULL ) return NULL; | |
257 Node *le = bc->in(0); | |
258 if( le->Opcode() != Op_CountedLoopEnd ) | |
259 return NULL; | |
260 return (CountedLoopEndNode*)le; | |
261 } | |
262 inline Node *CountedLoopNode::init_trip() const { return loopexit() ? loopexit()->init_trip() : NULL; } | |
263 inline Node *CountedLoopNode::stride() const { return loopexit() ? loopexit()->stride() : NULL; } | |
264 inline int CountedLoopNode::stride_con() const { return loopexit() ? loopexit()->stride_con() : 0; } | |
265 inline bool CountedLoopNode::stride_is_con() const { return loopexit() && loopexit()->stride_is_con(); } | |
266 inline Node *CountedLoopNode::limit() const { return loopexit() ? loopexit()->limit() : NULL; } | |
267 inline Node *CountedLoopNode::incr() const { return loopexit() ? loopexit()->incr() : NULL; } | |
268 inline Node *CountedLoopNode::phi() const { return loopexit() ? loopexit()->phi() : NULL; } | |
269 | |
270 | |
271 // -----------------------------IdealLoopTree---------------------------------- | |
272 class IdealLoopTree : public ResourceObj { | |
273 public: | |
274 IdealLoopTree *_parent; // Parent in loop tree | |
275 IdealLoopTree *_next; // Next sibling in loop tree | |
276 IdealLoopTree *_child; // First child in loop tree | |
277 | |
278 // The head-tail backedge defines the loop. | |
279 // If tail is NULL then this loop has multiple backedges as part of the | |
280 // same loop. During cleanup I'll peel off the multiple backedges; merge | |
281 // them at the loop bottom and flow 1 real backedge into the loop. | |
282 Node *_head; // Head of loop | |
283 Node *_tail; // Tail of loop | |
284 inline Node *tail(); // Handle lazy update of _tail field | |
285 PhaseIdealLoop* _phase; | |
286 | |
287 Node_List _body; // Loop body for inner loops | |
288 | |
289 uint8 _nest; // Nesting depth | |
290 uint8 _irreducible:1, // True if irreducible | |
291 _has_call:1, // True if has call safepoint | |
292 _has_sfpt:1, // True if has non-call safepoint | |
293 _rce_candidate:1; // True if candidate for range check elimination | |
294 | |
39
76256d272075
6667612: (Escape Analysis) disable loop cloning if it has a scalar replaceable allocation
kvn
parents:
17
diff
changeset
|
295 Node_List* _required_safept; // A inner loop cannot delete these safepts; |
76256d272075
6667612: (Escape Analysis) disable loop cloning if it has a scalar replaceable allocation
kvn
parents:
17
diff
changeset
|
296 bool _allow_optimizations; // Allow loop optimizations |
0 | 297 |
298 IdealLoopTree( PhaseIdealLoop* phase, Node *head, Node *tail ) | |
299 : _parent(0), _next(0), _child(0), | |
300 _head(head), _tail(tail), | |
301 _phase(phase), | |
302 _required_safept(NULL), | |
39
76256d272075
6667612: (Escape Analysis) disable loop cloning if it has a scalar replaceable allocation
kvn
parents:
17
diff
changeset
|
303 _allow_optimizations(true), |
0 | 304 _nest(0), _irreducible(0), _has_call(0), _has_sfpt(0), _rce_candidate(0) |
305 { } | |
306 | |
307 // Is 'l' a member of 'this'? | |
308 int is_member( const IdealLoopTree *l ) const; // Test for nested membership | |
309 | |
310 // Set loop nesting depth. Accumulate has_call bits. | |
311 int set_nest( uint depth ); | |
312 | |
313 // Split out multiple fall-in edges from the loop header. Move them to a | |
314 // private RegionNode before the loop. This becomes the loop landing pad. | |
315 void split_fall_in( PhaseIdealLoop *phase, int fall_in_cnt ); | |
316 | |
317 // Split out the outermost loop from this shared header. | |
318 void split_outer_loop( PhaseIdealLoop *phase ); | |
319 | |
320 // Merge all the backedges from the shared header into a private Region. | |
321 // Feed that region as the one backedge to this loop. | |
322 void merge_many_backedges( PhaseIdealLoop *phase ); | |
323 | |
324 // Split shared headers and insert loop landing pads. | |
325 // Insert a LoopNode to replace the RegionNode. | |
326 // Returns TRUE if loop tree is structurally changed. | |
327 bool beautify_loops( PhaseIdealLoop *phase ); | |
328 | |
1172 | 329 // Perform optimization to use the loop predicates for null checks and range checks. |
330 // Applies to any loop level (not just the innermost one) | |
331 bool loop_predication( PhaseIdealLoop *phase); | |
332 | |
401
ee8f06bfb27c
6743188: incomplete fix for 6700047 C2 failed in idom_no_update
never
parents:
367
diff
changeset
|
333 // Perform iteration-splitting on inner loops. Split iterations to |
ee8f06bfb27c
6743188: incomplete fix for 6700047 C2 failed in idom_no_update
never
parents:
367
diff
changeset
|
334 // avoid range checks or one-shot null checks. Returns false if the |
ee8f06bfb27c
6743188: incomplete fix for 6700047 C2 failed in idom_no_update
never
parents:
367
diff
changeset
|
335 // current round of loop opts should stop. |
ee8f06bfb27c
6743188: incomplete fix for 6700047 C2 failed in idom_no_update
never
parents:
367
diff
changeset
|
336 bool iteration_split( PhaseIdealLoop *phase, Node_List &old_new ); |
0 | 337 |
401
ee8f06bfb27c
6743188: incomplete fix for 6700047 C2 failed in idom_no_update
never
parents:
367
diff
changeset
|
338 // Driver for various flavors of iteration splitting. Returns false |
ee8f06bfb27c
6743188: incomplete fix for 6700047 C2 failed in idom_no_update
never
parents:
367
diff
changeset
|
339 // if the current round of loop opts should stop. |
ee8f06bfb27c
6743188: incomplete fix for 6700047 C2 failed in idom_no_update
never
parents:
367
diff
changeset
|
340 bool iteration_split_impl( PhaseIdealLoop *phase, Node_List &old_new ); |
0 | 341 |
342 // Given dominators, try to find loops with calls that must always be | |
343 // executed (call dominates loop tail). These loops do not need non-call | |
344 // safepoints (ncsfpt). | |
345 void check_safepts(VectorSet &visited, Node_List &stack); | |
346 | |
347 // Allpaths backwards scan from loop tail, terminating each path at first safepoint | |
348 // encountered. | |
349 void allpaths_check_safepts(VectorSet &visited, Node_List &stack); | |
350 | |
351 // Convert to counted loops where possible | |
352 void counted_loop( PhaseIdealLoop *phase ); | |
353 | |
354 // Check for Node being a loop-breaking test | |
355 Node *is_loop_exit(Node *iff) const; | |
356 | |
357 // Returns true if ctrl is executed on every complete iteration | |
358 bool dominates_backedge(Node* ctrl); | |
359 | |
360 // Remove simplistic dead code from loop body | |
361 void DCE_loop_body(); | |
362 | |
363 // Look for loop-exit tests with my 50/50 guesses from the Parsing stage. | |
364 // Replace with a 1-in-10 exit guess. | |
365 void adjust_loop_exit_prob( PhaseIdealLoop *phase ); | |
366 | |
367 // Return TRUE or FALSE if the loop should never be RCE'd or aligned. | |
368 // Useful for unrolling loops with NO array accesses. | |
369 bool policy_peel_only( PhaseIdealLoop *phase ) const; | |
370 | |
371 // Return TRUE or FALSE if the loop should be unswitched -- clone | |
372 // loop with an invariant test | |
373 bool policy_unswitching( PhaseIdealLoop *phase ) const; | |
374 | |
375 // Micro-benchmark spamming. Remove empty loops. | |
376 bool policy_do_remove_empty_loop( PhaseIdealLoop *phase ); | |
377 | |
378 // Return TRUE or FALSE if the loop should be peeled or not. Peel if we can | |
379 // make some loop-invariant test (usually a null-check) happen before the | |
380 // loop. | |
381 bool policy_peeling( PhaseIdealLoop *phase ) const; | |
382 | |
383 // Return TRUE or FALSE if the loop should be maximally unrolled. Stash any | |
384 // known trip count in the counted loop node. | |
385 bool policy_maximally_unroll( PhaseIdealLoop *phase ) const; | |
386 | |
387 // Return TRUE or FALSE if the loop should be unrolled or not. Unroll if | |
388 // the loop is a CountedLoop and the body is small enough. | |
389 bool policy_unroll( PhaseIdealLoop *phase ) const; | |
390 | |
391 // Return TRUE or FALSE if the loop should be range-check-eliminated. | |
392 // Gather a list of IF tests that are dominated by iteration splitting; | |
393 // also gather the end of the first split and the start of the 2nd split. | |
394 bool policy_range_check( PhaseIdealLoop *phase ) const; | |
395 | |
396 // Return TRUE or FALSE if the loop should be cache-line aligned. | |
397 // Gather the expression that does the alignment. Note that only | |
605 | 398 // one array base can be aligned in a loop (unless the VM guarantees |
0 | 399 // mutual alignment). Note that if we vectorize short memory ops |
400 // into longer memory ops, we may want to increase alignment. | |
401 bool policy_align( PhaseIdealLoop *phase ) const; | |
402 | |
1172 | 403 // Return TRUE if "iff" is a range check. |
404 bool is_range_check_if(IfNode *iff, PhaseIdealLoop *phase, Invariance& invar) const; | |
405 | |
0 | 406 // Compute loop trip count from profile data |
407 void compute_profile_trip_cnt( PhaseIdealLoop *phase ); | |
408 | |
409 // Reassociate invariant expressions. | |
410 void reassociate_invariants(PhaseIdealLoop *phase); | |
411 // Reassociate invariant add and subtract expressions. | |
412 Node* reassociate_add_sub(Node* n1, PhaseIdealLoop *phase); | |
413 // Return nonzero index of invariant operand if invariant and variant | |
605 | 414 // are combined with an Add or Sub. Helper for reassociate_invariants. |
0 | 415 int is_invariant_addition(Node* n, PhaseIdealLoop *phase); |
416 | |
417 // Return true if n is invariant | |
418 bool is_invariant(Node* n) const; | |
419 | |
420 // Put loop body on igvn work list | |
421 void record_for_igvn(); | |
422 | |
423 bool is_loop() { return !_irreducible && _tail && !_tail->is_top(); } | |
424 bool is_inner() { return is_loop() && _child == NULL; } | |
425 bool is_counted() { return is_loop() && _head != NULL && _head->is_CountedLoop(); } | |
426 | |
427 #ifndef PRODUCT | |
428 void dump_head( ) const; // Dump loop head only | |
429 void dump() const; // Dump this loop recursively | |
430 void verify_tree(IdealLoopTree *loop, const IdealLoopTree *parent) const; | |
431 #endif | |
432 | |
433 }; | |
434 | |
435 // -----------------------------PhaseIdealLoop--------------------------------- | |
436 // Computes the mapping from Nodes to IdealLoopTrees. Organizes IdealLoopTrees into a | |
437 // loop tree. Drives the loop-based transformations on the ideal graph. | |
438 class PhaseIdealLoop : public PhaseTransform { | |
439 friend class IdealLoopTree; | |
440 friend class SuperWord; | |
441 // Pre-computed def-use info | |
442 PhaseIterGVN &_igvn; | |
443 | |
444 // Head of loop tree | |
445 IdealLoopTree *_ltree_root; | |
446 | |
447 // Array of pre-order numbers, plus post-visited bit. | |
448 // ZERO for not pre-visited. EVEN for pre-visited but not post-visited. | |
449 // ODD for post-visited. Other bits are the pre-order number. | |
450 uint *_preorders; | |
451 uint _max_preorder; | |
452 | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
453 const PhaseIdealLoop* _verify_me; |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
454 bool _verify_only; |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
455 |
0 | 456 // Allocate _preorders[] array |
457 void allocate_preorders() { | |
458 _max_preorder = C->unique()+8; | |
459 _preorders = NEW_RESOURCE_ARRAY(uint, _max_preorder); | |
460 memset(_preorders, 0, sizeof(uint) * _max_preorder); | |
461 } | |
462 | |
463 // Allocate _preorders[] array | |
464 void reallocate_preorders() { | |
465 if ( _max_preorder < C->unique() ) { | |
466 _preorders = REALLOC_RESOURCE_ARRAY(uint, _preorders, _max_preorder, C->unique()); | |
467 _max_preorder = C->unique(); | |
468 } | |
469 memset(_preorders, 0, sizeof(uint) * _max_preorder); | |
470 } | |
471 | |
472 // Check to grow _preorders[] array for the case when build_loop_tree_impl() | |
473 // adds new nodes. | |
474 void check_grow_preorders( ) { | |
475 if ( _max_preorder < C->unique() ) { | |
476 uint newsize = _max_preorder<<1; // double size of array | |
477 _preorders = REALLOC_RESOURCE_ARRAY(uint, _preorders, _max_preorder, newsize); | |
478 memset(&_preorders[_max_preorder],0,sizeof(uint)*(newsize-_max_preorder)); | |
479 _max_preorder = newsize; | |
480 } | |
481 } | |
482 // Check for pre-visited. Zero for NOT visited; non-zero for visited. | |
483 int is_visited( Node *n ) const { return _preorders[n->_idx]; } | |
484 // Pre-order numbers are written to the Nodes array as low-bit-set values. | |
485 void set_preorder_visited( Node *n, int pre_order ) { | |
486 assert( !is_visited( n ), "already set" ); | |
487 _preorders[n->_idx] = (pre_order<<1); | |
488 }; | |
489 // Return pre-order number. | |
490 int get_preorder( Node *n ) const { assert( is_visited(n), "" ); return _preorders[n->_idx]>>1; } | |
491 | |
492 // Check for being post-visited. | |
493 // Should be previsited already (checked with assert(is_visited(n))). | |
494 int is_postvisited( Node *n ) const { assert( is_visited(n), "" ); return _preorders[n->_idx]&1; } | |
495 | |
496 // Mark as post visited | |
497 void set_postvisited( Node *n ) { assert( !is_postvisited( n ), "" ); _preorders[n->_idx] |= 1; } | |
498 | |
499 // Set/get control node out. Set lower bit to distinguish from IdealLoopTree | |
500 // Returns true if "n" is a data node, false if it's a control node. | |
501 bool has_ctrl( Node *n ) const { return ((intptr_t)_nodes[n->_idx]) & 1; } | |
502 | |
503 // clear out dead code after build_loop_late | |
504 Node_List _deadlist; | |
505 | |
506 // Support for faster execution of get_late_ctrl()/dom_lca() | |
507 // when a node has many uses and dominator depth is deep. | |
508 Node_Array _dom_lca_tags; | |
509 void init_dom_lca_tags(); | |
510 void clear_dom_lca_tags(); | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
511 |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
512 // Helper for debugging bad dominance relationships |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
513 bool verify_dominance(Node* n, Node* use, Node* LCA, Node* early); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
514 |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
515 Node* compute_lca_of_uses(Node* n, Node* early, bool verify = false); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
516 |
0 | 517 // Inline wrapper for frequent cases: |
518 // 1) only one use | |
519 // 2) a use is the same as the current LCA passed as 'n1' | |
520 Node *dom_lca_for_get_late_ctrl( Node *lca, Node *n, Node *tag ) { | |
521 assert( n->is_CFG(), "" ); | |
522 // Fast-path NULL lca | |
523 if( lca != NULL && lca != n ) { | |
524 assert( lca->is_CFG(), "" ); | |
525 // find LCA of all uses | |
526 n = dom_lca_for_get_late_ctrl_internal( lca, n, tag ); | |
527 } | |
528 return find_non_split_ctrl(n); | |
529 } | |
530 Node *dom_lca_for_get_late_ctrl_internal( Node *lca, Node *n, Node *tag ); | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
531 |
0 | 532 // Helper function for directing control inputs away from CFG split |
533 // points. | |
534 Node *find_non_split_ctrl( Node *ctrl ) const { | |
535 if (ctrl != NULL) { | |
536 if (ctrl->is_MultiBranch()) { | |
537 ctrl = ctrl->in(0); | |
538 } | |
539 assert(ctrl->is_CFG(), "CFG"); | |
540 } | |
541 return ctrl; | |
542 } | |
543 | |
544 public: | |
545 bool has_node( Node* n ) const { return _nodes[n->_idx] != NULL; } | |
546 // check if transform created new nodes that need _ctrl recorded | |
547 Node *get_late_ctrl( Node *n, Node *early ); | |
548 Node *get_early_ctrl( Node *n ); | |
549 void set_early_ctrl( Node *n ); | |
550 void set_subtree_ctrl( Node *root ); | |
551 void set_ctrl( Node *n, Node *ctrl ) { | |
552 assert( !has_node(n) || has_ctrl(n), "" ); | |
553 assert( ctrl->in(0), "cannot set dead control node" ); | |
554 assert( ctrl == find_non_split_ctrl(ctrl), "must set legal crtl" ); | |
555 _nodes.map( n->_idx, (Node*)((intptr_t)ctrl + 1) ); | |
556 } | |
557 // Set control and update loop membership | |
558 void set_ctrl_and_loop(Node* n, Node* ctrl) { | |
559 IdealLoopTree* old_loop = get_loop(get_ctrl(n)); | |
560 IdealLoopTree* new_loop = get_loop(ctrl); | |
561 if (old_loop != new_loop) { | |
562 if (old_loop->_child == NULL) old_loop->_body.yank(n); | |
563 if (new_loop->_child == NULL) new_loop->_body.push(n); | |
564 } | |
565 set_ctrl(n, ctrl); | |
566 } | |
567 // Control nodes can be replaced or subsumed. During this pass they | |
568 // get their replacement Node in slot 1. Instead of updating the block | |
569 // location of all Nodes in the subsumed block, we lazily do it. As we | |
570 // pull such a subsumed block out of the array, we write back the final | |
571 // correct block. | |
572 Node *get_ctrl( Node *i ) { | |
573 assert(has_node(i), ""); | |
574 Node *n = get_ctrl_no_update(i); | |
575 _nodes.map( i->_idx, (Node*)((intptr_t)n + 1) ); | |
576 assert(has_node(i) && has_ctrl(i), ""); | |
577 assert(n == find_non_split_ctrl(n), "must return legal ctrl" ); | |
578 return n; | |
579 } | |
1172 | 580 // true if CFG node d dominates CFG node n |
581 bool is_dominator(Node *d, Node *n); | |
582 // return get_ctrl for a data node and self(n) for a CFG node | |
583 Node* ctrl_or_self(Node* n) { | |
584 if (has_ctrl(n)) | |
585 return get_ctrl(n); | |
586 else { | |
587 assert (n->is_CFG(), "must be a CFG node"); | |
588 return n; | |
589 } | |
590 } | |
0 | 591 |
592 private: | |
593 Node *get_ctrl_no_update( Node *i ) const { | |
594 assert( has_ctrl(i), "" ); | |
595 Node *n = (Node*)(((intptr_t)_nodes[i->_idx]) & ~1); | |
596 if (!n->in(0)) { | |
597 // Skip dead CFG nodes | |
598 do { | |
599 n = (Node*)(((intptr_t)_nodes[n->_idx]) & ~1); | |
600 } while (!n->in(0)); | |
601 n = find_non_split_ctrl(n); | |
602 } | |
603 return n; | |
604 } | |
605 | |
606 // Check for loop being set | |
607 // "n" must be a control node. Returns true if "n" is known to be in a loop. | |
608 bool has_loop( Node *n ) const { | |
609 assert(!has_node(n) || !has_ctrl(n), ""); | |
610 return has_node(n); | |
611 } | |
612 // Set loop | |
613 void set_loop( Node *n, IdealLoopTree *loop ) { | |
614 _nodes.map(n->_idx, (Node*)loop); | |
615 } | |
616 // Lazy-dazy update of 'get_ctrl' and 'idom_at' mechanisms. Replace | |
617 // the 'old_node' with 'new_node'. Kill old-node. Add a reference | |
618 // from old_node to new_node to support the lazy update. Reference | |
1172 | 619 // replaces loop reference, since that is not needed for dead node. |
0 | 620 public: |
621 void lazy_update( Node *old_node, Node *new_node ) { | |
622 assert( old_node != new_node, "no cycles please" ); | |
623 //old_node->set_req( 1, new_node /*NO DU INFO*/ ); | |
624 // Nodes always have DU info now, so re-use the side array slot | |
625 // for this node to provide the forwarding pointer. | |
626 _nodes.map( old_node->_idx, (Node*)((intptr_t)new_node + 1) ); | |
627 } | |
628 void lazy_replace( Node *old_node, Node *new_node ) { | |
1621
6027dddc26c6
6677629: PhaseIterGVN::subsume_node() should call hash_delete() and add_users_to_worklist()
kvn
parents:
1552
diff
changeset
|
629 _igvn.replace_node( old_node, new_node ); |
0 | 630 lazy_update( old_node, new_node ); |
631 } | |
632 void lazy_replace_proj( Node *old_node, Node *new_node ) { | |
633 assert( old_node->req() == 1, "use this for Projs" ); | |
634 _igvn.hash_delete(old_node); // Must hash-delete before hacking edges | |
635 old_node->add_req( NULL ); | |
636 lazy_replace( old_node, new_node ); | |
637 } | |
638 | |
639 private: | |
640 | |
641 // Place 'n' in some loop nest, where 'n' is a CFG node | |
642 void build_loop_tree(); | |
643 int build_loop_tree_impl( Node *n, int pre_order ); | |
644 // Insert loop into the existing loop tree. 'innermost' is a leaf of the | |
645 // loop tree, not the root. | |
646 IdealLoopTree *sort( IdealLoopTree *loop, IdealLoopTree *innermost ); | |
647 | |
648 // Place Data nodes in some loop nest | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
649 void build_loop_early( VectorSet &visited, Node_List &worklist, Node_Stack &nstack ); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
650 void build_loop_late ( VectorSet &visited, Node_List &worklist, Node_Stack &nstack ); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
651 void build_loop_late_post ( Node* n ); |
0 | 652 |
653 // Array of immediate dominance info for each CFG node indexed by node idx | |
654 private: | |
655 uint _idom_size; | |
656 Node **_idom; // Array of immediate dominators | |
657 uint *_dom_depth; // Used for fast LCA test | |
658 GrowableArray<uint>* _dom_stk; // For recomputation of dom depth | |
659 | |
660 Node* idom_no_update(Node* d) const { | |
661 assert(d->_idx < _idom_size, "oob"); | |
662 Node* n = _idom[d->_idx]; | |
663 assert(n != NULL,"Bad immediate dominator info."); | |
664 while (n->in(0) == NULL) { // Skip dead CFG nodes | |
665 //n = n->in(1); | |
666 n = (Node*)(((intptr_t)_nodes[n->_idx]) & ~1); | |
667 assert(n != NULL,"Bad immediate dominator info."); | |
668 } | |
669 return n; | |
670 } | |
671 Node *idom(Node* d) const { | |
672 uint didx = d->_idx; | |
673 Node *n = idom_no_update(d); | |
674 _idom[didx] = n; // Lazily remove dead CFG nodes from table. | |
675 return n; | |
676 } | |
677 uint dom_depth(Node* d) const { | |
678 assert(d->_idx < _idom_size, ""); | |
679 return _dom_depth[d->_idx]; | |
680 } | |
681 void set_idom(Node* d, Node* n, uint dom_depth); | |
682 // Locally compute IDOM using dom_lca call | |
683 Node *compute_idom( Node *region ) const; | |
684 // Recompute dom_depth | |
685 void recompute_dom_depth(); | |
686 | |
687 // Is safept not required by an outer loop? | |
688 bool is_deleteable_safept(Node* sfpt); | |
689 | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
690 // Perform verification that the graph is valid. |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
691 PhaseIdealLoop( PhaseIterGVN &igvn) : |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
692 PhaseTransform(Ideal_Loop), |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
693 _igvn(igvn), |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
694 _dom_lca_tags(C->comp_arena()), |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
695 _verify_me(NULL), |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
696 _verify_only(true) { |
1172 | 697 build_and_optimize(false, false); |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
698 } |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
699 |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
700 // build the loop tree and perform any requested optimizations |
1172 | 701 void build_and_optimize(bool do_split_if, bool do_loop_pred); |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
702 |
0 | 703 public: |
704 // Dominators for the sea of nodes | |
705 void Dominators(); | |
706 Node *dom_lca( Node *n1, Node *n2 ) const { | |
707 return find_non_split_ctrl(dom_lca_internal(n1, n2)); | |
708 } | |
709 Node *dom_lca_internal( Node *n1, Node *n2 ) const; | |
710 | |
711 // Compute the Ideal Node to Loop mapping | |
1172 | 712 PhaseIdealLoop( PhaseIterGVN &igvn, bool do_split_ifs, bool do_loop_pred) : |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
713 PhaseTransform(Ideal_Loop), |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
714 _igvn(igvn), |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
715 _dom_lca_tags(C->comp_arena()), |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
716 _verify_me(NULL), |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
717 _verify_only(false) { |
1172 | 718 build_and_optimize(do_split_ifs, do_loop_pred); |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
719 } |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
720 |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
721 // Verify that verify_me made the same decisions as a fresh run. |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
722 PhaseIdealLoop( PhaseIterGVN &igvn, const PhaseIdealLoop *verify_me) : |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
723 PhaseTransform(Ideal_Loop), |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
724 _igvn(igvn), |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
725 _dom_lca_tags(C->comp_arena()), |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
726 _verify_me(verify_me), |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
727 _verify_only(false) { |
1172 | 728 build_and_optimize(false, false); |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
729 } |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
730 |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
731 // Build and verify the loop tree without modifying the graph. This |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
732 // is useful to verify that all inputs properly dominate their uses. |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
733 static void verify(PhaseIterGVN& igvn) { |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
734 #ifdef ASSERT |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
735 PhaseIdealLoop v(igvn); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
736 #endif |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
605
diff
changeset
|
737 } |
0 | 738 |
739 // True if the method has at least 1 irreducible loop | |
740 bool _has_irreducible_loops; | |
741 | |
742 // Per-Node transform | |
743 virtual Node *transform( Node *a_node ) { return 0; } | |
744 | |
745 Node *is_counted_loop( Node *x, IdealLoopTree *loop ); | |
746 | |
747 // Return a post-walked LoopNode | |
748 IdealLoopTree *get_loop( Node *n ) const { | |
749 // Dead nodes have no loop, so return the top level loop instead | |
750 if (!has_node(n)) return _ltree_root; | |
751 assert(!has_ctrl(n), ""); | |
752 return (IdealLoopTree*)_nodes[n->_idx]; | |
753 } | |
754 | |
755 // Is 'n' a (nested) member of 'loop'? | |
756 int is_member( const IdealLoopTree *loop, Node *n ) const { | |
757 return loop->is_member(get_loop(n)); } | |
758 | |
759 // This is the basic building block of the loop optimizations. It clones an | |
760 // entire loop body. It makes an old_new loop body mapping; with this | |
761 // mapping you can find the new-loop equivalent to an old-loop node. All | |
762 // new-loop nodes are exactly equal to their old-loop counterparts, all | |
763 // edges are the same. All exits from the old-loop now have a RegionNode | |
764 // that merges the equivalent new-loop path. This is true even for the | |
765 // normal "loop-exit" condition. All uses of loop-invariant old-loop values | |
766 // now come from (one or more) Phis that merge their new-loop equivalents. | |
767 // Parameter side_by_side_idom: | |
768 // When side_by_size_idom is NULL, the dominator tree is constructed for | |
769 // the clone loop to dominate the original. Used in construction of | |
770 // pre-main-post loop sequence. | |
771 // When nonnull, the clone and original are side-by-side, both are | |
772 // dominated by the passed in side_by_side_idom node. Used in | |
773 // construction of unswitched loops. | |
774 void clone_loop( IdealLoopTree *loop, Node_List &old_new, int dom_depth, | |
775 Node* side_by_side_idom = NULL); | |
776 | |
777 // If we got the effect of peeling, either by actually peeling or by | |
778 // making a pre-loop which must execute at least once, we can remove | |
779 // all loop-invariant dominated tests in the main body. | |
780 void peeled_dom_test_elim( IdealLoopTree *loop, Node_List &old_new ); | |
781 | |
782 // Generate code to do a loop peel for the given loop (and body). | |
783 // old_new is a temp array. | |
784 void do_peeling( IdealLoopTree *loop, Node_List &old_new ); | |
785 | |
786 // Add pre and post loops around the given loop. These loops are used | |
787 // during RCE, unrolling and aligning loops. | |
788 void insert_pre_post_loops( IdealLoopTree *loop, Node_List &old_new, bool peel_only ); | |
789 // If Node n lives in the back_ctrl block, we clone a private version of n | |
790 // in preheader_ctrl block and return that, otherwise return n. | |
791 Node *clone_up_backedge_goo( Node *back_ctrl, Node *preheader_ctrl, Node *n ); | |
792 | |
793 // Take steps to maximally unroll the loop. Peel any odd iterations, then | |
794 // unroll to do double iterations. The next round of major loop transforms | |
795 // will repeat till the doubled loop body does all remaining iterations in 1 | |
796 // pass. | |
797 void do_maximally_unroll( IdealLoopTree *loop, Node_List &old_new ); | |
798 | |
799 // Unroll the loop body one step - make each trip do 2 iterations. | |
800 void do_unroll( IdealLoopTree *loop, Node_List &old_new, bool adjust_min_trip ); | |
801 | |
802 // Return true if exp is a constant times an induction var | |
803 bool is_scaled_iv(Node* exp, Node* iv, int* p_scale); | |
804 | |
805 // Return true if exp is a scaled induction var plus (or minus) constant | |
806 bool is_scaled_iv_plus_offset(Node* exp, Node* iv, int* p_scale, Node** p_offset, int depth = 0); | |
807 | |
1172 | 808 // Return true if proj is for "proj->[region->..]call_uct" |
809 bool is_uncommon_trap_proj(ProjNode* proj, bool must_reason_predicate = false); | |
810 // Return true for "if(test)-> proj -> ... | |
811 // | | |
812 // V | |
813 // other_proj->[region->..]call_uct" | |
814 bool is_uncommon_trap_if_pattern(ProjNode* proj, bool must_reason_predicate = false); | |
815 // Create a new if above the uncommon_trap_if_pattern for the predicate to be promoted | |
816 ProjNode* create_new_if_for_predicate(ProjNode* cont_proj); | |
817 // Find a good location to insert a predicate | |
818 ProjNode* find_predicate_insertion_point(Node* start_c); | |
819 // Construct a range check for a predicate if | |
820 BoolNode* rc_predicate(Node* ctrl, | |
821 int scale, Node* offset, | |
822 Node* init, Node* limit, Node* stride, | |
1303
c047da02984c
6930043: C2: SIGSEGV in javasoft.sqe.tests.lang.arr017.arr01702.arr01702.loop_forw(II)I
never
parents:
1172
diff
changeset
|
823 Node* range, bool upper); |
1172 | 824 |
825 // Implementation of the loop predication to promote checks outside the loop | |
826 bool loop_predication_impl(IdealLoopTree *loop); | |
827 | |
828 // Helper function to collect predicate for eliminating the useless ones | |
829 void collect_potentially_useful_predicates(IdealLoopTree *loop, Unique_Node_List &predicate_opaque1); | |
830 void eliminate_useless_predicates(); | |
831 | |
0 | 832 // Eliminate range-checks and other trip-counter vs loop-invariant tests. |
833 void do_range_check( IdealLoopTree *loop, Node_List &old_new ); | |
834 | |
835 // Create a slow version of the loop by cloning the loop | |
836 // and inserting an if to select fast-slow versions. | |
837 ProjNode* create_slow_version_of_loop(IdealLoopTree *loop, | |
838 Node_List &old_new); | |
839 | |
840 // Clone loop with an invariant test (that does not exit) and | |
841 // insert a clone of the test that selects which version to | |
842 // execute. | |
843 void do_unswitching (IdealLoopTree *loop, Node_List &old_new); | |
844 | |
845 // Find candidate "if" for unswitching | |
846 IfNode* find_unswitching_candidate(const IdealLoopTree *loop) const; | |
847 | |
848 // Range Check Elimination uses this function! | |
849 // Constrain the main loop iterations so the affine function: | |
850 // scale_con * I + offset < limit | |
851 // always holds true. That is, either increase the number of iterations in | |
852 // the pre-loop or the post-loop until the condition holds true in the main | |
853 // loop. Scale_con, offset and limit are all loop invariant. | |
854 void add_constraint( int stride_con, int scale_con, Node *offset, Node *limit, Node *pre_ctrl, Node **pre_limit, Node **main_limit ); | |
855 | |
856 // Partially peel loop up through last_peel node. | |
857 bool partial_peel( IdealLoopTree *loop, Node_List &old_new ); | |
858 | |
859 // Create a scheduled list of nodes control dependent on ctrl set. | |
860 void scheduled_nodelist( IdealLoopTree *loop, VectorSet& ctrl, Node_List &sched ); | |
861 // Has a use in the vector set | |
862 bool has_use_in_set( Node* n, VectorSet& vset ); | |
863 // Has use internal to the vector set (ie. not in a phi at the loop head) | |
864 bool has_use_internal_to_set( Node* n, VectorSet& vset, IdealLoopTree *loop ); | |
865 // clone "n" for uses that are outside of loop | |
866 void clone_for_use_outside_loop( IdealLoopTree *loop, Node* n, Node_List& worklist ); | |
867 // clone "n" for special uses that are in the not_peeled region | |
868 void clone_for_special_use_inside_loop( IdealLoopTree *loop, Node* n, | |
869 VectorSet& not_peel, Node_List& sink_list, Node_List& worklist ); | |
870 // Insert phi(lp_entry_val, back_edge_val) at use->in(idx) for loop lp if phi does not already exist | |
871 void insert_phi_for_loop( Node* use, uint idx, Node* lp_entry_val, Node* back_edge_val, LoopNode* lp ); | |
872 #ifdef ASSERT | |
873 // Validate the loop partition sets: peel and not_peel | |
874 bool is_valid_loop_partition( IdealLoopTree *loop, VectorSet& peel, Node_List& peel_list, VectorSet& not_peel ); | |
875 // Ensure that uses outside of loop are of the right form | |
876 bool is_valid_clone_loop_form( IdealLoopTree *loop, Node_List& peel_list, | |
877 uint orig_exit_idx, uint clone_exit_idx); | |
878 bool is_valid_clone_loop_exit_use( IdealLoopTree *loop, Node* use, uint exit_idx); | |
879 #endif | |
880 | |
881 // Returns nonzero constant stride if-node is a possible iv test (otherwise returns zero.) | |
882 int stride_of_possible_iv( Node* iff ); | |
883 bool is_possible_iv_test( Node* iff ) { return stride_of_possible_iv(iff) != 0; } | |
884 // Return the (unique) control output node that's in the loop (if it exists.) | |
885 Node* stay_in_loop( Node* n, IdealLoopTree *loop); | |
886 // Insert a signed compare loop exit cloned from an unsigned compare. | |
887 IfNode* insert_cmpi_loop_exit(IfNode* if_cmpu, IdealLoopTree *loop); | |
888 void remove_cmpi_loop_exit(IfNode* if_cmp, IdealLoopTree *loop); | |
889 // Utility to register node "n" with PhaseIdealLoop | |
890 void register_node(Node* n, IdealLoopTree *loop, Node* pred, int ddepth); | |
891 // Utility to create an if-projection | |
892 ProjNode* proj_clone(ProjNode* p, IfNode* iff); | |
893 // Force the iff control output to be the live_proj | |
894 Node* short_circuit_if(IfNode* iff, ProjNode* live_proj); | |
895 // Insert a region before an if projection | |
896 RegionNode* insert_region_before_proj(ProjNode* proj); | |
897 // Insert a new if before an if projection | |
898 ProjNode* insert_if_before_proj(Node* left, bool Signed, BoolTest::mask relop, Node* right, ProjNode* proj); | |
899 | |
900 // Passed in a Phi merging (recursively) some nearly equivalent Bool/Cmps. | |
901 // "Nearly" because all Nodes have been cloned from the original in the loop, | |
902 // but the fall-in edges to the Cmp are different. Clone bool/Cmp pairs | |
903 // through the Phi recursively, and return a Bool. | |
904 BoolNode *clone_iff( PhiNode *phi, IdealLoopTree *loop ); | |
905 CmpNode *clone_bool( PhiNode *phi, IdealLoopTree *loop ); | |
906 | |
907 | |
908 // Rework addressing expressions to get the most loop-invariant stuff | |
909 // moved out. We'd like to do all associative operators, but it's especially | |
910 // important (common) to do address expressions. | |
911 Node *remix_address_expressions( Node *n ); | |
912 | |
913 // Attempt to use a conditional move instead of a phi/branch | |
914 Node *conditional_move( Node *n ); | |
915 | |
916 // Reorganize offset computations to lower register pressure. | |
917 // Mostly prevent loop-fallout uses of the pre-incremented trip counter | |
918 // (which are then alive with the post-incremented trip counter | |
919 // forcing an extra register move) | |
920 void reorg_offsets( IdealLoopTree *loop ); | |
921 | |
922 // Check for aggressive application of 'split-if' optimization, | |
923 // using basic block level info. | |
924 void split_if_with_blocks ( VectorSet &visited, Node_Stack &nstack ); | |
925 Node *split_if_with_blocks_pre ( Node *n ); | |
926 void split_if_with_blocks_post( Node *n ); | |
927 Node *has_local_phi_input( Node *n ); | |
928 // Mark an IfNode as being dominated by a prior test, | |
929 // without actually altering the CFG (and hence IDOM info). | |
930 void dominated_by( Node *prevdom, Node *iff ); | |
931 | |
932 // Split Node 'n' through merge point | |
933 Node *split_thru_region( Node *n, Node *region ); | |
934 // Split Node 'n' through merge point if there is enough win. | |
935 Node *split_thru_phi( Node *n, Node *region, int policy ); | |
936 // Found an If getting its condition-code input from a Phi in the | |
937 // same block. Split thru the Region. | |
938 void do_split_if( Node *iff ); | |
939 | |
940 private: | |
941 // Return a type based on condition control flow | |
942 const TypeInt* filtered_type( Node *n, Node* n_ctrl); | |
943 const TypeInt* filtered_type( Node *n ) { return filtered_type(n, NULL); } | |
944 // Helpers for filtered type | |
945 const TypeInt* filtered_type_from_dominators( Node* val, Node *val_ctrl); | |
946 | |
947 // Helper functions | |
948 Node *spinup( Node *iff, Node *new_false, Node *new_true, Node *region, Node *phi, small_cache *cache ); | |
949 Node *find_use_block( Node *use, Node *def, Node *old_false, Node *new_false, Node *old_true, Node *new_true ); | |
950 void handle_use( Node *use, Node *def, small_cache *cache, Node *region_dom, Node *new_false, Node *new_true, Node *old_false, Node *old_true ); | |
951 bool split_up( Node *n, Node *blk1, Node *blk2 ); | |
952 void sink_use( Node *use, Node *post_loop ); | |
953 Node *place_near_use( Node *useblock ) const; | |
954 | |
955 bool _created_loop_node; | |
956 public: | |
957 void set_created_loop_node() { _created_loop_node = true; } | |
958 bool created_loop_node() { return _created_loop_node; } | |
1172 | 959 void register_new_node( Node *n, Node *blk ); |
0 | 960 |
961 #ifndef PRODUCT | |
962 void dump( ) const; | |
963 void dump( IdealLoopTree *loop, uint rpo_idx, Node_List &rpo_list ) const; | |
964 void rpo( Node *start, Node_Stack &stk, VectorSet &visited, Node_List &rpo_list ) const; | |
965 void verify() const; // Major slow :-) | |
966 void verify_compare( Node *n, const PhaseIdealLoop *loop_verify, VectorSet &visited ) const; | |
967 IdealLoopTree *get_loop_idx(Node* n) const { | |
968 // Dead nodes have no loop, so return the top level loop instead | |
969 return _nodes[n->_idx] ? (IdealLoopTree*)_nodes[n->_idx] : _ltree_root; | |
970 } | |
971 // Print some stats | |
972 static void print_statistics(); | |
973 static int _loop_invokes; // Count of PhaseIdealLoop invokes | |
974 static int _loop_work; // Sum of PhaseIdealLoop x _unique | |
975 #endif | |
976 }; | |
977 | |
978 inline Node* IdealLoopTree::tail() { | |
979 // Handle lazy update of _tail field | |
980 Node *n = _tail; | |
981 //while( !n->in(0) ) // Skip dead CFG nodes | |
982 //n = n->in(1); | |
983 if (n->in(0) == NULL) | |
984 n = _phase->get_ctrl(n); | |
985 _tail = n; | |
986 return n; | |
987 } | |
988 | |
989 | |
990 // Iterate over the loop tree using a preorder, left-to-right traversal. | |
991 // | |
992 // Example that visits all counted loops from within PhaseIdealLoop | |
993 // | |
994 // for (LoopTreeIterator iter(_ltree_root); !iter.done(); iter.next()) { | |
995 // IdealLoopTree* lpt = iter.current(); | |
996 // if (!lpt->is_counted()) continue; | |
997 // ... | |
998 class LoopTreeIterator : public StackObj { | |
999 private: | |
1000 IdealLoopTree* _root; | |
1001 IdealLoopTree* _curnt; | |
1002 | |
1003 public: | |
1004 LoopTreeIterator(IdealLoopTree* root) : _root(root), _curnt(root) {} | |
1005 | |
1006 bool done() { return _curnt == NULL; } // Finished iterating? | |
1007 | |
1008 void next(); // Advance to next loop tree | |
1009 | |
1010 IdealLoopTree* current() { return _curnt; } // Return current value of iterator. | |
1011 }; |