Mercurial > hg > truffle
annotate src/share/vm/opto/loopnode.cpp @ 14649:f6301b007a16
6498581: ThreadInterruptTest3 produces wrong output on Windows
Summary: There is race condition between os::interrupt and os::is_interrupted on Windows. In JVM_Sleep(Thread.sleep), check if thread gets interrupted, it may see interrupted but not really interrupted so cause spurious waking up (early return from sleep). Fix by checking if interrupt event really gets set thus prevent false return. For intrinsic of _isInterrupted, on Windows, go fastpath only on bit not set.
Reviewed-by: acorn, kvn
Contributed-by: david.holmes@oracle.com, yumin.qi@oracle.com
author | minqi |
---|---|
date | Wed, 26 Feb 2014 15:20:41 -0800 |
parents | 3213ba4d3dff |
children | cd3c534f8f4a |
rev | line source |
---|---|
0 | 1 /* |
10405 | 2 * Copyright (c) 1998, 2013, 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:
1172
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1172
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:
1172
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "ci/ciMethodData.hpp" | |
27 #include "compiler/compileLog.hpp" | |
28 #include "libadt/vectset.hpp" | |
29 #include "memory/allocation.inline.hpp" | |
30 #include "opto/addnode.hpp" | |
31 #include "opto/callnode.hpp" | |
32 #include "opto/connode.hpp" | |
33 #include "opto/divnode.hpp" | |
34 #include "opto/idealGraphPrinter.hpp" | |
35 #include "opto/loopnode.hpp" | |
36 #include "opto/mulnode.hpp" | |
37 #include "opto/rootnode.hpp" | |
38 #include "opto/superword.hpp" | |
0 | 39 |
40 //============================================================================= | |
41 //------------------------------is_loop_iv------------------------------------- | |
42 // Determine if a node is Counted loop induction variable. | |
43 // The method is declared in node.hpp. | |
44 const Node* Node::is_loop_iv() const { | |
45 if (this->is_Phi() && !this->as_Phi()->is_copy() && | |
46 this->as_Phi()->region()->is_CountedLoop() && | |
47 this->as_Phi()->region()->as_CountedLoop()->phi() == this) { | |
48 return this; | |
49 } else { | |
50 return NULL; | |
51 } | |
52 } | |
53 | |
54 //============================================================================= | |
55 //------------------------------dump_spec-------------------------------------- | |
56 // Dump special per-node info | |
57 #ifndef PRODUCT | |
58 void LoopNode::dump_spec(outputStream *st) const { | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
59 if (is_inner_loop()) st->print( "inner " ); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
60 if (is_partial_peel_loop()) st->print( "partial_peel " ); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
61 if (partial_peel_has_failed()) st->print( "partial_peel_failed " ); |
0 | 62 } |
63 #endif | |
64 | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
65 //------------------------------is_valid_counted_loop------------------------- |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
66 bool LoopNode::is_valid_counted_loop() const { |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
67 if (is_CountedLoop()) { |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
68 CountedLoopNode* l = as_CountedLoop(); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
69 CountedLoopEndNode* le = l->loopexit(); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
70 if (le != NULL && |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
71 le->proj_out(1 /* true */) == l->in(LoopNode::LoopBackControl)) { |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
72 Node* phi = l->phi(); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
73 Node* exit = le->proj_out(0 /* false */); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
74 if (exit != NULL && exit->Opcode() == Op_IfFalse && |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
75 phi != NULL && phi->is_Phi() && |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
76 phi->in(LoopNode::LoopBackControl) == l->incr() && |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
77 le->loopnode() == l && le->stride_is_con()) { |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
78 return true; |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
79 } |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
80 } |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
81 } |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
82 return false; |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
83 } |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
84 |
0 | 85 //------------------------------get_early_ctrl--------------------------------- |
86 // Compute earliest legal control | |
87 Node *PhaseIdealLoop::get_early_ctrl( Node *n ) { | |
88 assert( !n->is_Phi() && !n->is_CFG(), "this code only handles data nodes" ); | |
89 uint i; | |
90 Node *early; | |
8048
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
91 if (n->in(0) && !n->is_expensive()) { |
0 | 92 early = n->in(0); |
8048
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
93 if (!early->is_CFG()) // Might be a non-CFG multi-def |
0 | 94 early = get_ctrl(early); // So treat input as a straight data input |
95 i = 1; | |
96 } else { | |
97 early = get_ctrl(n->in(1)); | |
98 i = 2; | |
99 } | |
100 uint e_d = dom_depth(early); | |
101 assert( early, "" ); | |
8048
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
102 for (; i < n->req(); i++) { |
0 | 103 Node *cin = get_ctrl(n->in(i)); |
104 assert( cin, "" ); | |
105 // Keep deepest dominator depth | |
106 uint c_d = dom_depth(cin); | |
8048
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
107 if (c_d > e_d) { // Deeper guy? |
0 | 108 early = cin; // Keep deepest found so far |
109 e_d = c_d; | |
8048
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
110 } else if (c_d == e_d && // Same depth? |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
111 early != cin) { // If not equal, must use slower algorithm |
0 | 112 // If same depth but not equal, one _must_ dominate the other |
113 // and we want the deeper (i.e., dominated) guy. | |
114 Node *n1 = early; | |
115 Node *n2 = cin; | |
8048
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
116 while (1) { |
0 | 117 n1 = idom(n1); // Walk up until break cycle |
118 n2 = idom(n2); | |
8048
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
119 if (n1 == cin || // Walked early up to cin |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
120 dom_depth(n2) < c_d) |
0 | 121 break; // early is deeper; keep him |
8048
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
122 if (n2 == early || // Walked cin up to early |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
123 dom_depth(n1) < c_d) { |
0 | 124 early = cin; // cin is deeper; keep him |
125 break; | |
126 } | |
127 } | |
128 e_d = dom_depth(early); // Reset depth register cache | |
129 } | |
130 } | |
131 | |
132 // Return earliest legal location | |
133 assert(early == find_non_split_ctrl(early), "unexpected early control"); | |
134 | |
8048
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
135 if (n->is_expensive()) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
136 assert(n->in(0), "should have control input"); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
137 early = get_early_ctrl_for_expensive(n, early); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
138 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
139 |
0 | 140 return early; |
141 } | |
142 | |
8048
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
143 //------------------------------get_early_ctrl_for_expensive--------------------------------- |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
144 // Move node up the dominator tree as high as legal while still beneficial |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
145 Node *PhaseIdealLoop::get_early_ctrl_for_expensive(Node *n, Node* earliest) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
146 assert(n->in(0) && n->is_expensive(), "expensive node with control input here"); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
147 assert(OptimizeExpensiveOps, "optimization off?"); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
148 |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
149 Node* ctl = n->in(0); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
150 assert(ctl->is_CFG(), "expensive input 0 must be cfg"); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
151 uint min_dom_depth = dom_depth(earliest); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
152 #ifdef ASSERT |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
153 if (!is_dominator(ctl, earliest) && !is_dominator(earliest, ctl)) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
154 dump_bad_graph("Bad graph detected in get_early_ctrl_for_expensive", n, earliest, ctl); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
155 assert(false, "Bad graph detected in get_early_ctrl_for_expensive"); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
156 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
157 #endif |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
158 if (dom_depth(ctl) < min_dom_depth) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
159 return earliest; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
160 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
161 |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
162 while (1) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
163 Node *next = ctl; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
164 // Moving the node out of a loop on the projection of a If |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
165 // confuses loop predication. So once we hit a Loop in a If branch |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
166 // that doesn't branch to an UNC, we stop. The code that process |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
167 // expensive nodes will notice the loop and skip over it to try to |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
168 // move the node further up. |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
169 if (ctl->is_CountedLoop() && ctl->in(1) != NULL && ctl->in(1)->in(0) != NULL && ctl->in(1)->in(0)->is_If()) { |
12956
3213ba4d3dff
8024069: replace_in_map() should operate on parent maps
roland
parents:
10405
diff
changeset
|
170 if (!ctl->in(1)->as_Proj()->is_uncommon_trap_if_pattern(Deoptimization::Reason_none)) { |
8048
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
171 break; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
172 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
173 next = idom(ctl->in(1)->in(0)); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
174 } else if (ctl->is_Proj()) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
175 // We only move it up along a projection if the projection is |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
176 // the single control projection for its parent: same code path, |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
177 // if it's a If with UNC or fallthrough of a call. |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
178 Node* parent_ctl = ctl->in(0); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
179 if (parent_ctl == NULL) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
180 break; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
181 } else if (parent_ctl->is_CountedLoopEnd() && parent_ctl->as_CountedLoopEnd()->loopnode() != NULL) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
182 next = parent_ctl->as_CountedLoopEnd()->loopnode()->init_control(); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
183 } else if (parent_ctl->is_If()) { |
12956
3213ba4d3dff
8024069: replace_in_map() should operate on parent maps
roland
parents:
10405
diff
changeset
|
184 if (!ctl->as_Proj()->is_uncommon_trap_if_pattern(Deoptimization::Reason_none)) { |
8048
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
185 break; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
186 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
187 assert(idom(ctl) == parent_ctl, "strange"); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
188 next = idom(parent_ctl); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
189 } else if (ctl->is_CatchProj()) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
190 if (ctl->as_Proj()->_con != CatchProjNode::fall_through_index) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
191 break; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
192 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
193 assert(parent_ctl->in(0)->in(0)->is_Call(), "strange graph"); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
194 next = parent_ctl->in(0)->in(0)->in(0); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
195 } else { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
196 // Check if parent control has a single projection (this |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
197 // control is the only possible successor of the parent |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
198 // control). If so, we can try to move the node above the |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
199 // parent control. |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
200 int nb_ctl_proj = 0; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
201 for (DUIterator_Fast imax, i = parent_ctl->fast_outs(imax); i < imax; i++) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
202 Node *p = parent_ctl->fast_out(i); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
203 if (p->is_Proj() && p->is_CFG()) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
204 nb_ctl_proj++; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
205 if (nb_ctl_proj > 1) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
206 break; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
207 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
208 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
209 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
210 |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
211 if (nb_ctl_proj > 1) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
212 break; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
213 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
214 assert(parent_ctl->is_Start() || parent_ctl->is_MemBar() || parent_ctl->is_Call(), "unexpected node"); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
215 assert(idom(ctl) == parent_ctl, "strange"); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
216 next = idom(parent_ctl); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
217 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
218 } else { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
219 next = idom(ctl); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
220 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
221 if (next->is_Root() || next->is_Start() || dom_depth(next) < min_dom_depth) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
222 break; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
223 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
224 ctl = next; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
225 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
226 |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
227 if (ctl != n->in(0)) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
228 _igvn.hash_delete(n); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
229 n->set_req(0, ctl); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
230 _igvn.hash_insert(n); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
231 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
232 |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
233 return ctl; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
234 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
235 |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
236 |
0 | 237 //------------------------------set_early_ctrl--------------------------------- |
238 // Set earliest legal control | |
239 void PhaseIdealLoop::set_early_ctrl( Node *n ) { | |
240 Node *early = get_early_ctrl(n); | |
241 | |
242 // Record earliest legal location | |
243 set_ctrl(n, early); | |
244 } | |
245 | |
246 //------------------------------set_subtree_ctrl------------------------------- | |
247 // set missing _ctrl entries on new nodes | |
248 void PhaseIdealLoop::set_subtree_ctrl( Node *n ) { | |
249 // Already set? Get out. | |
250 if( _nodes[n->_idx] ) return; | |
251 // Recursively set _nodes array to indicate where the Node goes | |
252 uint i; | |
253 for( i = 0; i < n->req(); ++i ) { | |
254 Node *m = n->in(i); | |
255 if( m && m != C->root() ) | |
256 set_subtree_ctrl( m ); | |
257 } | |
258 | |
259 // Fixup self | |
260 set_early_ctrl( n ); | |
261 } | |
262 | |
263 //------------------------------is_counted_loop-------------------------------- | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
264 bool PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) { |
0 | 265 PhaseGVN *gvn = &_igvn; |
266 | |
267 // Counted loop head must be a good RegionNode with only 3 not NULL | |
268 // control input edges: Self, Entry, LoopBack. | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
269 if (x->in(LoopNode::Self) == NULL || x->req() != 3) |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
270 return false; |
0 | 271 |
272 Node *init_control = x->in(LoopNode::EntryControl); | |
273 Node *back_control = x->in(LoopNode::LoopBackControl); | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
274 if (init_control == NULL || back_control == NULL) // Partially dead |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
275 return false; |
0 | 276 // Must also check for TOP when looking for a dead loop |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
277 if (init_control->is_top() || back_control->is_top()) |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
278 return false; |
0 | 279 |
280 // Allow funny placement of Safepoint | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
281 if (back_control->Opcode() == Op_SafePoint) |
0 | 282 back_control = back_control->in(TypeFunc::Control); |
283 | |
284 // Controlling test for loop | |
285 Node *iftrue = back_control; | |
286 uint iftrue_op = iftrue->Opcode(); | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
287 if (iftrue_op != Op_IfTrue && |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
288 iftrue_op != Op_IfFalse) |
0 | 289 // I have a weird back-control. Probably the loop-exit test is in |
290 // the middle of the loop and I am looking at some trailing control-flow | |
291 // merge point. To fix this I would have to partially peel the loop. | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
292 return false; // Obscure back-control |
0 | 293 |
294 // Get boolean guarding loop-back test | |
295 Node *iff = iftrue->in(0); | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
296 if (get_loop(iff) != loop || !iff->in(1)->is_Bool()) |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
297 return false; |
0 | 298 BoolNode *test = iff->in(1)->as_Bool(); |
299 BoolTest::mask bt = test->_test._test; | |
300 float cl_prob = iff->as_If()->_prob; | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
301 if (iftrue_op == Op_IfFalse) { |
0 | 302 bt = BoolTest(bt).negate(); |
303 cl_prob = 1.0 - cl_prob; | |
304 } | |
305 // Get backedge compare | |
306 Node *cmp = test->in(1); | |
307 int cmp_op = cmp->Opcode(); | |
3345 | 308 if (cmp_op != Op_CmpI) |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
309 return false; // Avoid pointer & float compares |
0 | 310 |
311 // Find the trip-counter increment & limit. Limit must be loop invariant. | |
312 Node *incr = cmp->in(1); | |
313 Node *limit = cmp->in(2); | |
314 | |
315 // --------- | |
316 // need 'loop()' test to tell if limit is loop invariant | |
317 // --------- | |
318 | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
319 if (!is_member(loop, get_ctrl(incr))) { // Swapped trip counter and limit? |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
320 Node *tmp = incr; // Then reverse order into the CmpI |
0 | 321 incr = limit; |
322 limit = tmp; | |
323 bt = BoolTest(bt).commute(); // And commute the exit test | |
324 } | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
325 if (is_member(loop, get_ctrl(limit))) // Limit must be loop-invariant |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
326 return false; |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
327 if (!is_member(loop, get_ctrl(incr))) // Trip counter must be loop-variant |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
328 return false; |
0 | 329 |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
330 Node* phi_incr = NULL; |
0 | 331 // Trip-counter increment must be commutative & associative. |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
332 if (incr->is_Phi()) { |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
333 if (incr->as_Phi()->region() != x || incr->req() != 3) |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
334 return false; // Not simple trip counter expression |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
335 phi_incr = incr; |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
336 incr = phi_incr->in(LoopNode::LoopBackControl); // Assume incr is on backedge of Phi |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
337 if (!is_member(loop, get_ctrl(incr))) // Trip counter must be loop-variant |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
338 return false; |
0 | 339 } |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
340 |
0 | 341 Node* trunc1 = NULL; |
342 Node* trunc2 = NULL; | |
343 const TypeInt* iv_trunc_t = NULL; | |
344 if (!(incr = CountedLoopNode::match_incr_with_optional_truncation(incr, &trunc1, &trunc2, &iv_trunc_t))) { | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
345 return false; // Funny increment opcode |
0 | 346 } |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
347 assert(incr->Opcode() == Op_AddI, "wrong increment code"); |
0 | 348 |
349 // Get merge point | |
350 Node *xphi = incr->in(1); | |
351 Node *stride = incr->in(2); | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
352 if (!stride->is_Con()) { // Oops, swap these |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
353 if (!xphi->is_Con()) // Is the other guy a constant? |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
354 return false; // Nope, unknown stride, bail out |
0 | 355 Node *tmp = xphi; // 'incr' is commutative, so ok to swap |
356 xphi = stride; | |
357 stride = tmp; | |
358 } | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
359 // Stride must be constant |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
360 int stride_con = stride->get_int(); |
3345 | 361 if (stride_con == 0) |
362 return false; // missed some peephole opt | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
363 |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
364 if (!xphi->is_Phi()) |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
365 return false; // Too much math on the trip counter |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
366 if (phi_incr != NULL && phi_incr != xphi) |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
367 return false; |
0 | 368 PhiNode *phi = xphi->as_Phi(); |
369 | |
370 // Phi must be of loop header; backedge must wrap to increment | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
371 if (phi->region() != x) |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
372 return false; |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
373 if (trunc1 == NULL && phi->in(LoopNode::LoopBackControl) != incr || |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
374 trunc1 != NULL && phi->in(LoopNode::LoopBackControl) != trunc1) { |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
375 return false; |
0 | 376 } |
377 Node *init_trip = phi->in(LoopNode::EntryControl); | |
378 | |
379 // If iv trunc type is smaller than int, check for possible wrap. | |
380 if (!TypeInt::INT->higher_equal(iv_trunc_t)) { | |
381 assert(trunc1 != NULL, "must have found some truncation"); | |
382 | |
383 // Get a better type for the phi (filtered thru if's) | |
384 const TypeInt* phi_ft = filtered_type(phi); | |
385 | |
386 // Can iv take on a value that will wrap? | |
387 // | |
388 // Ensure iv's limit is not within "stride" of the wrap value. | |
389 // | |
390 // Example for "short" type | |
391 // Truncation ensures value is in the range -32768..32767 (iv_trunc_t) | |
392 // If the stride is +10, then the last value of the induction | |
393 // variable before the increment (phi_ft->_hi) must be | |
394 // <= 32767 - 10 and (phi_ft->_lo) must be >= -32768 to | |
395 // ensure no truncation occurs after the increment. | |
396 | |
397 if (stride_con > 0) { | |
398 if (iv_trunc_t->_hi - phi_ft->_hi < stride_con || | |
399 iv_trunc_t->_lo > phi_ft->_lo) { | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
400 return false; // truncation may occur |
0 | 401 } |
402 } else if (stride_con < 0) { | |
403 if (iv_trunc_t->_lo - phi_ft->_lo > stride_con || | |
404 iv_trunc_t->_hi < phi_ft->_hi) { | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
405 return false; // truncation may occur |
0 | 406 } |
407 } | |
408 // No possibility of wrap so truncation can be discarded | |
409 // Promote iv type to Int | |
410 } else { | |
411 assert(trunc1 == NULL && trunc2 == NULL, "no truncation for int"); | |
412 } | |
413 | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
414 // If the condition is inverted and we will be rolling |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
415 // through MININT to MAXINT, then bail out. |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
416 if (bt == BoolTest::eq || // Bail out, but this loop trips at most twice! |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
417 // Odd stride |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
418 bt == BoolTest::ne && stride_con != 1 && stride_con != -1 || |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
419 // Count down loop rolls through MAXINT |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
420 (bt == BoolTest::le || bt == BoolTest::lt) && stride_con < 0 || |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
421 // Count up loop rolls through MININT |
3345 | 422 (bt == BoolTest::ge || bt == BoolTest::gt) && stride_con > 0) { |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
423 return false; // Bail out |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
424 } |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
425 |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
426 const TypeInt* init_t = gvn->type(init_trip)->is_int(); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
427 const TypeInt* limit_t = gvn->type(limit)->is_int(); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
428 |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
429 if (stride_con > 0) { |
6846 | 430 jlong init_p = (jlong)init_t->_lo + stride_con; |
431 if (init_p > (jlong)max_jint || init_p > (jlong)limit_t->_hi) | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
432 return false; // cyclic loop or this loop trips only once |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
433 } else { |
6846 | 434 jlong init_p = (jlong)init_t->_hi + stride_con; |
435 if (init_p < (jlong)min_jint || init_p < (jlong)limit_t->_lo) | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
436 return false; // cyclic loop or this loop trips only once |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
437 } |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
438 |
0 | 439 // ================================================= |
440 // ---- SUCCESS! Found A Trip-Counted Loop! ----- | |
441 // | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
442 assert(x->Opcode() == Op_Loop, "regular loops only"); |
10405 | 443 C->print_method(PHASE_BEFORE_CLOOPS, 3); |
3345 | 444 |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
445 Node *hook = new (C) Node(6); |
3345 | 446 |
447 if (LoopLimitCheck) { | |
448 | |
449 // =================================================== | |
450 // Generate loop limit check to avoid integer overflow | |
451 // in cases like next (cyclic loops): | |
452 // | |
453 // for (i=0; i <= max_jint; i++) {} | |
454 // for (i=0; i < max_jint; i+=2) {} | |
455 // | |
456 // | |
457 // Limit check predicate depends on the loop test: | |
458 // | |
459 // for(;i != limit; i++) --> limit <= (max_jint) | |
460 // for(;i < limit; i+=stride) --> limit <= (max_jint - stride + 1) | |
461 // for(;i <= limit; i+=stride) --> limit <= (max_jint - stride ) | |
462 // | |
463 | |
464 // Check if limit is excluded to do more precise int overflow check. | |
465 bool incl_limit = (bt == BoolTest::le || bt == BoolTest::ge); | |
466 int stride_m = stride_con - (incl_limit ? 0 : (stride_con > 0 ? 1 : -1)); | |
467 | |
468 // If compare points directly to the phi we need to adjust | |
469 // the compare so that it points to the incr. Limit have | |
470 // to be adjusted to keep trip count the same and the | |
471 // adjusted limit should be checked for int overflow. | |
472 if (phi_incr != NULL) { | |
473 stride_m += stride_con; | |
474 } | |
475 | |
476 if (limit->is_Con()) { | |
477 int limit_con = limit->get_int(); | |
478 if ((stride_con > 0 && limit_con > (max_jint - stride_m)) || | |
479 (stride_con < 0 && limit_con < (min_jint - stride_m))) { | |
480 // Bailout: it could be integer overflow. | |
481 return false; | |
482 } | |
483 } else if ((stride_con > 0 && limit_t->_hi <= (max_jint - stride_m)) || | |
484 (stride_con < 0 && limit_t->_lo >= (min_jint - stride_m))) { | |
485 // Limit's type may satisfy the condition, for example, | |
486 // when it is an array length. | |
487 } else { | |
488 // Generate loop's limit check. | |
489 // Loop limit check predicate should be near the loop. | |
490 ProjNode *limit_check_proj = find_predicate_insertion_point(init_control, Deoptimization::Reason_loop_limit_check); | |
491 if (!limit_check_proj) { | |
492 // The limit check predicate is not generated if this method trapped here before. | |
493 #ifdef ASSERT | |
494 if (TraceLoopLimitCheck) { | |
495 tty->print("missing loop limit check:"); | |
496 loop->dump_head(); | |
497 x->dump(1); | |
498 } | |
499 #endif | |
500 return false; | |
501 } | |
502 | |
503 IfNode* check_iff = limit_check_proj->in(0)->as_If(); | |
504 Node* cmp_limit; | |
505 Node* bol; | |
506 | |
507 if (stride_con > 0) { | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
508 cmp_limit = new (C) CmpINode(limit, _igvn.intcon(max_jint - stride_m)); |
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
509 bol = new (C) BoolNode(cmp_limit, BoolTest::le); |
3345 | 510 } else { |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
511 cmp_limit = new (C) CmpINode(limit, _igvn.intcon(min_jint - stride_m)); |
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
512 bol = new (C) BoolNode(cmp_limit, BoolTest::ge); |
3345 | 513 } |
514 cmp_limit = _igvn.register_new_node_with_optimizer(cmp_limit); | |
515 bol = _igvn.register_new_node_with_optimizer(bol); | |
516 set_subtree_ctrl(bol); | |
517 | |
518 // Replace condition in original predicate but preserve Opaque node | |
519 // so that previous predicates could be found. | |
520 assert(check_iff->in(1)->Opcode() == Op_Conv2B && | |
521 check_iff->in(1)->in(1)->Opcode() == Op_Opaque1, ""); | |
522 Node* opq = check_iff->in(1)->in(1); | |
523 _igvn.hash_delete(opq); | |
524 opq->set_req(1, bol); | |
525 // Update ctrl. | |
526 set_ctrl(opq, check_iff->in(0)); | |
527 set_ctrl(check_iff->in(1), check_iff->in(0)); | |
528 | |
2445 | 529 #ifndef PRODUCT |
3345 | 530 // report that the loop predication has been actually performed |
531 // for this loop | |
532 if (TraceLoopLimitCheck) { | |
533 tty->print_cr("Counted Loop Limit Check generated:"); | |
534 debug_only( bol->dump(2); ) | |
535 } | |
536 #endif | |
537 } | |
538 | |
539 if (phi_incr != NULL) { | |
540 // If compare points directly to the phi we need to adjust | |
541 // the compare so that it points to the incr. Limit have | |
542 // to be adjusted to keep trip count the same and we | |
543 // should avoid int overflow. | |
544 // | |
545 // i = init; do {} while(i++ < limit); | |
546 // is converted to | |
547 // i = init; do {} while(++i < limit+1); | |
548 // | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
549 limit = gvn->transform(new (C) AddINode(limit, stride)); |
2445 | 550 } |
3345 | 551 |
552 // Now we need to canonicalize loop condition. | |
553 if (bt == BoolTest::ne) { | |
554 assert(stride_con == 1 || stride_con == -1, "simple increment only"); | |
3782 | 555 // 'ne' can be replaced with 'lt' only when init < limit. |
556 if (stride_con > 0 && init_t->_hi < limit_t->_lo) | |
557 bt = BoolTest::lt; | |
558 // 'ne' can be replaced with 'gt' only when init > limit. | |
559 if (stride_con < 0 && init_t->_lo > limit_t->_hi) | |
560 bt = BoolTest::gt; | |
3345 | 561 } |
562 | |
563 if (incl_limit) { | |
564 // The limit check guaranties that 'limit <= (max_jint - stride)' so | |
565 // we can convert 'i <= limit' to 'i < limit+1' since stride != 0. | |
566 // | |
567 Node* one = (stride_con > 0) ? gvn->intcon( 1) : gvn->intcon(-1); | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
568 limit = gvn->transform(new (C) AddINode(limit, one)); |
3345 | 569 if (bt == BoolTest::le) |
570 bt = BoolTest::lt; | |
571 else if (bt == BoolTest::ge) | |
572 bt = BoolTest::gt; | |
573 else | |
574 ShouldNotReachHere(); | |
575 } | |
576 set_subtree_ctrl( limit ); | |
577 | |
578 } else { // LoopLimitCheck | |
579 | |
0 | 580 // If compare points to incr, we are ok. Otherwise the compare |
581 // can directly point to the phi; in this case adjust the compare so that | |
605 | 582 // it points to the incr by adjusting the limit. |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
583 if (cmp->in(1) == phi || cmp->in(2) == phi) |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
584 limit = gvn->transform(new (C) AddINode(limit,stride)); |
0 | 585 |
586 // trip-count for +-tive stride should be: (limit - init_trip + stride - 1)/stride. | |
587 // Final value for iterator should be: trip_count * stride + init_trip. | |
588 Node *one_p = gvn->intcon( 1); | |
589 Node *one_m = gvn->intcon(-1); | |
590 | |
591 Node *trip_count = NULL; | |
592 switch( bt ) { | |
593 case BoolTest::eq: | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
594 ShouldNotReachHere(); |
0 | 595 case BoolTest::ne: // Ahh, the case we desire |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
596 if (stride_con == 1) |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
597 trip_count = gvn->transform(new (C) SubINode(limit,init_trip)); |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
598 else if (stride_con == -1) |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
599 trip_count = gvn->transform(new (C) SubINode(init_trip,limit)); |
0 | 600 else |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
601 ShouldNotReachHere(); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
602 set_subtree_ctrl(trip_count); |
0 | 603 //_loop.map(trip_count->_idx,loop(limit)); |
604 break; | |
605 case BoolTest::le: // Maybe convert to '<' case | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
606 limit = gvn->transform(new (C) AddINode(limit,one_p)); |
0 | 607 set_subtree_ctrl( limit ); |
608 hook->init_req(4, limit); | |
609 | |
610 bt = BoolTest::lt; | |
611 // Make the new limit be in the same loop nest as the old limit | |
612 //_loop.map(limit->_idx,limit_loop); | |
613 // Fall into next case | |
614 case BoolTest::lt: { // Maybe convert to '!=' case | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
615 if (stride_con < 0) // Count down loop rolls through MAXINT |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
616 ShouldNotReachHere(); |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
617 Node *range = gvn->transform(new (C) SubINode(limit,init_trip)); |
0 | 618 set_subtree_ctrl( range ); |
619 hook->init_req(0, range); | |
620 | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
621 Node *bias = gvn->transform(new (C) AddINode(range,stride)); |
0 | 622 set_subtree_ctrl( bias ); |
623 hook->init_req(1, bias); | |
624 | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
625 Node *bias1 = gvn->transform(new (C) AddINode(bias,one_m)); |
0 | 626 set_subtree_ctrl( bias1 ); |
627 hook->init_req(2, bias1); | |
628 | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
629 trip_count = gvn->transform(new (C) DivINode(0,bias1,stride)); |
0 | 630 set_subtree_ctrl( trip_count ); |
631 hook->init_req(3, trip_count); | |
632 break; | |
633 } | |
634 | |
635 case BoolTest::ge: // Maybe convert to '>' case | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
636 limit = gvn->transform(new (C) AddINode(limit,one_m)); |
0 | 637 set_subtree_ctrl( limit ); |
638 hook->init_req(4 ,limit); | |
639 | |
640 bt = BoolTest::gt; | |
641 // Make the new limit be in the same loop nest as the old limit | |
642 //_loop.map(limit->_idx,limit_loop); | |
643 // Fall into next case | |
644 case BoolTest::gt: { // Maybe convert to '!=' case | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
645 if (stride_con > 0) // count up loop rolls through MININT |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
646 ShouldNotReachHere(); |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
647 Node *range = gvn->transform(new (C) SubINode(limit,init_trip)); |
0 | 648 set_subtree_ctrl( range ); |
649 hook->init_req(0, range); | |
650 | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
651 Node *bias = gvn->transform(new (C) AddINode(range,stride)); |
0 | 652 set_subtree_ctrl( bias ); |
653 hook->init_req(1, bias); | |
654 | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
655 Node *bias1 = gvn->transform(new (C) AddINode(bias,one_p)); |
0 | 656 set_subtree_ctrl( bias1 ); |
657 hook->init_req(2, bias1); | |
658 | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
659 trip_count = gvn->transform(new (C) DivINode(0,bias1,stride)); |
0 | 660 set_subtree_ctrl( trip_count ); |
661 hook->init_req(3, trip_count); | |
662 break; | |
663 } | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
664 } // switch( bt ) |
0 | 665 |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
666 Node *span = gvn->transform(new (C) MulINode(trip_count,stride)); |
0 | 667 set_subtree_ctrl( span ); |
668 hook->init_req(5, span); | |
669 | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
670 limit = gvn->transform(new (C) AddINode(span,init_trip)); |
0 | 671 set_subtree_ctrl( limit ); |
672 | |
3345 | 673 } // LoopLimitCheck |
674 | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
675 // Check for SafePoint on backedge and remove |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
676 Node *sfpt = x->in(LoopNode::LoopBackControl); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
677 if (sfpt->Opcode() == Op_SafePoint && is_deleteable_safept(sfpt)) { |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
678 lazy_replace( sfpt, iftrue ); |
6636 | 679 if (loop->_safepts != NULL) { |
680 loop->_safepts->yank(sfpt); | |
681 } | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
682 loop->_tail = iftrue; |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
683 } |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
684 |
0 | 685 // Build a canonical trip test. |
686 // Clone code, as old values may be in use. | |
687 incr = incr->clone(); | |
3936
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
688 incr->set_req(1,phi); |
0 | 689 incr->set_req(2,stride); |
690 incr = _igvn.register_new_node_with_optimizer(incr); | |
691 set_early_ctrl( incr ); | |
3936
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
692 _igvn.hash_delete(phi); |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
693 phi->set_req_X( LoopNode::LoopBackControl, incr, &_igvn ); |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
694 |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
695 // If phi type is more restrictive than Int, raise to |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
696 // Int to prevent (almost) infinite recursion in igvn |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
697 // which can only handle integer types for constants or minint..maxint. |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
698 if (!TypeInt::INT->higher_equal(phi->bottom_type())) { |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
699 Node* nphi = PhiNode::make(phi->in(0), phi->in(LoopNode::EntryControl), TypeInt::INT); |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
700 nphi->set_req(LoopNode::LoopBackControl, phi->in(LoopNode::LoopBackControl)); |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
701 nphi = _igvn.register_new_node_with_optimizer(nphi); |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
702 set_ctrl(nphi, get_ctrl(phi)); |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
703 _igvn.replace_node(phi, nphi); |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
704 phi = nphi->as_Phi(); |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
705 } |
0 | 706 cmp = cmp->clone(); |
707 cmp->set_req(1,incr); | |
708 cmp->set_req(2,limit); | |
709 cmp = _igvn.register_new_node_with_optimizer(cmp); | |
710 set_ctrl(cmp, iff->in(0)); | |
711 | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
712 test = test->clone()->as_Bool(); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
713 (*(BoolTest*)&test->_test)._test = bt; |
0 | 714 test->set_req(1,cmp); |
715 _igvn.register_new_node_with_optimizer(test); | |
716 set_ctrl(test, iff->in(0)); | |
717 | |
718 // Replace the old IfNode with a new LoopEndNode | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
719 Node *lex = _igvn.register_new_node_with_optimizer(new (C) CountedLoopEndNode( iff->in(0), test, cl_prob, iff->as_If()->_fcnt )); |
0 | 720 IfNode *le = lex->as_If(); |
721 uint dd = dom_depth(iff); | |
722 set_idom(le, le->in(0), dd); // Update dominance for loop exit | |
723 set_loop(le, loop); | |
724 | |
725 // Get the loop-exit control | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
726 Node *iffalse = iff->as_If()->proj_out(!(iftrue_op == Op_IfTrue)); |
0 | 727 |
728 // Need to swap loop-exit and loop-back control? | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
729 if (iftrue_op == Op_IfFalse) { |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
730 Node *ift2=_igvn.register_new_node_with_optimizer(new (C) IfTrueNode (le)); |
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
731 Node *iff2=_igvn.register_new_node_with_optimizer(new (C) IfFalseNode(le)); |
0 | 732 |
733 loop->_tail = back_control = ift2; | |
734 set_loop(ift2, loop); | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
735 set_loop(iff2, get_loop(iffalse)); |
0 | 736 |
737 // Lazy update of 'get_ctrl' mechanism. | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
738 lazy_replace_proj( iffalse, iff2 ); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
739 lazy_replace_proj( iftrue, ift2 ); |
0 | 740 |
741 // Swap names | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
742 iffalse = iff2; |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
743 iftrue = ift2; |
0 | 744 } else { |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
745 _igvn.hash_delete(iffalse); |
0 | 746 _igvn.hash_delete(iftrue); |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
747 iffalse->set_req_X( 0, le, &_igvn ); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
748 iftrue ->set_req_X( 0, le, &_igvn ); |
0 | 749 } |
750 | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
751 set_idom(iftrue, le, dd+1); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
752 set_idom(iffalse, le, dd+1); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
753 assert(iff->outcnt() == 0, "should be dead now"); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
754 lazy_replace( iff, le ); // fix 'get_ctrl' |
0 | 755 |
756 // Now setup a new CountedLoopNode to replace the existing LoopNode | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
757 CountedLoopNode *l = new (C) CountedLoopNode(init_control, back_control); |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
758 l->set_unswitch_count(x->as_Loop()->unswitch_count()); // Preserve |
0 | 759 // The following assert is approximately true, and defines the intention |
760 // of can_be_counted_loop. It fails, however, because phase->type | |
761 // is not yet initialized for this loop and its parts. | |
762 //assert(l->can_be_counted_loop(this), "sanity"); | |
763 _igvn.register_new_node_with_optimizer(l); | |
764 set_loop(l, loop); | |
765 loop->_head = l; | |
766 // Fix all data nodes placed at the old loop head. | |
767 // Uses the lazy-update mechanism of 'get_ctrl'. | |
768 lazy_replace( x, l ); | |
769 set_idom(l, init_control, dom_depth(x)); | |
770 | |
605 | 771 // Check for immediately preceding SafePoint and remove |
0 | 772 Node *sfpt2 = le->in(0); |
6636 | 773 if (sfpt2->Opcode() == Op_SafePoint && is_deleteable_safept(sfpt2)) { |
0 | 774 lazy_replace( sfpt2, sfpt2->in(TypeFunc::Control)); |
6636 | 775 if (loop->_safepts != NULL) { |
776 loop->_safepts->yank(sfpt2); | |
777 } | |
778 } | |
0 | 779 |
780 // Free up intermediate goo | |
781 _igvn.remove_dead_node(hook); | |
782 | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
783 #ifdef ASSERT |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
784 assert(l->is_valid_counted_loop(), "counted loop shape is messed up"); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
785 assert(l == loop->_head && l->phi() == phi && l->loopexit() == lex, "" ); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
786 #endif |
3345 | 787 #ifndef PRODUCT |
788 if (TraceLoopOpts) { | |
789 tty->print("Counted "); | |
790 loop->dump_head(); | |
791 } | |
792 #endif | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
793 |
10405 | 794 C->print_method(PHASE_AFTER_CLOOPS, 3); |
0 | 795 |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
796 return true; |
0 | 797 } |
798 | |
3345 | 799 //----------------------exact_limit------------------------------------------- |
800 Node* PhaseIdealLoop::exact_limit( IdealLoopTree *loop ) { | |
801 assert(loop->_head->is_CountedLoop(), ""); | |
802 CountedLoopNode *cl = loop->_head->as_CountedLoop(); | |
3850
6987871cfb9b
7077439: Possible reference through NULL in loopPredicate.cpp:726
kvn
parents:
3845
diff
changeset
|
803 assert(cl->is_valid_counted_loop(), ""); |
3345 | 804 |
805 if (!LoopLimitCheck || ABS(cl->stride_con()) == 1 || | |
806 cl->limit()->Opcode() == Op_LoopLimit) { | |
807 // Old code has exact limit (it could be incorrect in case of int overflow). | |
808 // Loop limit is exact with stride == 1. And loop may already have exact limit. | |
809 return cl->limit(); | |
810 } | |
811 Node *limit = NULL; | |
812 #ifdef ASSERT | |
813 BoolTest::mask bt = cl->loopexit()->test_trip(); | |
814 assert(bt == BoolTest::lt || bt == BoolTest::gt, "canonical test is expected"); | |
815 #endif | |
816 if (cl->has_exact_trip_count()) { | |
817 // Simple case: loop has constant boundaries. | |
6846 | 818 // Use jlongs to avoid integer overflow. |
3345 | 819 int stride_con = cl->stride_con(); |
6846 | 820 jlong init_con = cl->init_trip()->get_int(); |
821 jlong limit_con = cl->limit()->get_int(); | |
3345 | 822 julong trip_cnt = cl->trip_count(); |
6846 | 823 jlong final_con = init_con + trip_cnt*stride_con; |
3345 | 824 int final_int = (int)final_con; |
825 // The final value should be in integer range since the loop | |
826 // is counted and the limit was checked for overflow. | |
6846 | 827 assert(final_con == (jlong)final_int, "final value should be integer"); |
3345 | 828 limit = _igvn.intcon(final_int); |
829 } else { | |
830 // Create new LoopLimit node to get exact limit (final iv value). | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
831 limit = new (C) LoopLimitNode(C, cl->init_trip(), cl->limit(), cl->stride()); |
3345 | 832 register_new_node(limit, cl->in(LoopNode::EntryControl)); |
833 } | |
834 assert(limit != NULL, "sanity"); | |
835 return limit; | |
836 } | |
0 | 837 |
838 //------------------------------Ideal------------------------------------------ | |
839 // Return a node which is more "ideal" than the current node. | |
840 // Attempt to convert into a counted-loop. | |
841 Node *LoopNode::Ideal(PhaseGVN *phase, bool can_reshape) { | |
842 if (!can_be_counted_loop(phase)) { | |
843 phase->C->set_major_progress(); | |
844 } | |
845 return RegionNode::Ideal(phase, can_reshape); | |
846 } | |
847 | |
848 | |
849 //============================================================================= | |
850 //------------------------------Ideal------------------------------------------ | |
851 // Return a node which is more "ideal" than the current node. | |
852 // Attempt to convert into a counted-loop. | |
853 Node *CountedLoopNode::Ideal(PhaseGVN *phase, bool can_reshape) { | |
854 return RegionNode::Ideal(phase, can_reshape); | |
855 } | |
856 | |
857 //------------------------------dump_spec-------------------------------------- | |
858 // Dump special per-node info | |
859 #ifndef PRODUCT | |
860 void CountedLoopNode::dump_spec(outputStream *st) const { | |
861 LoopNode::dump_spec(st); | |
3345 | 862 if (stride_is_con()) { |
0 | 863 st->print("stride: %d ",stride_con()); |
864 } | |
3345 | 865 if (is_pre_loop ()) st->print("pre of N%d" , _main_idx); |
866 if (is_main_loop()) st->print("main of N%d", _idx); | |
867 if (is_post_loop()) st->print("post of N%d", _main_idx); | |
0 | 868 } |
869 #endif | |
870 | |
871 //============================================================================= | |
872 int CountedLoopEndNode::stride_con() const { | |
873 return stride()->bottom_type()->is_int()->get_con(); | |
874 } | |
875 | |
3345 | 876 //============================================================================= |
877 //------------------------------Value----------------------------------------- | |
878 const Type *LoopLimitNode::Value( PhaseTransform *phase ) const { | |
879 const Type* init_t = phase->type(in(Init)); | |
880 const Type* limit_t = phase->type(in(Limit)); | |
881 const Type* stride_t = phase->type(in(Stride)); | |
882 // Either input is TOP ==> the result is TOP | |
883 if (init_t == Type::TOP) return Type::TOP; | |
884 if (limit_t == Type::TOP) return Type::TOP; | |
885 if (stride_t == Type::TOP) return Type::TOP; | |
886 | |
887 int stride_con = stride_t->is_int()->get_con(); | |
888 if (stride_con == 1) | |
889 return NULL; // Identity | |
890 | |
891 if (init_t->is_int()->is_con() && limit_t->is_int()->is_con()) { | |
6846 | 892 // Use jlongs to avoid integer overflow. |
893 jlong init_con = init_t->is_int()->get_con(); | |
894 jlong limit_con = limit_t->is_int()->get_con(); | |
3345 | 895 int stride_m = stride_con - (stride_con > 0 ? 1 : -1); |
6846 | 896 jlong trip_count = (limit_con - init_con + stride_m)/stride_con; |
897 jlong final_con = init_con + stride_con*trip_count; | |
3345 | 898 int final_int = (int)final_con; |
899 // The final value should be in integer range since the loop | |
900 // is counted and the limit was checked for overflow. | |
6846 | 901 assert(final_con == (jlong)final_int, "final value should be integer"); |
3345 | 902 return TypeInt::make(final_int); |
903 } | |
904 | |
905 return bottom_type(); // TypeInt::INT | |
906 } | |
907 | |
908 //------------------------------Ideal------------------------------------------ | |
909 // Return a node which is more "ideal" than the current node. | |
910 Node *LoopLimitNode::Ideal(PhaseGVN *phase, bool can_reshape) { | |
911 if (phase->type(in(Init)) == Type::TOP || | |
912 phase->type(in(Limit)) == Type::TOP || | |
913 phase->type(in(Stride)) == Type::TOP) | |
914 return NULL; // Dead | |
915 | |
916 int stride_con = phase->type(in(Stride))->is_int()->get_con(); | |
917 if (stride_con == 1) | |
918 return NULL; // Identity | |
919 | |
920 if (in(Init)->is_Con() && in(Limit)->is_Con()) | |
921 return NULL; // Value | |
922 | |
923 // Delay following optimizations until all loop optimizations | |
924 // done to keep Ideal graph simple. | |
925 if (!can_reshape || phase->C->major_progress()) | |
926 return NULL; | |
927 | |
928 const TypeInt* init_t = phase->type(in(Init) )->is_int(); | |
929 const TypeInt* limit_t = phase->type(in(Limit))->is_int(); | |
930 int stride_p; | |
6846 | 931 jlong lim, ini; |
3345 | 932 julong max; |
933 if (stride_con > 0) { | |
934 stride_p = stride_con; | |
935 lim = limit_t->_hi; | |
936 ini = init_t->_lo; | |
937 max = (julong)max_jint; | |
938 } else { | |
939 stride_p = -stride_con; | |
940 lim = init_t->_hi; | |
941 ini = limit_t->_lo; | |
942 max = (julong)min_jint; | |
943 } | |
944 julong range = lim - ini + stride_p; | |
945 if (range <= max) { | |
946 // Convert to integer expression if it is not overflow. | |
947 Node* stride_m = phase->intcon(stride_con - (stride_con > 0 ? 1 : -1)); | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
948 Node *range = phase->transform(new (phase->C) SubINode(in(Limit), in(Init))); |
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
949 Node *bias = phase->transform(new (phase->C) AddINode(range, stride_m)); |
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
950 Node *trip = phase->transform(new (phase->C) DivINode(0, bias, in(Stride))); |
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
951 Node *span = phase->transform(new (phase->C) MulINode(trip, in(Stride))); |
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
952 return new (phase->C) AddINode(span, in(Init)); // exact limit |
3345 | 953 } |
954 | |
955 if (is_power_of_2(stride_p) || // divisor is 2^n | |
956 !Matcher::has_match_rule(Op_LoopLimit)) { // or no specialized Mach node? | |
957 // Convert to long expression to avoid integer overflow | |
958 // and let igvn optimizer convert this division. | |
959 // | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
960 Node* init = phase->transform( new (phase->C) ConvI2LNode(in(Init))); |
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
961 Node* limit = phase->transform( new (phase->C) ConvI2LNode(in(Limit))); |
3345 | 962 Node* stride = phase->longcon(stride_con); |
963 Node* stride_m = phase->longcon(stride_con - (stride_con > 0 ? 1 : -1)); | |
964 | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
965 Node *range = phase->transform(new (phase->C) SubLNode(limit, init)); |
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
966 Node *bias = phase->transform(new (phase->C) AddLNode(range, stride_m)); |
3345 | 967 Node *span; |
968 if (stride_con > 0 && is_power_of_2(stride_p)) { | |
969 // bias >= 0 if stride >0, so if stride is 2^n we can use &(-stride) | |
970 // and avoid generating rounding for division. Zero trip guard should | |
971 // guarantee that init < limit but sometimes the guard is missing and | |
972 // we can get situation when init > limit. Note, for the empty loop | |
973 // optimization zero trip guard is generated explicitly which leaves | |
974 // only RCE predicate where exact limit is used and the predicate | |
975 // will simply fail forcing recompilation. | |
976 Node* neg_stride = phase->longcon(-stride_con); | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
977 span = phase->transform(new (phase->C) AndLNode(bias, neg_stride)); |
3345 | 978 } else { |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
979 Node *trip = phase->transform(new (phase->C) DivLNode(0, bias, stride)); |
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
980 span = phase->transform(new (phase->C) MulLNode(trip, stride)); |
3345 | 981 } |
982 // Convert back to int | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
983 Node *span_int = phase->transform(new (phase->C) ConvL2INode(span)); |
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
984 return new (phase->C) AddINode(span_int, in(Init)); // exact limit |
3345 | 985 } |
986 | |
987 return NULL; // No progress | |
988 } | |
989 | |
990 //------------------------------Identity--------------------------------------- | |
991 // If stride == 1 return limit node. | |
992 Node *LoopLimitNode::Identity( PhaseTransform *phase ) { | |
993 int stride_con = phase->type(in(Stride))->is_int()->get_con(); | |
994 if (stride_con == 1 || stride_con == -1) | |
995 return in(Limit); | |
996 return this; | |
997 } | |
998 | |
999 //============================================================================= | |
0 | 1000 //----------------------match_incr_with_optional_truncation-------------------- |
1001 // Match increment with optional truncation: | |
1002 // CHAR: (i+1)&0x7fff, BYTE: ((i+1)<<8)>>8, or SHORT: ((i+1)<<16)>>16 | |
1003 // Return NULL for failure. Success returns the increment node. | |
1004 Node* CountedLoopNode::match_incr_with_optional_truncation( | |
1005 Node* expr, Node** trunc1, Node** trunc2, const TypeInt** trunc_type) { | |
1006 // Quick cutouts: | |
4862
f457154eee8b
7140882: Don't return booleans from methods returning pointers
brutisso
parents:
4779
diff
changeset
|
1007 if (expr == NULL || expr->req() != 3) return NULL; |
0 | 1008 |
1009 Node *t1 = NULL; | |
1010 Node *t2 = NULL; | |
1011 const TypeInt* trunc_t = TypeInt::INT; | |
1012 Node* n1 = expr; | |
1013 int n1op = n1->Opcode(); | |
1014 | |
1015 // Try to strip (n1 & M) or (n1 << N >> N) from n1. | |
1016 if (n1op == Op_AndI && | |
1017 n1->in(2)->is_Con() && | |
1018 n1->in(2)->bottom_type()->is_int()->get_con() == 0x7fff) { | |
1019 // %%% This check should match any mask of 2**K-1. | |
1020 t1 = n1; | |
1021 n1 = t1->in(1); | |
1022 n1op = n1->Opcode(); | |
1023 trunc_t = TypeInt::CHAR; | |
1024 } else if (n1op == Op_RShiftI && | |
1025 n1->in(1) != NULL && | |
1026 n1->in(1)->Opcode() == Op_LShiftI && | |
1027 n1->in(2) == n1->in(1)->in(2) && | |
1028 n1->in(2)->is_Con()) { | |
1029 jint shift = n1->in(2)->bottom_type()->is_int()->get_con(); | |
1030 // %%% This check should match any shift in [1..31]. | |
1031 if (shift == 16 || shift == 8) { | |
1032 t1 = n1; | |
1033 t2 = t1->in(1); | |
1034 n1 = t2->in(1); | |
1035 n1op = n1->Opcode(); | |
1036 if (shift == 16) { | |
1037 trunc_t = TypeInt::SHORT; | |
1038 } else if (shift == 8) { | |
1039 trunc_t = TypeInt::BYTE; | |
1040 } | |
1041 } | |
1042 } | |
1043 | |
1044 // If (maybe after stripping) it is an AddI, we won: | |
1045 if (n1op == Op_AddI) { | |
1046 *trunc1 = t1; | |
1047 *trunc2 = t2; | |
1048 *trunc_type = trunc_t; | |
1049 return n1; | |
1050 } | |
1051 | |
1052 // failed | |
1053 return NULL; | |
1054 } | |
1055 | |
1056 | |
1057 //------------------------------filtered_type-------------------------------- | |
1058 // Return a type based on condition control flow | |
1059 // A successful return will be a type that is restricted due | |
1060 // to a series of dominating if-tests, such as: | |
1061 // if (i < 10) { | |
1062 // if (i > 0) { | |
1063 // here: "i" type is [1..10) | |
1064 // } | |
1065 // } | |
1066 // or a control flow merge | |
1067 // if (i < 10) { | |
1068 // do { | |
1069 // phi( , ) -- at top of loop type is [min_int..10) | |
1070 // i = ? | |
1071 // } while ( i < 10) | |
1072 // | |
1073 const TypeInt* PhaseIdealLoop::filtered_type( Node *n, Node* n_ctrl) { | |
1074 assert(n && n->bottom_type()->is_int(), "must be int"); | |
1075 const TypeInt* filtered_t = NULL; | |
1076 if (!n->is_Phi()) { | |
1077 assert(n_ctrl != NULL || n_ctrl == C->top(), "valid control"); | |
1078 filtered_t = filtered_type_from_dominators(n, n_ctrl); | |
1079 | |
1080 } else { | |
1081 Node* phi = n->as_Phi(); | |
1082 Node* region = phi->in(0); | |
1083 assert(n_ctrl == NULL || n_ctrl == region, "ctrl parameter must be region"); | |
1084 if (region && region != C->top()) { | |
1085 for (uint i = 1; i < phi->req(); i++) { | |
1086 Node* val = phi->in(i); | |
1087 Node* use_c = region->in(i); | |
1088 const TypeInt* val_t = filtered_type_from_dominators(val, use_c); | |
1089 if (val_t != NULL) { | |
1090 if (filtered_t == NULL) { | |
1091 filtered_t = val_t; | |
1092 } else { | |
1093 filtered_t = filtered_t->meet(val_t)->is_int(); | |
1094 } | |
1095 } | |
1096 } | |
1097 } | |
1098 } | |
1099 const TypeInt* n_t = _igvn.type(n)->is_int(); | |
1100 if (filtered_t != NULL) { | |
1101 n_t = n_t->join(filtered_t)->is_int(); | |
1102 } | |
1103 return n_t; | |
1104 } | |
1105 | |
1106 | |
1107 //------------------------------filtered_type_from_dominators-------------------------------- | |
1108 // Return a possibly more restrictive type for val based on condition control flow of dominators | |
1109 const TypeInt* PhaseIdealLoop::filtered_type_from_dominators( Node* val, Node *use_ctrl) { | |
1110 if (val->is_Con()) { | |
1111 return val->bottom_type()->is_int(); | |
1112 } | |
1113 uint if_limit = 10; // Max number of dominating if's visited | |
1114 const TypeInt* rtn_t = NULL; | |
1115 | |
1116 if (use_ctrl && use_ctrl != C->top()) { | |
1117 Node* val_ctrl = get_ctrl(val); | |
1118 uint val_dom_depth = dom_depth(val_ctrl); | |
1119 Node* pred = use_ctrl; | |
1120 uint if_cnt = 0; | |
1121 while (if_cnt < if_limit) { | |
1122 if ((pred->Opcode() == Op_IfTrue || pred->Opcode() == Op_IfFalse)) { | |
1123 if_cnt++; | |
17
ff5961f4c095
6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents:
0
diff
changeset
|
1124 const TypeInt* if_t = IfNode::filtered_int_type(&_igvn, val, pred); |
0 | 1125 if (if_t != NULL) { |
1126 if (rtn_t == NULL) { | |
1127 rtn_t = if_t; | |
1128 } else { | |
1129 rtn_t = rtn_t->join(if_t)->is_int(); | |
1130 } | |
1131 } | |
1132 } | |
1133 pred = idom(pred); | |
1134 if (pred == NULL || pred == C->top()) { | |
1135 break; | |
1136 } | |
1137 // Stop if going beyond definition block of val | |
1138 if (dom_depth(pred) < val_dom_depth) { | |
1139 break; | |
1140 } | |
1141 } | |
1142 } | |
1143 return rtn_t; | |
1144 } | |
1145 | |
1146 | |
1147 //------------------------------dump_spec-------------------------------------- | |
1148 // Dump special per-node info | |
1149 #ifndef PRODUCT | |
1150 void CountedLoopEndNode::dump_spec(outputStream *st) const { | |
1151 if( in(TestValue)->is_Bool() ) { | |
1152 BoolTest bt( test_trip()); // Added this for g++. | |
1153 | |
1154 st->print("["); | |
1155 bt.dump_on(st); | |
1156 st->print("]"); | |
1157 } | |
1158 st->print(" "); | |
1159 IfNode::dump_spec(st); | |
1160 } | |
1161 #endif | |
1162 | |
1163 //============================================================================= | |
1164 //------------------------------is_member-------------------------------------- | |
1165 // Is 'l' a member of 'this'? | |
1166 int IdealLoopTree::is_member( const IdealLoopTree *l ) const { | |
1167 while( l->_nest > _nest ) l = l->_parent; | |
1168 return l == this; | |
1169 } | |
1170 | |
1171 //------------------------------set_nest--------------------------------------- | |
1172 // Set loop tree nesting depth. Accumulate _has_call bits. | |
1173 int IdealLoopTree::set_nest( uint depth ) { | |
1174 _nest = depth; | |
1175 int bits = _has_call; | |
1176 if( _child ) bits |= _child->set_nest(depth+1); | |
1177 if( bits ) _has_call = 1; | |
1178 if( _next ) bits |= _next ->set_nest(depth ); | |
1179 return bits; | |
1180 } | |
1181 | |
1182 //------------------------------split_fall_in---------------------------------- | |
1183 // Split out multiple fall-in edges from the loop header. Move them to a | |
1184 // private RegionNode before the loop. This becomes the loop landing pad. | |
1185 void IdealLoopTree::split_fall_in( PhaseIdealLoop *phase, int fall_in_cnt ) { | |
1186 PhaseIterGVN &igvn = phase->_igvn; | |
1187 uint i; | |
1188 | |
1189 // Make a new RegionNode to be the landing pad. | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
1190 Node *landing_pad = new (phase->C) RegionNode( fall_in_cnt+1 ); |
0 | 1191 phase->set_loop(landing_pad,_parent); |
1192 // Gather all the fall-in control paths into the landing pad | |
1193 uint icnt = fall_in_cnt; | |
1194 uint oreq = _head->req(); | |
1195 for( i = oreq-1; i>0; i-- ) | |
1196 if( !phase->is_member( this, _head->in(i) ) ) | |
1197 landing_pad->set_req(icnt--,_head->in(i)); | |
1198 | |
1199 // Peel off PhiNode edges as well | |
1200 for (DUIterator_Fast jmax, j = _head->fast_outs(jmax); j < jmax; j++) { | |
1201 Node *oj = _head->fast_out(j); | |
1202 if( oj->is_Phi() ) { | |
1203 PhiNode* old_phi = oj->as_Phi(); | |
1204 assert( old_phi->region() == _head, "" ); | |
1205 igvn.hash_delete(old_phi); // Yank from hash before hacking edges | |
1206 Node *p = PhiNode::make_blank(landing_pad, old_phi); | |
1207 uint icnt = fall_in_cnt; | |
1208 for( i = oreq-1; i>0; i-- ) { | |
1209 if( !phase->is_member( this, _head->in(i) ) ) { | |
1210 p->init_req(icnt--, old_phi->in(i)); | |
1211 // Go ahead and clean out old edges from old phi | |
1212 old_phi->del_req(i); | |
1213 } | |
1214 } | |
1215 // Search for CSE's here, because ZKM.jar does a lot of | |
1216 // loop hackery and we need to be a little incremental | |
1217 // with the CSE to avoid O(N^2) node blow-up. | |
1218 Node *p2 = igvn.hash_find_insert(p); // Look for a CSE | |
1219 if( p2 ) { // Found CSE | |
1220 p->destruct(); // Recover useless new node | |
1221 p = p2; // Use old node | |
1222 } else { | |
1223 igvn.register_new_node_with_optimizer(p, old_phi); | |
1224 } | |
1225 // Make old Phi refer to new Phi. | |
1226 old_phi->add_req(p); | |
1227 // Check for the special case of making the old phi useless and | |
1228 // disappear it. In JavaGrande I have a case where this useless | |
1229 // Phi is the loop limit and prevents recognizing a CountedLoop | |
1230 // which in turn prevents removing an empty loop. | |
1231 Node *id_old_phi = old_phi->Identity( &igvn ); | |
1232 if( id_old_phi != old_phi ) { // Found a simple identity? | |
1621
6027dddc26c6
6677629: PhaseIterGVN::subsume_node() should call hash_delete() and add_users_to_worklist()
kvn
parents:
1552
diff
changeset
|
1233 // Note that I cannot call 'replace_node' here, because |
0 | 1234 // that will yank the edge from old_phi to the Region and |
1235 // I'm mid-iteration over the Region's uses. | |
1236 for (DUIterator_Last imin, i = old_phi->last_outs(imin); i >= imin; ) { | |
1237 Node* use = old_phi->last_out(i); | |
6144
5e990493719e
7173340: C2: code cleanup: use PhaseIterGVN::replace_edge(Node*, int, Node*) where applicable
kvn
parents:
4862
diff
changeset
|
1238 igvn.rehash_node_delayed(use); |
0 | 1239 uint uses_found = 0; |
1240 for (uint j = 0; j < use->len(); j++) { | |
1241 if (use->in(j) == old_phi) { | |
1242 if (j < use->req()) use->set_req (j, id_old_phi); | |
1243 else use->set_prec(j, id_old_phi); | |
1244 uses_found++; | |
1245 } | |
1246 } | |
1247 i -= uses_found; // we deleted 1 or more copies of this edge | |
1248 } | |
1249 } | |
1250 igvn._worklist.push(old_phi); | |
1251 } | |
1252 } | |
1253 // Finally clean out the fall-in edges from the RegionNode | |
1254 for( i = oreq-1; i>0; i-- ) { | |
1255 if( !phase->is_member( this, _head->in(i) ) ) { | |
1256 _head->del_req(i); | |
1257 } | |
1258 } | |
1259 // Transform landing pad | |
1260 igvn.register_new_node_with_optimizer(landing_pad, _head); | |
1261 // Insert landing pad into the header | |
1262 _head->add_req(landing_pad); | |
1263 } | |
1264 | |
1265 //------------------------------split_outer_loop------------------------------- | |
1266 // Split out the outermost loop from this shared header. | |
1267 void IdealLoopTree::split_outer_loop( PhaseIdealLoop *phase ) { | |
1268 PhaseIterGVN &igvn = phase->_igvn; | |
1269 | |
1270 // Find index of outermost loop; it should also be my tail. | |
1271 uint outer_idx = 1; | |
1272 while( _head->in(outer_idx) != _tail ) outer_idx++; | |
1273 | |
1274 // Make a LoopNode for the outermost loop. | |
1275 Node *ctl = _head->in(LoopNode::EntryControl); | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
1276 Node *outer = new (phase->C) LoopNode( ctl, _head->in(outer_idx) ); |
0 | 1277 outer = igvn.register_new_node_with_optimizer(outer, _head); |
1278 phase->set_created_loop_node(); | |
2445 | 1279 |
0 | 1280 // Outermost loop falls into '_head' loop |
3845
c96c3eb1efae
7068051: SIGSEGV in PhaseIdealLoop::build_loop_late_post
kvn
parents:
3782
diff
changeset
|
1281 _head->set_req(LoopNode::EntryControl, outer); |
0 | 1282 _head->del_req(outer_idx); |
1283 // Split all the Phis up between '_head' loop and 'outer' loop. | |
1284 for (DUIterator_Fast jmax, j = _head->fast_outs(jmax); j < jmax; j++) { | |
1285 Node *out = _head->fast_out(j); | |
1286 if( out->is_Phi() ) { | |
1287 PhiNode *old_phi = out->as_Phi(); | |
1288 assert( old_phi->region() == _head, "" ); | |
1289 Node *phi = PhiNode::make_blank(outer, old_phi); | |
1290 phi->init_req(LoopNode::EntryControl, old_phi->in(LoopNode::EntryControl)); | |
1291 phi->init_req(LoopNode::LoopBackControl, old_phi->in(outer_idx)); | |
1292 phi = igvn.register_new_node_with_optimizer(phi, old_phi); | |
1293 // Make old Phi point to new Phi on the fall-in path | |
6144
5e990493719e
7173340: C2: code cleanup: use PhaseIterGVN::replace_edge(Node*, int, Node*) where applicable
kvn
parents:
4862
diff
changeset
|
1294 igvn.replace_input_of(old_phi, LoopNode::EntryControl, phi); |
0 | 1295 old_phi->del_req(outer_idx); |
1296 } | |
1297 } | |
1298 | |
1299 // Use the new loop head instead of the old shared one | |
1300 _head = outer; | |
1301 phase->set_loop(_head, this); | |
1302 } | |
1303 | |
1304 //------------------------------fix_parent------------------------------------- | |
1305 static void fix_parent( IdealLoopTree *loop, IdealLoopTree *parent ) { | |
1306 loop->_parent = parent; | |
1307 if( loop->_child ) fix_parent( loop->_child, loop ); | |
1308 if( loop->_next ) fix_parent( loop->_next , parent ); | |
1309 } | |
1310 | |
1311 //------------------------------estimate_path_freq----------------------------- | |
1312 static float estimate_path_freq( Node *n ) { | |
1313 // Try to extract some path frequency info | |
1314 IfNode *iff; | |
1315 for( int i = 0; i < 50; i++ ) { // Skip through a bunch of uncommon tests | |
1316 uint nop = n->Opcode(); | |
1317 if( nop == Op_SafePoint ) { // Skip any safepoint | |
1318 n = n->in(0); | |
1319 continue; | |
1320 } | |
1321 if( nop == Op_CatchProj ) { // Get count from a prior call | |
1322 // Assume call does not always throw exceptions: means the call-site | |
1323 // count is also the frequency of the fall-through path. | |
1324 assert( n->is_CatchProj(), "" ); | |
1325 if( ((CatchProjNode*)n)->_con != CatchProjNode::fall_through_index ) | |
1326 return 0.0f; // Assume call exception path is rare | |
1327 Node *call = n->in(0)->in(0)->in(0); | |
1328 assert( call->is_Call(), "expect a call here" ); | |
1329 const JVMState *jvms = ((CallNode*)call)->jvms(); | |
1330 ciMethodData* methodData = jvms->method()->method_data(); | |
1331 if (!methodData->is_mature()) return 0.0f; // No call-site data | |
1332 ciProfileData* data = methodData->bci_to_data(jvms->bci()); | |
1333 if ((data == NULL) || !data->is_CounterData()) { | |
1334 // no call profile available, try call's control input | |
1335 n = n->in(0); | |
1336 continue; | |
1337 } | |
1338 return data->as_CounterData()->count()/FreqCountInvocations; | |
1339 } | |
1340 // See if there's a gating IF test | |
1341 Node *n_c = n->in(0); | |
1342 if( !n_c->is_If() ) break; // No estimate available | |
1343 iff = n_c->as_If(); | |
1344 if( iff->_fcnt != COUNT_UNKNOWN ) // Have a valid count? | |
1345 // Compute how much count comes on this path | |
1346 return ((nop == Op_IfTrue) ? iff->_prob : 1.0f - iff->_prob) * iff->_fcnt; | |
1347 // Have no count info. Skip dull uncommon-trap like branches. | |
1348 if( (nop == Op_IfTrue && iff->_prob < PROB_LIKELY_MAG(5)) || | |
1349 (nop == Op_IfFalse && iff->_prob > PROB_UNLIKELY_MAG(5)) ) | |
1350 break; | |
1351 // Skip through never-taken branch; look for a real loop exit. | |
1352 n = iff->in(0); | |
1353 } | |
1354 return 0.0f; // No estimate available | |
1355 } | |
1356 | |
1357 //------------------------------merge_many_backedges--------------------------- | |
1358 // Merge all the backedges from the shared header into a private Region. | |
1359 // Feed that region as the one backedge to this loop. | |
1360 void IdealLoopTree::merge_many_backedges( PhaseIdealLoop *phase ) { | |
1361 uint i; | |
1362 | |
1363 // Scan for the top 2 hottest backedges | |
1364 float hotcnt = 0.0f; | |
1365 float warmcnt = 0.0f; | |
1366 uint hot_idx = 0; | |
1367 // Loop starts at 2 because slot 1 is the fall-in path | |
1368 for( i = 2; i < _head->req(); i++ ) { | |
1369 float cnt = estimate_path_freq(_head->in(i)); | |
1370 if( cnt > hotcnt ) { // Grab hottest path | |
1371 warmcnt = hotcnt; | |
1372 hotcnt = cnt; | |
1373 hot_idx = i; | |
1374 } else if( cnt > warmcnt ) { // And 2nd hottest path | |
1375 warmcnt = cnt; | |
1376 } | |
1377 } | |
1378 | |
1379 // See if the hottest backedge is worthy of being an inner loop | |
1380 // by being much hotter than the next hottest backedge. | |
1381 if( hotcnt <= 0.0001 || | |
1382 hotcnt < 2.0*warmcnt ) hot_idx = 0;// No hot backedge | |
1383 | |
1384 // Peel out the backedges into a private merge point; peel | |
1385 // them all except optionally hot_idx. | |
1386 PhaseIterGVN &igvn = phase->_igvn; | |
1387 | |
1388 Node *hot_tail = NULL; | |
1389 // Make a Region for the merge point | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
1390 Node *r = new (phase->C) RegionNode(1); |
0 | 1391 for( i = 2; i < _head->req(); i++ ) { |
1392 if( i != hot_idx ) | |
1393 r->add_req( _head->in(i) ); | |
1394 else hot_tail = _head->in(i); | |
1395 } | |
1396 igvn.register_new_node_with_optimizer(r, _head); | |
1397 // Plug region into end of loop _head, followed by hot_tail | |
1398 while( _head->req() > 3 ) _head->del_req( _head->req()-1 ); | |
1399 _head->set_req(2, r); | |
1400 if( hot_idx ) _head->add_req(hot_tail); | |
1401 | |
1402 // Split all the Phis up between '_head' loop and the Region 'r' | |
1403 for (DUIterator_Fast jmax, j = _head->fast_outs(jmax); j < jmax; j++) { | |
1404 Node *out = _head->fast_out(j); | |
1405 if( out->is_Phi() ) { | |
1406 PhiNode* n = out->as_Phi(); | |
1407 igvn.hash_delete(n); // Delete from hash before hacking edges | |
1408 Node *hot_phi = NULL; | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
1409 Node *phi = new (phase->C) PhiNode(r, n->type(), n->adr_type()); |
0 | 1410 // Check all inputs for the ones to peel out |
1411 uint j = 1; | |
1412 for( uint i = 2; i < n->req(); i++ ) { | |
1413 if( i != hot_idx ) | |
1414 phi->set_req( j++, n->in(i) ); | |
1415 else hot_phi = n->in(i); | |
1416 } | |
1417 // Register the phi but do not transform until whole place transforms | |
1418 igvn.register_new_node_with_optimizer(phi, n); | |
1419 // Add the merge phi to the old Phi | |
1420 while( n->req() > 3 ) n->del_req( n->req()-1 ); | |
1421 n->set_req(2, phi); | |
1422 if( hot_idx ) n->add_req(hot_phi); | |
1423 } | |
1424 } | |
1425 | |
1426 | |
1427 // Insert a new IdealLoopTree inserted below me. Turn it into a clone | |
1428 // of self loop tree. Turn self into a loop headed by _head and with | |
1429 // tail being the new merge point. | |
1430 IdealLoopTree *ilt = new IdealLoopTree( phase, _head, _tail ); | |
1431 phase->set_loop(_tail,ilt); // Adjust tail | |
1432 _tail = r; // Self's tail is new merge point | |
1433 phase->set_loop(r,this); | |
1434 ilt->_child = _child; // New guy has my children | |
1435 _child = ilt; // Self has new guy as only child | |
1436 ilt->_parent = this; // new guy has self for parent | |
1437 ilt->_nest = _nest; // Same nesting depth (for now) | |
1438 | |
1439 // Starting with 'ilt', look for child loop trees using the same shared | |
1440 // header. Flatten these out; they will no longer be loops in the end. | |
1441 IdealLoopTree **pilt = &_child; | |
1442 while( ilt ) { | |
1443 if( ilt->_head == _head ) { | |
1444 uint i; | |
1445 for( i = 2; i < _head->req(); i++ ) | |
1446 if( _head->in(i) == ilt->_tail ) | |
1447 break; // Still a loop | |
1448 if( i == _head->req() ) { // No longer a loop | |
1449 // Flatten ilt. Hang ilt's "_next" list from the end of | |
1450 // ilt's '_child' list. Move the ilt's _child up to replace ilt. | |
1451 IdealLoopTree **cp = &ilt->_child; | |
1452 while( *cp ) cp = &(*cp)->_next; // Find end of child list | |
1453 *cp = ilt->_next; // Hang next list at end of child list | |
1454 *pilt = ilt->_child; // Move child up to replace ilt | |
1455 ilt->_head = NULL; // Flag as a loop UNIONED into parent | |
1456 ilt = ilt->_child; // Repeat using new ilt | |
1457 continue; // do not advance over ilt->_child | |
1458 } | |
1459 assert( ilt->_tail == hot_tail, "expected to only find the hot inner loop here" ); | |
1460 phase->set_loop(_head,ilt); | |
1461 } | |
1462 pilt = &ilt->_child; // Advance to next | |
1463 ilt = *pilt; | |
1464 } | |
1465 | |
1466 if( _child ) fix_parent( _child, this ); | |
1467 } | |
1468 | |
1469 //------------------------------beautify_loops--------------------------------- | |
1470 // Split shared headers and insert loop landing pads. | |
1471 // Insert a LoopNode to replace the RegionNode. | |
1472 // Return TRUE if loop tree is structurally changed. | |
1473 bool IdealLoopTree::beautify_loops( PhaseIdealLoop *phase ) { | |
1474 bool result = false; | |
1475 // Cache parts in locals for easy | |
1476 PhaseIterGVN &igvn = phase->_igvn; | |
1477 | |
1478 igvn.hash_delete(_head); // Yank from hash before hacking edges | |
1479 | |
1480 // Check for multiple fall-in paths. Peel off a landing pad if need be. | |
1481 int fall_in_cnt = 0; | |
1482 for( uint i = 1; i < _head->req(); i++ ) | |
1483 if( !phase->is_member( this, _head->in(i) ) ) | |
1484 fall_in_cnt++; | |
1485 assert( fall_in_cnt, "at least 1 fall-in path" ); | |
1486 if( fall_in_cnt > 1 ) // Need a loop landing pad to merge fall-ins | |
1487 split_fall_in( phase, fall_in_cnt ); | |
1488 | |
1489 // Swap inputs to the _head and all Phis to move the fall-in edge to | |
1490 // the left. | |
1491 fall_in_cnt = 1; | |
1492 while( phase->is_member( this, _head->in(fall_in_cnt) ) ) | |
1493 fall_in_cnt++; | |
1494 if( fall_in_cnt > 1 ) { | |
1495 // Since I am just swapping inputs I do not need to update def-use info | |
1496 Node *tmp = _head->in(1); | |
1497 _head->set_req( 1, _head->in(fall_in_cnt) ); | |
1498 _head->set_req( fall_in_cnt, tmp ); | |
1499 // Swap also all Phis | |
1500 for (DUIterator_Fast imax, i = _head->fast_outs(imax); i < imax; i++) { | |
1501 Node* phi = _head->fast_out(i); | |
1502 if( phi->is_Phi() ) { | |
1503 igvn.hash_delete(phi); // Yank from hash before hacking edges | |
1504 tmp = phi->in(1); | |
1505 phi->set_req( 1, phi->in(fall_in_cnt) ); | |
1506 phi->set_req( fall_in_cnt, tmp ); | |
1507 } | |
1508 } | |
1509 } | |
1510 assert( !phase->is_member( this, _head->in(1) ), "left edge is fall-in" ); | |
1511 assert( phase->is_member( this, _head->in(2) ), "right edge is loop" ); | |
1512 | |
1513 // If I am a shared header (multiple backedges), peel off the many | |
1514 // backedges into a private merge point and use the merge point as | |
1515 // the one true backedge. | |
1516 if( _head->req() > 3 ) { | |
2445 | 1517 // Merge the many backedges into a single backedge but leave |
1518 // the hottest backedge as separate edge for the following peel. | |
0 | 1519 merge_many_backedges( phase ); |
1520 result = true; | |
1521 } | |
1522 | |
2445 | 1523 // If I have one hot backedge, peel off myself loop. |
0 | 1524 // I better be the outermost loop. |
1525 if( _head->req() > 3 ) { | |
1526 split_outer_loop( phase ); | |
1527 result = true; | |
1528 | |
1529 } else if( !_head->is_Loop() && !_irreducible ) { | |
1530 // Make a new LoopNode to replace the old loop head | |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
1531 Node *l = new (phase->C) LoopNode( _head->in(1), _head->in(2) ); |
0 | 1532 l = igvn.register_new_node_with_optimizer(l, _head); |
1533 phase->set_created_loop_node(); | |
1534 // Go ahead and replace _head | |
1621
6027dddc26c6
6677629: PhaseIterGVN::subsume_node() should call hash_delete() and add_users_to_worklist()
kvn
parents:
1552
diff
changeset
|
1535 phase->_igvn.replace_node( _head, l ); |
0 | 1536 _head = l; |
1537 phase->set_loop(_head, this); | |
1538 } | |
1539 | |
1540 // Now recursively beautify nested loops | |
1541 if( _child ) result |= _child->beautify_loops( phase ); | |
1542 if( _next ) result |= _next ->beautify_loops( phase ); | |
1543 return result; | |
1544 } | |
1545 | |
1546 //------------------------------allpaths_check_safepts---------------------------- | |
1547 // Allpaths backwards scan from loop tail, terminating each path at first safepoint | |
1548 // encountered. Helper for check_safepts. | |
1549 void IdealLoopTree::allpaths_check_safepts(VectorSet &visited, Node_List &stack) { | |
1550 assert(stack.size() == 0, "empty stack"); | |
1551 stack.push(_tail); | |
1552 visited.Clear(); | |
1553 visited.set(_tail->_idx); | |
1554 while (stack.size() > 0) { | |
1555 Node* n = stack.pop(); | |
1556 if (n->is_Call() && n->as_Call()->guaranteed_safepoint()) { | |
1557 // Terminate this path | |
1558 } else if (n->Opcode() == Op_SafePoint) { | |
1559 if (_phase->get_loop(n) != this) { | |
1560 if (_required_safept == NULL) _required_safept = new Node_List(); | |
1561 _required_safept->push(n); // save the one closest to the tail | |
1562 } | |
1563 // Terminate this path | |
1564 } else { | |
1565 uint start = n->is_Region() ? 1 : 0; | |
1566 uint end = n->is_Region() && !n->is_Loop() ? n->req() : start + 1; | |
1567 for (uint i = start; i < end; i++) { | |
1568 Node* in = n->in(i); | |
1569 assert(in->is_CFG(), "must be"); | |
1570 if (!visited.test_set(in->_idx) && is_member(_phase->get_loop(in))) { | |
1571 stack.push(in); | |
1572 } | |
1573 } | |
1574 } | |
1575 } | |
1576 } | |
1577 | |
1578 //------------------------------check_safepts---------------------------- | |
1579 // Given dominators, try to find loops with calls that must always be | |
1580 // executed (call dominates loop tail). These loops do not need non-call | |
1581 // safepoints (ncsfpt). | |
1582 // | |
1583 // A complication is that a safepoint in a inner loop may be needed | |
1584 // by an outer loop. In the following, the inner loop sees it has a | |
1585 // call (block 3) on every path from the head (block 2) to the | |
1586 // backedge (arc 3->2). So it deletes the ncsfpt (non-call safepoint) | |
1587 // in block 2, _but_ this leaves the outer loop without a safepoint. | |
1588 // | |
1589 // entry 0 | |
1590 // | | |
1591 // v | |
1592 // outer 1,2 +->1 | |
1593 // | | | |
1594 // | v | |
1595 // | 2<---+ ncsfpt in 2 | |
1596 // |_/|\ | | |
1597 // | v | | |
1598 // inner 2,3 / 3 | call in 3 | |
1599 // / | | | |
1600 // v +--+ | |
1601 // exit 4 | |
1602 // | |
1603 // | |
1604 // This method creates a list (_required_safept) of ncsfpt nodes that must | |
1605 // be protected is created for each loop. When a ncsfpt maybe deleted, it | |
1606 // is first looked for in the lists for the outer loops of the current loop. | |
1607 // | |
1608 // The insights into the problem: | |
1609 // A) counted loops are okay | |
1610 // B) innermost loops are okay (only an inner loop can delete | |
1611 // a ncsfpt needed by an outer loop) | |
1612 // C) a loop is immune from an inner loop deleting a safepoint | |
1613 // if the loop has a call on the idom-path | |
1614 // D) a loop is also immune if it has a ncsfpt (non-call safepoint) on the | |
1615 // idom-path that is not in a nested loop | |
1616 // E) otherwise, an ncsfpt on the idom-path that is nested in an inner | |
1617 // loop needs to be prevented from deletion by an inner loop | |
1618 // | |
1619 // There are two analyses: | |
1620 // 1) The first, and cheaper one, scans the loop body from | |
1621 // tail to head following the idom (immediate dominator) | |
1622 // chain, looking for the cases (C,D,E) above. | |
1623 // Since inner loops are scanned before outer loops, there is summary | |
1624 // information about inner loops. Inner loops can be skipped over | |
1625 // when the tail of an inner loop is encountered. | |
1626 // | |
1627 // 2) The second, invoked if the first fails to find a call or ncsfpt on | |
1628 // the idom path (which is rare), scans all predecessor control paths | |
1629 // from the tail to the head, terminating a path when a call or sfpt | |
1630 // is encountered, to find the ncsfpt's that are closest to the tail. | |
1631 // | |
1632 void IdealLoopTree::check_safepts(VectorSet &visited, Node_List &stack) { | |
1633 // Bottom up traversal | |
1634 IdealLoopTree* ch = _child; | |
6636 | 1635 if (_child) _child->check_safepts(visited, stack); |
1636 if (_next) _next ->check_safepts(visited, stack); | |
0 | 1637 |
1638 if (!_head->is_CountedLoop() && !_has_sfpt && _parent != NULL && !_irreducible) { | |
1639 bool has_call = false; // call on dom-path | |
1640 bool has_local_ncsfpt = false; // ncsfpt on dom-path at this loop depth | |
1641 Node* nonlocal_ncsfpt = NULL; // ncsfpt on dom-path at a deeper depth | |
1642 // Scan the dom-path nodes from tail to head | |
1643 for (Node* n = tail(); n != _head; n = _phase->idom(n)) { | |
1644 if (n->is_Call() && n->as_Call()->guaranteed_safepoint()) { | |
1645 has_call = true; | |
1646 _has_sfpt = 1; // Then no need for a safept! | |
1647 break; | |
1648 } else if (n->Opcode() == Op_SafePoint) { | |
1649 if (_phase->get_loop(n) == this) { | |
1650 has_local_ncsfpt = true; | |
1651 break; | |
1652 } | |
1653 if (nonlocal_ncsfpt == NULL) { | |
1654 nonlocal_ncsfpt = n; // save the one closest to the tail | |
1655 } | |
1656 } else { | |
1657 IdealLoopTree* nlpt = _phase->get_loop(n); | |
1658 if (this != nlpt) { | |
1659 // If at an inner loop tail, see if the inner loop has already | |
1660 // recorded seeing a call on the dom-path (and stop.) If not, | |
1661 // jump to the head of the inner loop. | |
1662 assert(is_member(nlpt), "nested loop"); | |
1663 Node* tail = nlpt->_tail; | |
1664 if (tail->in(0)->is_If()) tail = tail->in(0); | |
1665 if (n == tail) { | |
1666 // If inner loop has call on dom-path, so does outer loop | |
1667 if (nlpt->_has_sfpt) { | |
1668 has_call = true; | |
1669 _has_sfpt = 1; | |
1670 break; | |
1671 } | |
1672 // Skip to head of inner loop | |
1673 assert(_phase->is_dominator(_head, nlpt->_head), "inner head dominated by outer head"); | |
1674 n = nlpt->_head; | |
1675 } | |
1676 } | |
1677 } | |
1678 } | |
1679 // Record safept's that this loop needs preserved when an | |
1680 // inner loop attempts to delete it's safepoints. | |
1681 if (_child != NULL && !has_call && !has_local_ncsfpt) { | |
1682 if (nonlocal_ncsfpt != NULL) { | |
1683 if (_required_safept == NULL) _required_safept = new Node_List(); | |
1684 _required_safept->push(nonlocal_ncsfpt); | |
1685 } else { | |
1686 // Failed to find a suitable safept on the dom-path. Now use | |
1687 // an all paths walk from tail to head, looking for safepoints to preserve. | |
1688 allpaths_check_safepts(visited, stack); | |
1689 } | |
1690 } | |
1691 } | |
1692 } | |
1693 | |
1694 //---------------------------is_deleteable_safept---------------------------- | |
1695 // Is safept not required by an outer loop? | |
1696 bool PhaseIdealLoop::is_deleteable_safept(Node* sfpt) { | |
1697 assert(sfpt->Opcode() == Op_SafePoint, ""); | |
1698 IdealLoopTree* lp = get_loop(sfpt)->_parent; | |
1699 while (lp != NULL) { | |
1700 Node_List* sfpts = lp->_required_safept; | |
1701 if (sfpts != NULL) { | |
1702 for (uint i = 0; i < sfpts->size(); i++) { | |
1703 if (sfpt == sfpts->at(i)) | |
1704 return false; | |
1705 } | |
1706 } | |
1707 lp = lp->_parent; | |
1708 } | |
1709 return true; | |
1710 } | |
1711 | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1712 //---------------------------replace_parallel_iv------------------------------- |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1713 // Replace parallel induction variable (parallel to trip counter) |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1714 void PhaseIdealLoop::replace_parallel_iv(IdealLoopTree *loop) { |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1715 assert(loop->_head->is_CountedLoop(), ""); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1716 CountedLoopNode *cl = loop->_head->as_CountedLoop(); |
3850
6987871cfb9b
7077439: Possible reference through NULL in loopPredicate.cpp:726
kvn
parents:
3845
diff
changeset
|
1717 if (!cl->is_valid_counted_loop()) |
6987871cfb9b
7077439: Possible reference through NULL in loopPredicate.cpp:726
kvn
parents:
3845
diff
changeset
|
1718 return; // skip malformed counted loop |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1719 Node *incr = cl->incr(); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1720 if (incr == NULL) |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1721 return; // Dead loop? |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1722 Node *init = cl->init_trip(); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1723 Node *phi = cl->phi(); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1724 int stride_con = cl->stride_con(); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1725 |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1726 // Visit all children, looking for Phis |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1727 for (DUIterator i = cl->outs(); cl->has_out(i); i++) { |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1728 Node *out = cl->out(i); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1729 // Look for other phis (secondary IVs). Skip dead ones |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1730 if (!out->is_Phi() || out == phi || !has_node(out)) |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1731 continue; |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1732 PhiNode* phi2 = out->as_Phi(); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1733 Node *incr2 = phi2->in( LoopNode::LoopBackControl ); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1734 // Look for induction variables of the form: X += constant |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1735 if (phi2->region() != loop->_head || |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1736 incr2->req() != 3 || |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1737 incr2->in(1) != phi2 || |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1738 incr2 == incr || |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1739 incr2->Opcode() != Op_AddI || |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1740 !incr2->in(2)->is_Con()) |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1741 continue; |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1742 |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1743 // Check for parallel induction variable (parallel to trip counter) |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1744 // via an affine function. In particular, count-down loops with |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1745 // count-up array indices are common. We only RCE references off |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1746 // the trip-counter, so we need to convert all these to trip-counter |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1747 // expressions. |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1748 Node *init2 = phi2->in( LoopNode::EntryControl ); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1749 int stride_con2 = incr2->in(2)->get_int(); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1750 |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1751 // The general case here gets a little tricky. We want to find the |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1752 // GCD of all possible parallel IV's and make a new IV using this |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1753 // GCD for the loop. Then all possible IVs are simple multiples of |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1754 // the GCD. In practice, this will cover very few extra loops. |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1755 // Instead we require 'stride_con2' to be a multiple of 'stride_con', |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1756 // where +/-1 is the common case, but other integer multiples are |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1757 // also easy to handle. |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1758 int ratio_con = stride_con2/stride_con; |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1759 |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1760 if ((ratio_con * stride_con) == stride_con2) { // Check for exact |
3936
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
1761 #ifndef PRODUCT |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
1762 if (TraceLoopOpts) { |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
1763 tty->print("Parallel IV: %d ", phi2->_idx); |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
1764 loop->dump_head(); |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
1765 } |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
1766 #endif |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1767 // Convert to using the trip counter. The parallel induction |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1768 // variable differs from the trip counter by a loop-invariant |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1769 // amount, the difference between their respective initial values. |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1770 // It is scaled by the 'ratio_con'. |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1771 Node* ratio = _igvn.intcon(ratio_con); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1772 set_ctrl(ratio, C->root()); |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
1773 Node* ratio_init = new (C) MulINode(init, ratio); |
3936
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
1774 _igvn.register_new_node_with_optimizer(ratio_init, init); |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
1775 set_early_ctrl(ratio_init); |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
1776 Node* diff = new (C) SubINode(init2, ratio_init); |
3936
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
1777 _igvn.register_new_node_with_optimizer(diff, init2); |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
1778 set_early_ctrl(diff); |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
1779 Node* ratio_idx = new (C) MulINode(phi, ratio); |
3936
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
1780 _igvn.register_new_node_with_optimizer(ratio_idx, phi); |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
1781 set_ctrl(ratio_idx, cl); |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
1782 Node* add = new (C) AddINode(ratio_idx, diff); |
3936
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
1783 _igvn.register_new_node_with_optimizer(add); |
2c24ef16533d
7035946: Up to 15% regression on JDK 7 b136 vs b135 on specjvm2008.crypto.rsa on x64
kvn
parents:
3850
diff
changeset
|
1784 set_ctrl(add, cl); |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1785 _igvn.replace_node( phi2, add ); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1786 // Sometimes an induction variable is unused |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1787 if (add->outcnt() == 0) { |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1788 _igvn.remove_dead_node(add); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1789 } |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1790 --i; // deleted this phi; rescan starting with next position |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1791 continue; |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1792 } |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1793 } |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1794 } |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1795 |
0 | 1796 //------------------------------counted_loop----------------------------------- |
1797 // Convert to counted loops where possible | |
1798 void IdealLoopTree::counted_loop( PhaseIdealLoop *phase ) { | |
1799 | |
1800 // For grins, set the inner-loop flag here | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1801 if (!_child) { |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1802 if (_head->is_Loop()) _head->as_Loop()->set_inner_loop(); |
0 | 1803 } |
1804 | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1805 if (_head->is_CountedLoop() || |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1806 phase->is_counted_loop(_head, this)) { |
0 | 1807 _has_sfpt = 1; // Indicate we do not need a safepoint here |
1808 | |
6636 | 1809 // Look for safepoints to remove. |
1810 Node_List* sfpts = _safepts; | |
1811 if (sfpts != NULL) { | |
1812 for (uint i = 0; i < sfpts->size(); i++) { | |
1813 Node* n = sfpts->at(i); | |
1814 assert(phase->get_loop(n) == this, ""); | |
1815 if (phase->is_deleteable_safept(n)) { | |
1816 phase->lazy_replace(n, n->in(TypeFunc::Control)); | |
1817 } | |
1818 } | |
1819 } | |
0 | 1820 |
1821 // Look for induction variables | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1822 phase->replace_parallel_iv(this); |
0 | 1823 |
1824 } else if (_parent != NULL && !_irreducible) { | |
1825 // Not a counted loop. | |
6636 | 1826 // Look for a safepoint on the idom-path. |
1827 Node* sfpt = tail(); | |
1828 for (; sfpt != _head; sfpt = phase->idom(sfpt)) { | |
1829 if (sfpt->Opcode() == Op_SafePoint && phase->get_loop(sfpt) == this) | |
1830 break; // Found one | |
0 | 1831 } |
6636 | 1832 // Delete other safepoints in this loop. |
1833 Node_List* sfpts = _safepts; | |
1834 if (sfpts != NULL && sfpt != _head && sfpt->Opcode() == Op_SafePoint) { | |
1835 for (uint i = 0; i < sfpts->size(); i++) { | |
1836 Node* n = sfpts->at(i); | |
1837 assert(phase->get_loop(n) == this, ""); | |
1838 if (n != sfpt && phase->is_deleteable_safept(n)) { | |
1839 phase->lazy_replace(n, n->in(TypeFunc::Control)); | |
1840 } | |
1841 } | |
0 | 1842 } |
1843 } | |
1844 | |
1845 // Recursively | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1846 if (_child) _child->counted_loop( phase ); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1847 if (_next) _next ->counted_loop( phase ); |
0 | 1848 } |
1849 | |
1850 #ifndef PRODUCT | |
1851 //------------------------------dump_head-------------------------------------- | |
1852 // Dump 1 liner for loop header info | |
1853 void IdealLoopTree::dump_head( ) const { | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1854 for (uint i=0; i<_nest; i++) |
0 | 1855 tty->print(" "); |
1856 tty->print("Loop: N%d/N%d ",_head->_idx,_tail->_idx); | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1857 if (_irreducible) tty->print(" IRREDUCIBLE"); |
3345 | 1858 Node* entry = _head->in(LoopNode::EntryControl); |
1859 if (LoopLimitCheck) { | |
1860 Node* predicate = PhaseIdealLoop::find_predicate_insertion_point(entry, Deoptimization::Reason_loop_limit_check); | |
1861 if (predicate != NULL ) { | |
1862 tty->print(" limit_check"); | |
1863 entry = entry->in(0)->in(0); | |
1864 } | |
1865 } | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1866 if (UseLoopPredicate) { |
3345 | 1867 entry = PhaseIdealLoop::find_predicate_insertion_point(entry, Deoptimization::Reason_predicate); |
2445 | 1868 if (entry != NULL) { |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1869 tty->print(" predicated"); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1870 } |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1871 } |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1872 if (_head->is_CountedLoop()) { |
0 | 1873 CountedLoopNode *cl = _head->as_CountedLoop(); |
1874 tty->print(" counted"); | |
2465 | 1875 |
1876 Node* init_n = cl->init_trip(); | |
1877 if (init_n != NULL && init_n->is_Con()) | |
1878 tty->print(" [%d,", cl->init_trip()->get_int()); | |
1879 else | |
1880 tty->print(" [int,"); | |
1881 Node* limit_n = cl->limit(); | |
1882 if (limit_n != NULL && limit_n->is_Con()) | |
1883 tty->print("%d),", cl->limit()->get_int()); | |
1884 else | |
1885 tty->print("int),"); | |
1886 int stride_con = cl->stride_con(); | |
1887 if (stride_con > 0) tty->print("+"); | |
1888 tty->print("%d", stride_con); | |
1889 | |
6614
006050192a5a
6340864: Implement vectorization optimizations in hotspot-server
kvn
parents:
6179
diff
changeset
|
1890 tty->print(" (%d iters) ", (int)cl->profile_trip_cnt()); |
006050192a5a
6340864: Implement vectorization optimizations in hotspot-server
kvn
parents:
6179
diff
changeset
|
1891 |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1892 if (cl->is_pre_loop ()) tty->print(" pre" ); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1893 if (cl->is_main_loop()) tty->print(" main"); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1894 if (cl->is_post_loop()) tty->print(" post"); |
0 | 1895 } |
1896 tty->cr(); | |
1897 } | |
1898 | |
1899 //------------------------------dump------------------------------------------- | |
1900 // Dump loops by loop tree | |
1901 void IdealLoopTree::dump( ) const { | |
1902 dump_head(); | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1903 if (_child) _child->dump(); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1904 if (_next) _next ->dump(); |
0 | 1905 } |
1906 | |
1907 #endif | |
1908 | |
367
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1909 static void log_loop_tree(IdealLoopTree* root, IdealLoopTree* loop, CompileLog* log) { |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1910 if (loop == root) { |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1911 if (loop->_child != NULL) { |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1912 log->begin_head("loop_tree"); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1913 log->end_head(); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1914 if( loop->_child ) log_loop_tree(root, loop->_child, log); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1915 log->tail("loop_tree"); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1916 assert(loop->_next == NULL, "what?"); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1917 } |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1918 } else { |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1919 Node* head = loop->_head; |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1920 log->begin_head("loop"); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1921 log->print(" idx='%d' ", head->_idx); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1922 if (loop->_irreducible) log->print("irreducible='1' "); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1923 if (head->is_Loop()) { |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1924 if (head->as_Loop()->is_inner_loop()) log->print("inner_loop='1' "); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1925 if (head->as_Loop()->is_partial_peel_loop()) log->print("partial_peel_loop='1' "); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1926 } |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1927 if (head->is_CountedLoop()) { |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1928 CountedLoopNode* cl = head->as_CountedLoop(); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1929 if (cl->is_pre_loop()) log->print("pre_loop='%d' ", cl->main_idx()); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1930 if (cl->is_main_loop()) log->print("main_loop='%d' ", cl->_idx); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1931 if (cl->is_post_loop()) log->print("post_loop='%d' ", cl->main_idx()); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1932 } |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1933 log->end_head(); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1934 if( loop->_child ) log_loop_tree(root, loop->_child, log); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1935 log->tail("loop"); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1936 if( loop->_next ) log_loop_tree(root, loop->_next, log); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1937 } |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1938 } |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
1939 |
1172 | 1940 //---------------------collect_potentially_useful_predicates----------------------- |
1941 // Helper function to collect potentially useful predicates to prevent them from | |
1942 // being eliminated by PhaseIdealLoop::eliminate_useless_predicates | |
1943 void PhaseIdealLoop::collect_potentially_useful_predicates( | |
1944 IdealLoopTree * loop, Unique_Node_List &useful_predicates) { | |
1945 if (loop->_child) { // child | |
1946 collect_potentially_useful_predicates(loop->_child, useful_predicates); | |
1947 } | |
1948 | |
1949 // self (only loops that we can apply loop predication may use their predicates) | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1950 if (loop->_head->is_Loop() && |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1951 !loop->_irreducible && |
1172 | 1952 !loop->tail()->is_top()) { |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1953 LoopNode* lpn = loop->_head->as_Loop(); |
1172 | 1954 Node* entry = lpn->in(LoopNode::EntryControl); |
3345 | 1955 Node* predicate_proj = find_predicate(entry); // loop_limit_check first |
1172 | 1956 if (predicate_proj != NULL ) { // right pattern that can be used by loop predication |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1957 assert(entry->in(0)->in(1)->in(1)->Opcode() == Op_Opaque1, "must be"); |
1172 | 1958 useful_predicates.push(entry->in(0)->in(1)->in(1)); // good one |
3345 | 1959 entry = entry->in(0)->in(0); |
1960 } | |
1961 predicate_proj = find_predicate(entry); // Predicate | |
1962 if (predicate_proj != NULL ) { | |
1963 useful_predicates.push(entry->in(0)->in(1)->in(1)); // good one | |
1172 | 1964 } |
1965 } | |
1966 | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1967 if (loop->_next) { // sibling |
1172 | 1968 collect_potentially_useful_predicates(loop->_next, useful_predicates); |
1969 } | |
1970 } | |
1971 | |
1972 //------------------------eliminate_useless_predicates----------------------------- | |
1973 // Eliminate all inserted predicates if they could not be used by loop predication. | |
3345 | 1974 // Note: it will also eliminates loop limits check predicate since it also uses |
1975 // Opaque1 node (see Parse::add_predicate()). | |
1172 | 1976 void PhaseIdealLoop::eliminate_useless_predicates() { |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1977 if (C->predicate_count() == 0) |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
1978 return; // no predicate left |
1172 | 1979 |
1980 Unique_Node_List useful_predicates; // to store useful predicates | |
1981 if (C->has_loops()) { | |
1982 collect_potentially_useful_predicates(_ltree_root->_child, useful_predicates); | |
1983 } | |
1984 | |
1985 for (int i = C->predicate_count(); i > 0; i--) { | |
1986 Node * n = C->predicate_opaque1_node(i-1); | |
1987 assert(n->Opcode() == Op_Opaque1, "must be"); | |
1988 if (!useful_predicates.member(n)) { // not in the useful list | |
1989 _igvn.replace_node(n, n->in(1)); | |
1990 } | |
1991 } | |
1992 } | |
1993 | |
8048
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
1994 //------------------------process_expensive_nodes----------------------------- |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
1995 // Expensive nodes have their control input set to prevent the GVN |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
1996 // from commoning them and as a result forcing the resulting node to |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
1997 // be in a more frequent path. Use CFG information here, to change the |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
1998 // control inputs so that some expensive nodes can be commoned while |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
1999 // not executed more frequently. |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2000 bool PhaseIdealLoop::process_expensive_nodes() { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2001 assert(OptimizeExpensiveOps, "optimization off?"); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2002 |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2003 // Sort nodes to bring similar nodes together |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2004 C->sort_expensive_nodes(); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2005 |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2006 bool progress = false; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2007 |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2008 for (int i = 0; i < C->expensive_count(); ) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2009 Node* n = C->expensive_node(i); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2010 int start = i; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2011 // Find nodes similar to n |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2012 i++; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2013 for (; i < C->expensive_count() && Compile::cmp_expensive_nodes(n, C->expensive_node(i)) == 0; i++); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2014 int end = i; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2015 // And compare them two by two |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2016 for (int j = start; j < end; j++) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2017 Node* n1 = C->expensive_node(j); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2018 if (is_node_unreachable(n1)) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2019 continue; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2020 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2021 for (int k = j+1; k < end; k++) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2022 Node* n2 = C->expensive_node(k); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2023 if (is_node_unreachable(n2)) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2024 continue; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2025 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2026 |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2027 assert(n1 != n2, "should be pair of nodes"); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2028 |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2029 Node* c1 = n1->in(0); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2030 Node* c2 = n2->in(0); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2031 |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2032 Node* parent_c1 = c1; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2033 Node* parent_c2 = c2; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2034 |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2035 // The call to get_early_ctrl_for_expensive() moves the |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2036 // expensive nodes up but stops at loops that are in a if |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2037 // branch. See whether we can exit the loop and move above the |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2038 // If. |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2039 if (c1->is_Loop()) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2040 parent_c1 = c1->in(1); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2041 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2042 if (c2->is_Loop()) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2043 parent_c2 = c2->in(1); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2044 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2045 |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2046 if (parent_c1 == parent_c2) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2047 _igvn._worklist.push(n1); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2048 _igvn._worklist.push(n2); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2049 continue; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2050 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2051 |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2052 // Look for identical expensive node up the dominator chain. |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2053 if (is_dominator(c1, c2)) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2054 c2 = c1; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2055 } else if (is_dominator(c2, c1)) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2056 c1 = c2; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2057 } else if (parent_c1->is_Proj() && parent_c1->in(0)->is_If() && |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2058 parent_c2->is_Proj() && parent_c1->in(0) == parent_c2->in(0)) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2059 // Both branches have the same expensive node so move it up |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2060 // before the if. |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2061 c1 = c2 = idom(parent_c1->in(0)); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2062 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2063 // Do the actual moves |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2064 if (n1->in(0) != c1) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2065 _igvn.hash_delete(n1); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2066 n1->set_req(0, c1); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2067 _igvn.hash_insert(n1); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2068 _igvn._worklist.push(n1); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2069 progress = true; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2070 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2071 if (n2->in(0) != c2) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2072 _igvn.hash_delete(n2); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2073 n2->set_req(0, c2); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2074 _igvn.hash_insert(n2); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2075 _igvn._worklist.push(n2); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2076 progress = true; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2077 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2078 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2079 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2080 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2081 |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2082 return progress; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2083 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2084 |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2085 |
0 | 2086 //============================================================================= |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2087 //----------------------------build_and_optimize------------------------------- |
0 | 2088 // Create a PhaseLoop. Build the ideal Loop tree. Map each Ideal Node to |
2089 // its corresponding LoopNode. If 'optimize' is true, do some loop cleanups. | |
4064
670a74b863fc
7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents:
3936
diff
changeset
|
2090 void PhaseIdealLoop::build_and_optimize(bool do_split_ifs, bool skip_loop_opts) { |
2248
194c9fdee631
7017240: C2: native memory leak in nsk/regression/b4675027 on windows-x86 in comp mode with G1
kvn
parents:
1972
diff
changeset
|
2091 ResourceMark rm; |
194c9fdee631
7017240: C2: native memory leak in nsk/regression/b4675027 on windows-x86 in comp mode with G1
kvn
parents:
1972
diff
changeset
|
2092 |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2093 int old_progress = C->major_progress(); |
2403 | 2094 uint orig_worklist_size = _igvn._worklist.size(); |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2095 |
0 | 2096 // Reset major-progress flag for the driver's heuristics |
2097 C->clear_major_progress(); | |
2098 | |
2099 #ifndef PRODUCT | |
2100 // Capture for later assert | |
2101 uint unique = C->unique(); | |
2102 _loop_invokes++; | |
2103 _loop_work += unique; | |
2104 #endif | |
2105 | |
2106 // True if the method has at least 1 irreducible loop | |
2107 _has_irreducible_loops = false; | |
2108 | |
2109 _created_loop_node = false; | |
2110 | |
2111 Arena *a = Thread::current()->resource_area(); | |
2112 VectorSet visited(a); | |
2113 // Pre-grow the mapping from Nodes to IdealLoopTrees. | |
2114 _nodes.map(C->unique(), NULL); | |
2115 memset(_nodes.adr(), 0, wordSize * C->unique()); | |
2116 | |
2117 // Pre-build the top-level outermost loop tree entry | |
2118 _ltree_root = new IdealLoopTree( this, C->root(), C->root() ); | |
2119 // Do not need a safepoint at the top level | |
2120 _ltree_root->_has_sfpt = 1; | |
2121 | |
2445 | 2122 // Initialize Dominators. |
2123 // Checked in clone_loop_predicate() during beautify_loops(). | |
2124 _idom_size = 0; | |
2125 _idom = NULL; | |
2126 _dom_depth = NULL; | |
2127 _dom_stk = NULL; | |
2128 | |
0 | 2129 // Empty pre-order array |
2130 allocate_preorders(); | |
2131 | |
2132 // Build a loop tree on the fly. Build a mapping from CFG nodes to | |
2133 // IdealLoopTree entries. Data nodes are NOT walked. | |
2134 build_loop_tree(); | |
2135 // Check for bailout, and return | |
2136 if (C->failing()) { | |
2137 return; | |
2138 } | |
2139 | |
2140 // No loops after all | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2141 if( !_ltree_root->_child && !_verify_only ) C->set_has_loops(false); |
0 | 2142 |
2143 // There should always be an outer loop containing the Root and Return nodes. | |
2144 // If not, we have a degenerate empty program. Bail out in this case. | |
2145 if (!has_node(C->root())) { | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2146 if (!_verify_only) { |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2147 C->clear_major_progress(); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2148 C->record_method_not_compilable("empty program detected during loop optimization"); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2149 } |
0 | 2150 return; |
2151 } | |
2152 | |
2153 // Nothing to do, so get out | |
8048
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2154 bool stop_early = !C->has_loops() && !skip_loop_opts && !do_split_ifs && !_verify_me && !_verify_only; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2155 bool do_expensive_nodes = C->should_optimize_expensive_nodes(_igvn); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2156 if (stop_early && !do_expensive_nodes) { |
0 | 2157 _igvn.optimize(); // Cleanup NeverBranches |
2158 return; | |
2159 } | |
2160 | |
2161 // Set loop nesting depth | |
2162 _ltree_root->set_nest( 0 ); | |
2163 | |
2164 // Split shared headers and insert loop landing pads. | |
2165 // Do not bother doing this on the Root loop of course. | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2166 if( !_verify_me && !_verify_only && _ltree_root->_child ) { |
10405 | 2167 C->print_method(PHASE_BEFORE_BEAUTIFY_LOOPS, 3); |
0 | 2168 if( _ltree_root->_child->beautify_loops( this ) ) { |
2169 // Re-build loop tree! | |
2170 _ltree_root->_child = NULL; | |
2171 _nodes.clear(); | |
2172 reallocate_preorders(); | |
2173 build_loop_tree(); | |
2174 // Check for bailout, and return | |
2175 if (C->failing()) { | |
2176 return; | |
2177 } | |
2178 // Reset loop nesting depth | |
2179 _ltree_root->set_nest( 0 ); | |
222 | 2180 |
10405 | 2181 C->print_method(PHASE_AFTER_BEAUTIFY_LOOPS, 3); |
0 | 2182 } |
2183 } | |
2184 | |
2185 // Build Dominators for elision of NULL checks & loop finding. | |
2186 // Since nodes do not have a slot for immediate dominator, make | |
605 | 2187 // a persistent side array for that info indexed on node->_idx. |
0 | 2188 _idom_size = C->unique(); |
2189 _idom = NEW_RESOURCE_ARRAY( Node*, _idom_size ); | |
2190 _dom_depth = NEW_RESOURCE_ARRAY( uint, _idom_size ); | |
2191 _dom_stk = NULL; // Allocated on demand in recompute_dom_depth | |
2192 memset( _dom_depth, 0, _idom_size * sizeof(uint) ); | |
2193 | |
2194 Dominators(); | |
2195 | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2196 if (!_verify_only) { |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2197 // As a side effect, Dominators removed any unreachable CFG paths |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2198 // into RegionNodes. It doesn't do this test against Root, so |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2199 // we do it here. |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2200 for( uint i = 1; i < C->root()->req(); i++ ) { |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2201 if( !_nodes[C->root()->in(i)->_idx] ) { // Dead path into Root? |
6144
5e990493719e
7173340: C2: code cleanup: use PhaseIterGVN::replace_edge(Node*, int, Node*) where applicable
kvn
parents:
4862
diff
changeset
|
2202 _igvn.delete_input_of(C->root(), i); |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2203 i--; // Rerun same iteration on compressed edges |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2204 } |
0 | 2205 } |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2206 |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2207 // Given dominators, try to find inner loops with calls that must |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2208 // always be executed (call dominates loop tail). These loops do |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2209 // not need a separate safepoint. |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2210 Node_List cisstack(a); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2211 _ltree_root->check_safepts(visited, cisstack); |
0 | 2212 } |
2213 | |
2214 // Walk the DATA nodes and place into loops. Find earliest control | |
2215 // node. For CFG nodes, the _nodes array starts out and remains | |
2216 // holding the associated IdealLoopTree pointer. For DATA nodes, the | |
2217 // _nodes array holds the earliest legal controlling CFG node. | |
2218 | |
2219 // Allocate stack with enough space to avoid frequent realloc | |
2220 int stack_size = (C->unique() >> 1) + 16; // (unique>>1)+16 from Java2D stats | |
2221 Node_Stack nstack( a, stack_size ); | |
2222 | |
2223 visited.Clear(); | |
2224 Node_List worklist(a); | |
2225 // Don't need C->root() on worklist since | |
2226 // it will be processed among C->top() inputs | |
2227 worklist.push( C->top() ); | |
2228 visited.set( C->top()->_idx ); // Set C->top() as visited now | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2229 build_loop_early( visited, worklist, nstack ); |
0 | 2230 |
2231 // Given early legal placement, try finding counted loops. This placement | |
2232 // is good enough to discover most loop invariants. | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2233 if( !_verify_me && !_verify_only ) |
0 | 2234 _ltree_root->counted_loop( this ); |
2235 | |
2236 // Find latest loop placement. Find ideal loop placement. | |
2237 visited.Clear(); | |
2238 init_dom_lca_tags(); | |
2239 // Need C->root() on worklist when processing outs | |
2240 worklist.push( C->root() ); | |
2241 NOT_PRODUCT( C->verify_graph_edges(); ) | |
2242 worklist.push( C->top() ); | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2243 build_loop_late( visited, worklist, nstack ); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2244 |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2245 if (_verify_only) { |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2246 // restore major progress flag |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2247 for (int i = 0; i < old_progress; i++) |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2248 C->set_major_progress(); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2249 assert(C->unique() == unique, "verification mode made Nodes? ? ?"); |
2403 | 2250 assert(_igvn._worklist.size() == orig_worklist_size, "shouldn't push anything"); |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2251 return; |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2252 } |
0 | 2253 |
8868
30f42e691e70
8004640: C2 assert failure in memnode.cpp: NULL+offs not RAW address
kvn
parents:
8048
diff
changeset
|
2254 // clear out the dead code after build_loop_late |
30f42e691e70
8004640: C2 assert failure in memnode.cpp: NULL+offs not RAW address
kvn
parents:
8048
diff
changeset
|
2255 while (_deadlist.size()) { |
30f42e691e70
8004640: C2 assert failure in memnode.cpp: NULL+offs not RAW address
kvn
parents:
8048
diff
changeset
|
2256 _igvn.remove_globally_dead_node(_deadlist.pop()); |
30f42e691e70
8004640: C2 assert failure in memnode.cpp: NULL+offs not RAW address
kvn
parents:
8048
diff
changeset
|
2257 } |
30f42e691e70
8004640: C2 assert failure in memnode.cpp: NULL+offs not RAW address
kvn
parents:
8048
diff
changeset
|
2258 |
8048
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2259 if (stop_early) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2260 assert(do_expensive_nodes, "why are we here?"); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2261 if (process_expensive_nodes()) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2262 // If we made some progress when processing expensive nodes then |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2263 // the IGVN may modify the graph in a way that will allow us to |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2264 // make some more progress: we need to try processing expensive |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2265 // nodes again. |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2266 C->set_major_progress(); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2267 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2268 _igvn.optimize(); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2269 return; |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2270 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2271 |
2445 | 2272 // Some parser-inserted loop predicates could never be used by loop |
2273 // predication or they were moved away from loop during some optimizations. | |
2274 // For example, peeling. Eliminate them before next loop optimizations. | |
3345 | 2275 if (UseLoopPredicate || LoopLimitCheck) { |
1172 | 2276 eliminate_useless_predicates(); |
2277 } | |
2278 | |
0 | 2279 #ifndef PRODUCT |
2280 C->verify_graph_edges(); | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
2281 if (_verify_me) { // Nested verify pass? |
0 | 2282 // Check to see if the verify mode is broken |
2283 assert(C->unique() == unique, "non-optimize mode made Nodes? ? ?"); | |
2284 return; | |
2285 } | |
2383
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
2286 if(VerifyLoopOptimizations) verify(); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
2287 if(TraceLoopOpts && C->has_loops()) { |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
2288 _ltree_root->dump(); |
9dc311b8473e
7008866: Missing loop predicate for loop with multiple entries
kvn
parents:
2248
diff
changeset
|
2289 } |
0 | 2290 #endif |
2291 | |
4064
670a74b863fc
7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents:
3936
diff
changeset
|
2292 if (skip_loop_opts) { |
670a74b863fc
7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents:
3936
diff
changeset
|
2293 // Cleanup any modified bits |
670a74b863fc
7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents:
3936
diff
changeset
|
2294 _igvn.optimize(); |
670a74b863fc
7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents:
3936
diff
changeset
|
2295 |
670a74b863fc
7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents:
3936
diff
changeset
|
2296 if (C->log() != NULL) { |
670a74b863fc
7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents:
3936
diff
changeset
|
2297 log_loop_tree(_ltree_root, _ltree_root, C->log()); |
670a74b863fc
7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents:
3936
diff
changeset
|
2298 } |
670a74b863fc
7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents:
3936
diff
changeset
|
2299 return; |
670a74b863fc
7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents:
3936
diff
changeset
|
2300 } |
670a74b863fc
7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents:
3936
diff
changeset
|
2301 |
0 | 2302 if (ReassociateInvariants) { |
2303 // Reassociate invariants and prep for split_thru_phi | |
2304 for (LoopTreeIterator iter(_ltree_root); !iter.done(); iter.next()) { | |
2305 IdealLoopTree* lpt = iter.current(); | |
2306 if (!lpt->is_counted() || !lpt->is_inner()) continue; | |
2307 | |
2308 lpt->reassociate_invariants(this); | |
2309 | |
2310 // Because RCE opportunities can be masked by split_thru_phi, | |
2311 // look for RCE candidates and inhibit split_thru_phi | |
2312 // on just their loop-phi's for this pass of loop opts | |
1172 | 2313 if (SplitIfBlocks && do_split_ifs) { |
0 | 2314 if (lpt->policy_range_check(this)) { |
39
76256d272075
6667612: (Escape Analysis) disable loop cloning if it has a scalar replaceable allocation
kvn
parents:
17
diff
changeset
|
2315 lpt->_rce_candidate = 1; // = true |
0 | 2316 } |
2317 } | |
2318 } | |
2319 } | |
2320 | |
2321 // Check for aggressive application of split-if and other transforms | |
2322 // that require basic-block info (like cloning through Phi's) | |
2323 if( SplitIfBlocks && do_split_ifs ) { | |
2324 visited.Clear(); | |
2325 split_if_with_blocks( visited, nstack ); | |
2326 NOT_PRODUCT( if( VerifyLoopOptimizations ) verify(); ); | |
2327 } | |
2328 | |
8048
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2329 if (!C->major_progress() && do_expensive_nodes && process_expensive_nodes()) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2330 C->set_major_progress(); |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2331 } |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
2332 |
1172 | 2333 // Perform loop predication before iteration splitting |
2445 | 2334 if (C->has_loops() && !C->major_progress() && (C->predicate_count() > 0)) { |
1172 | 2335 _ltree_root->_child->loop_predication(this); |
2336 } | |
2337 | |
1763 | 2338 if (OptimizeFill && UseLoopPredicate && C->has_loops() && !C->major_progress()) { |
2339 if (do_intrinsify_fill()) { | |
2340 C->set_major_progress(); | |
2341 } | |
2342 } | |
2343 | |
0 | 2344 // Perform iteration-splitting on inner loops. Split iterations to avoid |
2345 // range checks or one-shot null checks. | |
2346 | |
2347 // If split-if's didn't hack the graph too bad (no CFG changes) | |
2348 // then do loop opts. | |
1172 | 2349 if (C->has_loops() && !C->major_progress()) { |
0 | 2350 memset( worklist.adr(), 0, worklist.Size()*sizeof(Node*) ); |
2351 _ltree_root->_child->iteration_split( this, worklist ); | |
2352 // No verify after peeling! GCM has hoisted code out of the loop. | |
2353 // After peeling, the hoisted code could sink inside the peeled area. | |
2354 // The peeling code does not try to recompute the best location for | |
2355 // all the code before the peeled area, so the verify pass will always | |
2356 // complain about it. | |
2357 } | |
2358 // Do verify graph edges in any case | |
2359 NOT_PRODUCT( C->verify_graph_edges(); ); | |
2360 | |
1172 | 2361 if (!do_split_ifs) { |
0 | 2362 // We saw major progress in Split-If to get here. We forced a |
2363 // pass with unrolling and not split-if, however more split-if's | |
2364 // might make progress. If the unrolling didn't make progress | |
2365 // then the major-progress flag got cleared and we won't try | |
2366 // another round of Split-If. In particular the ever-common | |
2367 // instance-of/check-cast pattern requires at least 2 rounds of | |
2368 // Split-If to clear out. | |
2369 C->set_major_progress(); | |
2370 } | |
2371 | |
2372 // Repeat loop optimizations if new loops were seen | |
2373 if (created_loop_node()) { | |
2374 C->set_major_progress(); | |
2375 } | |
2376 | |
2445 | 2377 // Keep loop predicates and perform optimizations with them |
2378 // until no more loop optimizations could be done. | |
2379 // After that switch predicates off and do more loop optimizations. | |
2380 if (!C->major_progress() && (C->predicate_count() > 0)) { | |
2381 C->cleanup_loop_predicates(_igvn); | |
2382 #ifndef PRODUCT | |
2383 if (TraceLoopOpts) { | |
2384 tty->print_cr("PredicatesOff"); | |
2385 } | |
2386 #endif | |
2387 C->set_major_progress(); | |
2388 } | |
0 | 2389 |
2445 | 2390 // Convert scalar to superword operations at the end of all loop opts. |
0 | 2391 if (UseSuperWord && C->has_loops() && !C->major_progress()) { |
2392 // SuperWord transform | |
2393 SuperWord sw(this); | |
2394 for (LoopTreeIterator iter(_ltree_root); !iter.done(); iter.next()) { | |
2395 IdealLoopTree* lpt = iter.current(); | |
2396 if (lpt->is_counted()) { | |
2397 sw.transform_loop(lpt); | |
2398 } | |
2399 } | |
2400 } | |
2401 | |
2402 // Cleanup any modified bits | |
2403 _igvn.optimize(); | |
2404 | |
367
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
2405 // disable assert until issue with split_flow_path is resolved (6742111) |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
2406 // assert(!_has_irreducible_loops || C->parsed_irreducible_loop() || C->is_osr_compilation(), |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
2407 // "shouldn't introduce irreducible loops"); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
2408 |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
2409 if (C->log() != NULL) { |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
2410 log_loop_tree(_ltree_root, _ltree_root, C->log()); |
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
2411 } |
0 | 2412 } |
2413 | |
2414 #ifndef PRODUCT | |
2415 //------------------------------print_statistics------------------------------- | |
2416 int PhaseIdealLoop::_loop_invokes=0;// Count of PhaseIdealLoop invokes | |
2417 int PhaseIdealLoop::_loop_work=0; // Sum of PhaseIdealLoop x unique | |
2418 void PhaseIdealLoop::print_statistics() { | |
2419 tty->print_cr("PhaseIdealLoop=%d, sum _unique=%d", _loop_invokes, _loop_work); | |
2420 } | |
2421 | |
2422 //------------------------------verify----------------------------------------- | |
2423 // Build a verify-only PhaseIdealLoop, and see that it agrees with me. | |
2424 static int fail; // debug only, so its multi-thread dont care | |
2425 void PhaseIdealLoop::verify() const { | |
2426 int old_progress = C->major_progress(); | |
2427 ResourceMark rm; | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2428 PhaseIdealLoop loop_verify( _igvn, this ); |
0 | 2429 VectorSet visited(Thread::current()->resource_area()); |
2430 | |
2431 fail = 0; | |
2432 verify_compare( C->root(), &loop_verify, visited ); | |
2433 assert( fail == 0, "verify loops failed" ); | |
2434 // Verify loop structure is the same | |
2435 _ltree_root->verify_tree(loop_verify._ltree_root, NULL); | |
2436 // Reset major-progress. It was cleared by creating a verify version of | |
2437 // PhaseIdealLoop. | |
2438 for( int i=0; i<old_progress; i++ ) | |
2439 C->set_major_progress(); | |
2440 } | |
2441 | |
2442 //------------------------------verify_compare--------------------------------- | |
2443 // Make sure me and the given PhaseIdealLoop agree on key data structures | |
2444 void PhaseIdealLoop::verify_compare( Node *n, const PhaseIdealLoop *loop_verify, VectorSet &visited ) const { | |
2445 if( !n ) return; | |
2446 if( visited.test_set( n->_idx ) ) return; | |
2447 if( !_nodes[n->_idx] ) { // Unreachable | |
2448 assert( !loop_verify->_nodes[n->_idx], "both should be unreachable" ); | |
2449 return; | |
2450 } | |
2451 | |
2452 uint i; | |
2453 for( i = 0; i < n->req(); i++ ) | |
2454 verify_compare( n->in(i), loop_verify, visited ); | |
2455 | |
2456 // Check the '_nodes' block/loop structure | |
2457 i = n->_idx; | |
2458 if( has_ctrl(n) ) { // We have control; verify has loop or ctrl | |
2459 if( _nodes[i] != loop_verify->_nodes[i] && | |
2460 get_ctrl_no_update(n) != loop_verify->get_ctrl_no_update(n) ) { | |
2461 tty->print("Mismatched control setting for: "); | |
2462 n->dump(); | |
2463 if( fail++ > 10 ) return; | |
2464 Node *c = get_ctrl_no_update(n); | |
2465 tty->print("We have it as: "); | |
2466 if( c->in(0) ) c->dump(); | |
2467 else tty->print_cr("N%d",c->_idx); | |
2468 tty->print("Verify thinks: "); | |
2469 if( loop_verify->has_ctrl(n) ) | |
2470 loop_verify->get_ctrl_no_update(n)->dump(); | |
2471 else | |
2472 loop_verify->get_loop_idx(n)->dump(); | |
2473 tty->cr(); | |
2474 } | |
2475 } else { // We have a loop | |
2476 IdealLoopTree *us = get_loop_idx(n); | |
2477 if( loop_verify->has_ctrl(n) ) { | |
2478 tty->print("Mismatched loop setting for: "); | |
2479 n->dump(); | |
2480 if( fail++ > 10 ) return; | |
2481 tty->print("We have it as: "); | |
2482 us->dump(); | |
2483 tty->print("Verify thinks: "); | |
2484 loop_verify->get_ctrl_no_update(n)->dump(); | |
2485 tty->cr(); | |
2486 } else if (!C->major_progress()) { | |
2487 // Loop selection can be messed up if we did a major progress | |
2488 // operation, like split-if. Do not verify in that case. | |
2489 IdealLoopTree *them = loop_verify->get_loop_idx(n); | |
2490 if( us->_head != them->_head || us->_tail != them->_tail ) { | |
2491 tty->print("Unequals loops for: "); | |
2492 n->dump(); | |
2493 if( fail++ > 10 ) return; | |
2494 tty->print("We have it as: "); | |
2495 us->dump(); | |
2496 tty->print("Verify thinks: "); | |
2497 them->dump(); | |
2498 tty->cr(); | |
2499 } | |
2500 } | |
2501 } | |
2502 | |
2503 // Check for immediate dominators being equal | |
2504 if( i >= _idom_size ) { | |
2505 if( !n->is_CFG() ) return; | |
2506 tty->print("CFG Node with no idom: "); | |
2507 n->dump(); | |
2508 return; | |
2509 } | |
2510 if( !n->is_CFG() ) return; | |
2511 if( n == C->root() ) return; // No IDOM here | |
2512 | |
2513 assert(n->_idx == i, "sanity"); | |
2514 Node *id = idom_no_update(n); | |
2515 if( id != loop_verify->idom_no_update(n) ) { | |
2516 tty->print("Unequals idoms for: "); | |
2517 n->dump(); | |
2518 if( fail++ > 10 ) return; | |
2519 tty->print("We have it as: "); | |
2520 id->dump(); | |
2521 tty->print("Verify thinks: "); | |
2522 loop_verify->idom_no_update(n)->dump(); | |
2523 tty->cr(); | |
2524 } | |
2525 | |
2526 } | |
2527 | |
2528 //------------------------------verify_tree------------------------------------ | |
2529 // Verify that tree structures match. Because the CFG can change, siblings | |
2530 // within the loop tree can be reordered. We attempt to deal with that by | |
2531 // reordering the verify's loop tree if possible. | |
2532 void IdealLoopTree::verify_tree(IdealLoopTree *loop, const IdealLoopTree *parent) const { | |
2533 assert( _parent == parent, "Badly formed loop tree" ); | |
2534 | |
2535 // Siblings not in same order? Attempt to re-order. | |
2536 if( _head != loop->_head ) { | |
2537 // Find _next pointer to update | |
2538 IdealLoopTree **pp = &loop->_parent->_child; | |
2539 while( *pp != loop ) | |
2540 pp = &((*pp)->_next); | |
2541 // Find proper sibling to be next | |
2542 IdealLoopTree **nn = &loop->_next; | |
2543 while( (*nn) && (*nn)->_head != _head ) | |
2544 nn = &((*nn)->_next); | |
2545 | |
2546 // Check for no match. | |
2547 if( !(*nn) ) { | |
2548 // Annoyingly, irreducible loops can pick different headers | |
2549 // after a major_progress operation, so the rest of the loop | |
2550 // tree cannot be matched. | |
2551 if (_irreducible && Compile::current()->major_progress()) return; | |
2552 assert( 0, "failed to match loop tree" ); | |
2553 } | |
2554 | |
2555 // Move (*nn) to (*pp) | |
2556 IdealLoopTree *hit = *nn; | |
2557 *nn = hit->_next; | |
2558 hit->_next = loop; | |
2559 *pp = loop; | |
2560 loop = hit; | |
2561 // Now try again to verify | |
2562 } | |
2563 | |
2564 assert( _head == loop->_head , "mismatched loop head" ); | |
2565 Node *tail = _tail; // Inline a non-updating version of | |
2566 while( !tail->in(0) ) // the 'tail()' call. | |
2567 tail = tail->in(1); | |
2568 assert( tail == loop->_tail, "mismatched loop tail" ); | |
2569 | |
2570 // Counted loops that are guarded should be able to find their guards | |
2571 if( _head->is_CountedLoop() && _head->as_CountedLoop()->is_main_loop() ) { | |
2572 CountedLoopNode *cl = _head->as_CountedLoop(); | |
2573 Node *init = cl->init_trip(); | |
2574 Node *ctrl = cl->in(LoopNode::EntryControl); | |
2575 assert( ctrl->Opcode() == Op_IfTrue || ctrl->Opcode() == Op_IfFalse, "" ); | |
2576 Node *iff = ctrl->in(0); | |
2577 assert( iff->Opcode() == Op_If, "" ); | |
2578 Node *bol = iff->in(1); | |
2579 assert( bol->Opcode() == Op_Bool, "" ); | |
2580 Node *cmp = bol->in(1); | |
2581 assert( cmp->Opcode() == Op_CmpI, "" ); | |
2582 Node *add = cmp->in(1); | |
2583 Node *opaq; | |
2584 if( add->Opcode() == Op_Opaque1 ) { | |
2585 opaq = add; | |
2586 } else { | |
2587 assert( add->Opcode() == Op_AddI || add->Opcode() == Op_ConI , "" ); | |
2588 assert( add == init, "" ); | |
2589 opaq = cmp->in(2); | |
2590 } | |
2591 assert( opaq->Opcode() == Op_Opaque1, "" ); | |
2592 | |
2593 } | |
2594 | |
2595 if (_child != NULL) _child->verify_tree(loop->_child, this); | |
2596 if (_next != NULL) _next ->verify_tree(loop->_next, parent); | |
2597 // Innermost loops need to verify loop bodies, | |
2598 // but only if no 'major_progress' | |
2599 int fail = 0; | |
2600 if (!Compile::current()->major_progress() && _child == NULL) { | |
2601 for( uint i = 0; i < _body.size(); i++ ) { | |
2602 Node *n = _body.at(i); | |
2603 if (n->outcnt() == 0) continue; // Ignore dead | |
2604 uint j; | |
2605 for( j = 0; j < loop->_body.size(); j++ ) | |
2606 if( loop->_body.at(j) == n ) | |
2607 break; | |
2608 if( j == loop->_body.size() ) { // Not found in loop body | |
2609 // Last ditch effort to avoid assertion: Its possible that we | |
2610 // have some users (so outcnt not zero) but are still dead. | |
2611 // Try to find from root. | |
2612 if (Compile::current()->root()->find(n->_idx)) { | |
2613 fail++; | |
2614 tty->print("We have that verify does not: "); | |
2615 n->dump(); | |
2616 } | |
2617 } | |
2618 } | |
2619 for( uint i2 = 0; i2 < loop->_body.size(); i2++ ) { | |
2620 Node *n = loop->_body.at(i2); | |
2621 if (n->outcnt() == 0) continue; // Ignore dead | |
2622 uint j; | |
2623 for( j = 0; j < _body.size(); j++ ) | |
2624 if( _body.at(j) == n ) | |
2625 break; | |
2626 if( j == _body.size() ) { // Not found in loop body | |
2627 // Last ditch effort to avoid assertion: Its possible that we | |
2628 // have some users (so outcnt not zero) but are still dead. | |
2629 // Try to find from root. | |
2630 if (Compile::current()->root()->find(n->_idx)) { | |
2631 fail++; | |
2632 tty->print("Verify has that we do not: "); | |
2633 n->dump(); | |
2634 } | |
2635 } | |
2636 } | |
2637 assert( !fail, "loop body mismatch" ); | |
2638 } | |
2639 } | |
2640 | |
2641 #endif | |
2642 | |
2643 //------------------------------set_idom--------------------------------------- | |
2644 void PhaseIdealLoop::set_idom(Node* d, Node* n, uint dom_depth) { | |
2645 uint idx = d->_idx; | |
2646 if (idx >= _idom_size) { | |
2647 uint newsize = _idom_size<<1; | |
2648 while( idx >= newsize ) { | |
2649 newsize <<= 1; | |
2650 } | |
2651 _idom = REALLOC_RESOURCE_ARRAY( Node*, _idom,_idom_size,newsize); | |
2652 _dom_depth = REALLOC_RESOURCE_ARRAY( uint, _dom_depth,_idom_size,newsize); | |
2653 memset( _dom_depth + _idom_size, 0, (newsize - _idom_size) * sizeof(uint) ); | |
2654 _idom_size = newsize; | |
2655 } | |
2656 _idom[idx] = n; | |
2657 _dom_depth[idx] = dom_depth; | |
2658 } | |
2659 | |
2660 //------------------------------recompute_dom_depth--------------------------------------- | |
2661 // The dominator tree is constructed with only parent pointers. | |
2662 // This recomputes the depth in the tree by first tagging all | |
2663 // nodes as "no depth yet" marker. The next pass then runs up | |
2664 // the dom tree from each node marked "no depth yet", and computes | |
2665 // the depth on the way back down. | |
2666 void PhaseIdealLoop::recompute_dom_depth() { | |
2667 uint no_depth_marker = C->unique(); | |
2668 uint i; | |
2669 // Initialize depth to "no depth yet" | |
2670 for (i = 0; i < _idom_size; i++) { | |
2671 if (_dom_depth[i] > 0 && _idom[i] != NULL) { | |
2672 _dom_depth[i] = no_depth_marker; | |
2673 } | |
2674 } | |
2675 if (_dom_stk == NULL) { | |
2676 uint init_size = C->unique() / 100; // Guess that 1/100 is a reasonable initial size. | |
2677 if (init_size < 10) init_size = 10; | |
2248
194c9fdee631
7017240: C2: native memory leak in nsk/regression/b4675027 on windows-x86 in comp mode with G1
kvn
parents:
1972
diff
changeset
|
2678 _dom_stk = new GrowableArray<uint>(init_size); |
0 | 2679 } |
2680 // Compute new depth for each node. | |
2681 for (i = 0; i < _idom_size; i++) { | |
2682 uint j = i; | |
2683 // Run up the dom tree to find a node with a depth | |
2684 while (_dom_depth[j] == no_depth_marker) { | |
2685 _dom_stk->push(j); | |
2686 j = _idom[j]->_idx; | |
2687 } | |
2688 // Compute the depth on the way back down this tree branch | |
2689 uint dd = _dom_depth[j] + 1; | |
2690 while (_dom_stk->length() > 0) { | |
2691 uint j = _dom_stk->pop(); | |
2692 _dom_depth[j] = dd; | |
2693 dd++; | |
2694 } | |
2695 } | |
2696 } | |
2697 | |
2698 //------------------------------sort------------------------------------------- | |
2699 // Insert 'loop' into the existing loop tree. 'innermost' is a leaf of the | |
2700 // loop tree, not the root. | |
2701 IdealLoopTree *PhaseIdealLoop::sort( IdealLoopTree *loop, IdealLoopTree *innermost ) { | |
2702 if( !innermost ) return loop; // New innermost loop | |
2703 | |
2704 int loop_preorder = get_preorder(loop->_head); // Cache pre-order number | |
2705 assert( loop_preorder, "not yet post-walked loop" ); | |
2706 IdealLoopTree **pp = &innermost; // Pointer to previous next-pointer | |
2707 IdealLoopTree *l = *pp; // Do I go before or after 'l'? | |
2708 | |
2709 // Insert at start of list | |
2710 while( l ) { // Insertion sort based on pre-order | |
2711 if( l == loop ) return innermost; // Already on list! | |
2712 int l_preorder = get_preorder(l->_head); // Cache pre-order number | |
2713 assert( l_preorder, "not yet post-walked l" ); | |
2714 // Check header pre-order number to figure proper nesting | |
2715 if( loop_preorder > l_preorder ) | |
2716 break; // End of insertion | |
2717 // If headers tie (e.g., shared headers) check tail pre-order numbers. | |
2718 // Since I split shared headers, you'd think this could not happen. | |
2719 // BUT: I must first do the preorder numbering before I can discover I | |
2720 // have shared headers, so the split headers all get the same preorder | |
2721 // number as the RegionNode they split from. | |
2722 if( loop_preorder == l_preorder && | |
2723 get_preorder(loop->_tail) < get_preorder(l->_tail) ) | |
2724 break; // Also check for shared headers (same pre#) | |
2725 pp = &l->_parent; // Chain up list | |
2726 l = *pp; | |
2727 } | |
2728 // Link into list | |
2729 // Point predecessor to me | |
2730 *pp = loop; | |
2731 // Point me to successor | |
2732 IdealLoopTree *p = loop->_parent; | |
2733 loop->_parent = l; // Point me to successor | |
2734 if( p ) sort( p, innermost ); // Insert my parents into list as well | |
2735 return innermost; | |
2736 } | |
2737 | |
2738 //------------------------------build_loop_tree-------------------------------- | |
2739 // I use a modified Vick/Tarjan algorithm. I need pre- and a post- visit | |
2740 // bits. The _nodes[] array is mapped by Node index and holds a NULL for | |
2741 // not-yet-pre-walked, pre-order # for pre-but-not-post-walked and holds the | |
2742 // tightest enclosing IdealLoopTree for post-walked. | |
2743 // | |
2744 // During my forward walk I do a short 1-layer lookahead to see if I can find | |
2745 // a loop backedge with that doesn't have any work on the backedge. This | |
2746 // helps me construct nested loops with shared headers better. | |
2747 // | |
2748 // Once I've done the forward recursion, I do the post-work. For each child | |
2749 // I check to see if there is a backedge. Backedges define a loop! I | |
2750 // insert an IdealLoopTree at the target of the backedge. | |
2751 // | |
2752 // During the post-work I also check to see if I have several children | |
2753 // belonging to different loops. If so, then this Node is a decision point | |
2754 // where control flow can choose to change loop nests. It is at this | |
2755 // decision point where I can figure out how loops are nested. At this | |
2756 // time I can properly order the different loop nests from my children. | |
2757 // Note that there may not be any backedges at the decision point! | |
2758 // | |
2759 // Since the decision point can be far removed from the backedges, I can't | |
2760 // order my loops at the time I discover them. Thus at the decision point | |
2761 // I need to inspect loop header pre-order numbers to properly nest my | |
2762 // loops. This means I need to sort my childrens' loops by pre-order. | |
2763 // The sort is of size number-of-control-children, which generally limits | |
2764 // it to size 2 (i.e., I just choose between my 2 target loops). | |
2765 void PhaseIdealLoop::build_loop_tree() { | |
2766 // Allocate stack of size C->unique()/2 to avoid frequent realloc | |
2767 GrowableArray <Node *> bltstack(C->unique() >> 1); | |
2768 Node *n = C->root(); | |
2769 bltstack.push(n); | |
2770 int pre_order = 1; | |
2771 int stack_size; | |
2772 | |
2773 while ( ( stack_size = bltstack.length() ) != 0 ) { | |
2774 n = bltstack.top(); // Leave node on stack | |
2775 if ( !is_visited(n) ) { | |
2776 // ---- Pre-pass Work ---- | |
2777 // Pre-walked but not post-walked nodes need a pre_order number. | |
2778 | |
2779 set_preorder_visited( n, pre_order ); // set as visited | |
2780 | |
2781 // ---- Scan over children ---- | |
2782 // Scan first over control projections that lead to loop headers. | |
2783 // This helps us find inner-to-outer loops with shared headers better. | |
2784 | |
2785 // Scan children's children for loop headers. | |
2786 for ( int i = n->outcnt() - 1; i >= 0; --i ) { | |
2787 Node* m = n->raw_out(i); // Child | |
2788 if( m->is_CFG() && !is_visited(m) ) { // Only for CFG children | |
2789 // Scan over children's children to find loop | |
2790 for (DUIterator_Fast jmax, j = m->fast_outs(jmax); j < jmax; j++) { | |
2791 Node* l = m->fast_out(j); | |
2792 if( is_visited(l) && // Been visited? | |
2793 !is_postvisited(l) && // But not post-visited | |
2794 get_preorder(l) < pre_order ) { // And smaller pre-order | |
2795 // Found! Scan the DFS down this path before doing other paths | |
2796 bltstack.push(m); | |
2797 break; | |
2798 } | |
2799 } | |
2800 } | |
2801 } | |
2802 pre_order++; | |
2803 } | |
2804 else if ( !is_postvisited(n) ) { | |
2805 // Note: build_loop_tree_impl() adds out edges on rare occasions, | |
2806 // such as com.sun.rsasign.am::a. | |
2807 // For non-recursive version, first, process current children. | |
2808 // On next iteration, check if additional children were added. | |
2809 for ( int k = n->outcnt() - 1; k >= 0; --k ) { | |
2810 Node* u = n->raw_out(k); | |
2811 if ( u->is_CFG() && !is_visited(u) ) { | |
2812 bltstack.push(u); | |
2813 } | |
2814 } | |
2815 if ( bltstack.length() == stack_size ) { | |
2816 // There were no additional children, post visit node now | |
2817 (void)bltstack.pop(); // Remove node from stack | |
2818 pre_order = build_loop_tree_impl( n, pre_order ); | |
2819 // Check for bailout | |
2820 if (C->failing()) { | |
2821 return; | |
2822 } | |
2823 // Check to grow _preorders[] array for the case when | |
2824 // build_loop_tree_impl() adds new nodes. | |
2825 check_grow_preorders(); | |
2826 } | |
2827 } | |
2828 else { | |
2829 (void)bltstack.pop(); // Remove post-visited node from stack | |
2830 } | |
2831 } | |
2832 } | |
2833 | |
2834 //------------------------------build_loop_tree_impl--------------------------- | |
2835 int PhaseIdealLoop::build_loop_tree_impl( Node *n, int pre_order ) { | |
2836 // ---- Post-pass Work ---- | |
2837 // Pre-walked but not post-walked nodes need a pre_order number. | |
2838 | |
2839 // Tightest enclosing loop for this Node | |
2840 IdealLoopTree *innermost = NULL; | |
2841 | |
2842 // For all children, see if any edge is a backedge. If so, make a loop | |
2843 // for it. Then find the tightest enclosing loop for the self Node. | |
2844 for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) { | |
2845 Node* m = n->fast_out(i); // Child | |
2846 if( n == m ) continue; // Ignore control self-cycles | |
2847 if( !m->is_CFG() ) continue;// Ignore non-CFG edges | |
2848 | |
2849 IdealLoopTree *l; // Child's loop | |
2850 if( !is_postvisited(m) ) { // Child visited but not post-visited? | |
2851 // Found a backedge | |
2852 assert( get_preorder(m) < pre_order, "should be backedge" ); | |
2853 // Check for the RootNode, which is already a LoopNode and is allowed | |
2854 // to have multiple "backedges". | |
2855 if( m == C->root()) { // Found the root? | |
2856 l = _ltree_root; // Root is the outermost LoopNode | |
2857 } else { // Else found a nested loop | |
2858 // Insert a LoopNode to mark this loop. | |
2859 l = new IdealLoopTree(this, m, n); | |
2860 } // End of Else found a nested loop | |
2861 if( !has_loop(m) ) // If 'm' does not already have a loop set | |
2862 set_loop(m, l); // Set loop header to loop now | |
2863 | |
2864 } else { // Else not a nested loop | |
2865 if( !_nodes[m->_idx] ) continue; // Dead code has no loop | |
2866 l = get_loop(m); // Get previously determined loop | |
2867 // If successor is header of a loop (nest), move up-loop till it | |
2868 // is a member of some outer enclosing loop. Since there are no | |
2869 // shared headers (I've split them already) I only need to go up | |
2870 // at most 1 level. | |
2871 while( l && l->_head == m ) // Successor heads loop? | |
2872 l = l->_parent; // Move up 1 for me | |
2873 // If this loop is not properly parented, then this loop | |
2874 // has no exit path out, i.e. its an infinite loop. | |
2875 if( !l ) { | |
2876 // Make loop "reachable" from root so the CFG is reachable. Basically | |
2877 // insert a bogus loop exit that is never taken. 'm', the loop head, | |
2878 // points to 'n', one (of possibly many) fall-in paths. There may be | |
2879 // many backedges as well. | |
2880 | |
2881 // Here I set the loop to be the root loop. I could have, after | |
2882 // inserting a bogus loop exit, restarted the recursion and found my | |
2883 // new loop exit. This would make the infinite loop a first-class | |
2884 // loop and it would then get properly optimized. What's the use of | |
2885 // optimizing an infinite loop? | |
2886 l = _ltree_root; // Oops, found infinite loop | |
2887 | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2888 if (!_verify_only) { |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2889 // Insert the NeverBranch between 'm' and it's control user. |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
2890 NeverBranchNode *iff = new (C) NeverBranchNode( m ); |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2891 _igvn.register_new_node_with_optimizer(iff); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2892 set_loop(iff, l); |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
2893 Node *if_t = new (C) CProjNode( iff, 0 ); |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2894 _igvn.register_new_node_with_optimizer(if_t); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2895 set_loop(if_t, l); |
0 | 2896 |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2897 Node* cfg = NULL; // Find the One True Control User of m |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2898 for (DUIterator_Fast jmax, j = m->fast_outs(jmax); j < jmax; j++) { |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2899 Node* x = m->fast_out(j); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2900 if (x->is_CFG() && x != m && x != iff) |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2901 { cfg = x; break; } |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2902 } |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2903 assert(cfg != NULL, "must find the control user of m"); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2904 uint k = 0; // Probably cfg->in(0) |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2905 while( cfg->in(k) != m ) k++; // But check incase cfg is a Region |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2906 cfg->set_req( k, if_t ); // Now point to NeverBranch |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2907 |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2908 // Now create the never-taken loop exit |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
2909 Node *if_f = new (C) CProjNode( iff, 1 ); |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2910 _igvn.register_new_node_with_optimizer(if_f); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2911 set_loop(if_f, l); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2912 // Find frame ptr for Halt. Relies on the optimizer |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2913 // V-N'ing. Easier and quicker than searching through |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2914 // the program structure. |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
2915 Node *frame = new (C) ParmNode( C->start(), TypeFunc::FramePtr ); |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2916 _igvn.register_new_node_with_optimizer(frame); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2917 // Halt & Catch Fire |
6804
e626685e9f6c
7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents:
6636
diff
changeset
|
2918 Node *halt = new (C) HaltNode( if_f, frame ); |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2919 _igvn.register_new_node_with_optimizer(halt); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2920 set_loop(halt, l); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2921 C->root()->add_req(halt); |
0 | 2922 } |
2923 set_loop(C->root(), _ltree_root); | |
2924 } | |
2925 } | |
2926 // Weeny check for irreducible. This child was already visited (this | |
2927 // IS the post-work phase). Is this child's loop header post-visited | |
2928 // as well? If so, then I found another entry into the loop. | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2929 if (!_verify_only) { |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2930 while( is_postvisited(l->_head) ) { |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2931 // found irreducible |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2932 l->_irreducible = 1; // = true |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2933 l = l->_parent; |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2934 _has_irreducible_loops = true; |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2935 // Check for bad CFG here to prevent crash, and bailout of compile |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2936 if (l == NULL) { |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2937 C->record_method_not_compilable("unhandled CFG detected during loop optimization"); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2938 return pre_order; |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
2939 } |
0 | 2940 } |
2941 } | |
2942 | |
2943 // This Node might be a decision point for loops. It is only if | |
2944 // it's children belong to several different loops. The sort call | |
2945 // does a trivial amount of work if there is only 1 child or all | |
2946 // children belong to the same loop. If however, the children | |
2947 // belong to different loops, the sort call will properly set the | |
2948 // _parent pointers to show how the loops nest. | |
2949 // | |
2950 // In any case, it returns the tightest enclosing loop. | |
2951 innermost = sort( l, innermost ); | |
2952 } | |
2953 | |
2954 // Def-use info will have some dead stuff; dead stuff will have no | |
2955 // loop decided on. | |
2956 | |
2957 // Am I a loop header? If so fix up my parent's child and next ptrs. | |
2958 if( innermost && innermost->_head == n ) { | |
2959 assert( get_loop(n) == innermost, "" ); | |
2960 IdealLoopTree *p = innermost->_parent; | |
2961 IdealLoopTree *l = innermost; | |
2962 while( p && l->_head == n ) { | |
2963 l->_next = p->_child; // Put self on parents 'next child' | |
2964 p->_child = l; // Make self as first child of parent | |
2965 l = p; // Now walk up the parent chain | |
2966 p = l->_parent; | |
2967 } | |
2968 } else { | |
2969 // Note that it is possible for a LoopNode to reach here, if the | |
2970 // backedge has been made unreachable (hence the LoopNode no longer | |
2971 // denotes a Loop, and will eventually be removed). | |
2972 | |
2973 // Record tightest enclosing loop for self. Mark as post-visited. | |
2974 set_loop(n, innermost); | |
2975 // Also record has_call flag early on | |
2976 if( innermost ) { | |
2977 if( n->is_Call() && !n->is_CallLeaf() && !n->is_macro() ) { | |
2978 // Do not count uncommon calls | |
2979 if( !n->is_CallStaticJava() || !n->as_CallStaticJava()->_name ) { | |
2980 Node *iff = n->in(0)->in(0); | |
6179
8c92982cbbc4
7119644: Increase superword's vector size up to 256 bits
kvn
parents:
6144
diff
changeset
|
2981 // No any calls for vectorized loops. |
8c92982cbbc4
7119644: Increase superword's vector size up to 256 bits
kvn
parents:
6144
diff
changeset
|
2982 if( UseSuperWord || !iff->is_If() || |
0 | 2983 (n->in(0)->Opcode() == Op_IfFalse && |
2984 (1.0 - iff->as_If()->_prob) >= 0.01) || | |
2985 (iff->as_If()->_prob >= 0.01) ) | |
2986 innermost->_has_call = 1; | |
2987 } | |
39
76256d272075
6667612: (Escape Analysis) disable loop cloning if it has a scalar replaceable allocation
kvn
parents:
17
diff
changeset
|
2988 } else if( n->is_Allocate() && n->as_Allocate()->_is_scalar_replaceable ) { |
76256d272075
6667612: (Escape Analysis) disable loop cloning if it has a scalar replaceable allocation
kvn
parents:
17
diff
changeset
|
2989 // Disable loop optimizations if the loop has a scalar replaceable |
76256d272075
6667612: (Escape Analysis) disable loop cloning if it has a scalar replaceable allocation
kvn
parents:
17
diff
changeset
|
2990 // allocation. This disabling may cause a potential performance lost |
76256d272075
6667612: (Escape Analysis) disable loop cloning if it has a scalar replaceable allocation
kvn
parents:
17
diff
changeset
|
2991 // if the allocation is not eliminated for some reason. |
76256d272075
6667612: (Escape Analysis) disable loop cloning if it has a scalar replaceable allocation
kvn
parents:
17
diff
changeset
|
2992 innermost->_allow_optimizations = false; |
76256d272075
6667612: (Escape Analysis) disable loop cloning if it has a scalar replaceable allocation
kvn
parents:
17
diff
changeset
|
2993 innermost->_has_call = 1; // = true |
6636 | 2994 } else if (n->Opcode() == Op_SafePoint) { |
2995 // Record all safepoints in this loop. | |
2996 if (innermost->_safepts == NULL) innermost->_safepts = new Node_List(); | |
2997 innermost->_safepts->push(n); | |
0 | 2998 } |
2999 } | |
3000 } | |
3001 | |
3002 // Flag as post-visited now | |
3003 set_postvisited(n); | |
3004 return pre_order; | |
3005 } | |
3006 | |
3007 | |
3008 //------------------------------build_loop_early------------------------------- | |
3009 // Put Data nodes into some loop nest, by setting the _nodes[]->loop mapping. | |
3010 // First pass computes the earliest controlling node possible. This is the | |
3011 // controlling input with the deepest dominating depth. | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3012 void PhaseIdealLoop::build_loop_early( VectorSet &visited, Node_List &worklist, Node_Stack &nstack ) { |
0 | 3013 while (worklist.size() != 0) { |
3014 // Use local variables nstack_top_n & nstack_top_i to cache values | |
3015 // on nstack's top. | |
3016 Node *nstack_top_n = worklist.pop(); | |
3017 uint nstack_top_i = 0; | |
3018 //while_nstack_nonempty: | |
3019 while (true) { | |
3020 // Get parent node and next input's index from stack's top. | |
3021 Node *n = nstack_top_n; | |
3022 uint i = nstack_top_i; | |
3023 uint cnt = n->req(); // Count of inputs | |
3024 if (i == 0) { // Pre-process the node. | |
3025 if( has_node(n) && // Have either loop or control already? | |
3026 !has_ctrl(n) ) { // Have loop picked out already? | |
3027 // During "merge_many_backedges" we fold up several nested loops | |
3028 // into a single loop. This makes the members of the original | |
3029 // loop bodies pointing to dead loops; they need to move up | |
3030 // to the new UNION'd larger loop. I set the _head field of these | |
3031 // dead loops to NULL and the _parent field points to the owning | |
3032 // loop. Shades of UNION-FIND algorithm. | |
3033 IdealLoopTree *ilt; | |
3034 while( !(ilt = get_loop(n))->_head ) { | |
3035 // Normally I would use a set_loop here. But in this one special | |
3036 // case, it is legal (and expected) to change what loop a Node | |
3037 // belongs to. | |
3038 _nodes.map(n->_idx, (Node*)(ilt->_parent) ); | |
3039 } | |
3040 // Remove safepoints ONLY if I've already seen I don't need one. | |
3041 // (the old code here would yank a 2nd safepoint after seeing a | |
3042 // first one, even though the 1st did not dominate in the loop body | |
3043 // and thus could be avoided indefinitely) | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3044 if( !_verify_only && !_verify_me && ilt->_has_sfpt && n->Opcode() == Op_SafePoint && |
0 | 3045 is_deleteable_safept(n)) { |
3046 Node *in = n->in(TypeFunc::Control); | |
3047 lazy_replace(n,in); // Pull safepoint now | |
6636 | 3048 if (ilt->_safepts != NULL) { |
3049 ilt->_safepts->yank(n); | |
3050 } | |
0 | 3051 // Carry on with the recursion "as if" we are walking |
3052 // only the control input | |
3053 if( !visited.test_set( in->_idx ) ) { | |
3054 worklist.push(in); // Visit this guy later, using worklist | |
3055 } | |
3056 // Get next node from nstack: | |
3057 // - skip n's inputs processing by setting i > cnt; | |
3058 // - we also will not call set_early_ctrl(n) since | |
3059 // has_node(n) == true (see the condition above). | |
3060 i = cnt + 1; | |
3061 } | |
3062 } | |
3063 } // if (i == 0) | |
3064 | |
3065 // Visit all inputs | |
3066 bool done = true; // Assume all n's inputs will be processed | |
3067 while (i < cnt) { | |
3068 Node *in = n->in(i); | |
3069 ++i; | |
3070 if (in == NULL) continue; | |
3071 if (in->pinned() && !in->is_CFG()) | |
3072 set_ctrl(in, in->in(0)); | |
3073 int is_visited = visited.test_set( in->_idx ); | |
3074 if (!has_node(in)) { // No controlling input yet? | |
3075 assert( !in->is_CFG(), "CFG Node with no controlling input?" ); | |
3076 assert( !is_visited, "visit only once" ); | |
3077 nstack.push(n, i); // Save parent node and next input's index. | |
3078 nstack_top_n = in; // Process current input now. | |
3079 nstack_top_i = 0; | |
3080 done = false; // Not all n's inputs processed. | |
3081 break; // continue while_nstack_nonempty; | |
3082 } else if (!is_visited) { | |
3083 // This guy has a location picked out for him, but has not yet | |
3084 // been visited. Happens to all CFG nodes, for instance. | |
3085 // Visit him using the worklist instead of recursion, to break | |
3086 // cycles. Since he has a location already we do not need to | |
3087 // find his location before proceeding with the current Node. | |
3088 worklist.push(in); // Visit this guy later, using worklist | |
3089 } | |
3090 } | |
3091 if (done) { | |
3092 // All of n's inputs have been processed, complete post-processing. | |
3093 | |
605 | 3094 // Compute earliest point this Node can go. |
0 | 3095 // CFG, Phi, pinned nodes already know their controlling input. |
3096 if (!has_node(n)) { | |
3097 // Record earliest legal location | |
3098 set_early_ctrl( n ); | |
3099 } | |
3100 if (nstack.is_empty()) { | |
3101 // Finished all nodes on stack. | |
3102 // Process next node on the worklist. | |
3103 break; | |
3104 } | |
3105 // Get saved parent node and next input's index. | |
3106 nstack_top_n = nstack.node(); | |
3107 nstack_top_i = nstack.index(); | |
3108 nstack.pop(); | |
3109 } | |
3110 } // while (true) | |
3111 } | |
3112 } | |
3113 | |
3114 //------------------------------dom_lca_internal-------------------------------- | |
3115 // Pair-wise LCA | |
3116 Node *PhaseIdealLoop::dom_lca_internal( Node *n1, Node *n2 ) const { | |
3117 if( !n1 ) return n2; // Handle NULL original LCA | |
3118 assert( n1->is_CFG(), "" ); | |
3119 assert( n2->is_CFG(), "" ); | |
3120 // find LCA of all uses | |
3121 uint d1 = dom_depth(n1); | |
3122 uint d2 = dom_depth(n2); | |
3123 while (n1 != n2) { | |
3124 if (d1 > d2) { | |
3125 n1 = idom(n1); | |
3126 d1 = dom_depth(n1); | |
3127 } else if (d1 < d2) { | |
3128 n2 = idom(n2); | |
3129 d2 = dom_depth(n2); | |
3130 } else { | |
3131 // Here d1 == d2. Due to edits of the dominator-tree, sections | |
3132 // of the tree might have the same depth. These sections have | |
3133 // to be searched more carefully. | |
3134 | |
3135 // Scan up all the n1's with equal depth, looking for n2. | |
3136 Node *t1 = idom(n1); | |
3137 while (dom_depth(t1) == d1) { | |
3138 if (t1 == n2) return n2; | |
3139 t1 = idom(t1); | |
3140 } | |
3141 // Scan up all the n2's with equal depth, looking for n1. | |
3142 Node *t2 = idom(n2); | |
3143 while (dom_depth(t2) == d2) { | |
3144 if (t2 == n1) return n1; | |
3145 t2 = idom(t2); | |
3146 } | |
3147 // Move up to a new dominator-depth value as well as up the dom-tree. | |
3148 n1 = t1; | |
3149 n2 = t2; | |
3150 d1 = dom_depth(n1); | |
3151 d2 = dom_depth(n2); | |
3152 } | |
3153 } | |
3154 return n1; | |
3155 } | |
3156 | |
3157 //------------------------------compute_idom----------------------------------- | |
3158 // Locally compute IDOM using dom_lca call. Correct only if the incoming | |
3159 // IDOMs are correct. | |
3160 Node *PhaseIdealLoop::compute_idom( Node *region ) const { | |
3161 assert( region->is_Region(), "" ); | |
3162 Node *LCA = NULL; | |
3163 for( uint i = 1; i < region->req(); i++ ) { | |
3164 if( region->in(i) != C->top() ) | |
3165 LCA = dom_lca( LCA, region->in(i) ); | |
3166 } | |
3167 return LCA; | |
3168 } | |
3169 | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3170 bool PhaseIdealLoop::verify_dominance(Node* n, Node* use, Node* LCA, Node* early) { |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3171 bool had_error = false; |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3172 #ifdef ASSERT |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3173 if (early != C->root()) { |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3174 // Make sure that there's a dominance path from use to LCA |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3175 Node* d = use; |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3176 while (d != LCA) { |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3177 d = idom(d); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3178 if (d == C->root()) { |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3179 tty->print_cr("*** Use %d isn't dominated by def %s", use->_idx, n->_idx); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3180 n->dump(); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3181 use->dump(); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3182 had_error = true; |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3183 break; |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3184 } |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3185 } |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3186 } |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3187 #endif |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3188 return had_error; |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3189 } |
0 | 3190 |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3191 |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3192 Node* PhaseIdealLoop::compute_lca_of_uses(Node* n, Node* early, bool verify) { |
0 | 3193 // Compute LCA over list of uses |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3194 bool had_error = false; |
0 | 3195 Node *LCA = NULL; |
3196 for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax && LCA != early; i++) { | |
3197 Node* c = n->fast_out(i); | |
3198 if (_nodes[c->_idx] == NULL) | |
3199 continue; // Skip the occasional dead node | |
3200 if( c->is_Phi() ) { // For Phis, we must land above on the path | |
3201 for( uint j=1; j<c->req(); j++ ) {// For all inputs | |
3202 if( c->in(j) == n ) { // Found matching input? | |
3203 Node *use = c->in(0)->in(j); | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3204 if (_verify_only && use->is_top()) continue; |
0 | 3205 LCA = dom_lca_for_get_late_ctrl( LCA, use, n ); |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3206 if (verify) had_error = verify_dominance(n, use, LCA, early) || had_error; |
0 | 3207 } |
3208 } | |
3209 } else { | |
3210 // For CFG data-users, use is in the block just prior | |
3211 Node *use = has_ctrl(c) ? get_ctrl(c) : c->in(0); | |
3212 LCA = dom_lca_for_get_late_ctrl( LCA, use, n ); | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3213 if (verify) had_error = verify_dominance(n, use, LCA, early) || had_error; |
0 | 3214 } |
3215 } | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3216 assert(!had_error, "bad dominance"); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3217 return LCA; |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3218 } |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3219 |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3220 //------------------------------get_late_ctrl---------------------------------- |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3221 // Compute latest legal control. |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3222 Node *PhaseIdealLoop::get_late_ctrl( Node *n, Node *early ) { |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3223 assert(early != NULL, "early control should not be NULL"); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3224 |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3225 Node* LCA = compute_lca_of_uses(n, early); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3226 #ifdef ASSERT |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3227 if (LCA == C->root() && LCA != early) { |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3228 // def doesn't dominate uses so print some useful debugging output |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3229 compute_lca_of_uses(n, early, true); |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3230 } |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3231 #endif |
0 | 3232 |
3233 // if this is a load, check for anti-dependent stores | |
3234 // We use a conservative algorithm to identify potential interfering | |
3235 // instructions and for rescheduling the load. The users of the memory | |
3236 // input of this load are examined. Any use which is not a load and is | |
3237 // dominated by early is considered a potentially interfering store. | |
3238 // This can produce false positives. | |
3239 if (n->is_Load() && LCA != early) { | |
3240 Node_List worklist; | |
3241 | |
3242 Node *mem = n->in(MemNode::Memory); | |
3243 for (DUIterator_Fast imax, i = mem->fast_outs(imax); i < imax; i++) { | |
3244 Node* s = mem->fast_out(i); | |
3245 worklist.push(s); | |
3246 } | |
3247 while(worklist.size() != 0 && LCA != early) { | |
3248 Node* s = worklist.pop(); | |
3249 if (s->is_Load()) { | |
3250 continue; | |
3251 } else if (s->is_MergeMem()) { | |
3252 for (DUIterator_Fast imax, i = s->fast_outs(imax); i < imax; i++) { | |
3253 Node* s1 = s->fast_out(i); | |
3254 worklist.push(s1); | |
3255 } | |
3256 } else { | |
3257 Node *sctrl = has_ctrl(s) ? get_ctrl(s) : s->in(0); | |
3258 assert(sctrl != NULL || s->outcnt() == 0, "must have control"); | |
3259 if (sctrl != NULL && !sctrl->is_top() && is_dominator(early, sctrl)) { | |
3260 LCA = dom_lca_for_get_late_ctrl(LCA, sctrl, n); | |
3261 } | |
3262 } | |
3263 } | |
3264 } | |
3265 | |
3266 assert(LCA == find_non_split_ctrl(LCA), "unexpected late control"); | |
3267 return LCA; | |
3268 } | |
3269 | |
3270 // true if CFG node d dominates CFG node n | |
3271 bool PhaseIdealLoop::is_dominator(Node *d, Node *n) { | |
3272 if (d == n) | |
3273 return true; | |
3274 assert(d->is_CFG() && n->is_CFG(), "must have CFG nodes"); | |
3275 uint dd = dom_depth(d); | |
3276 while (dom_depth(n) >= dd) { | |
3277 if (n == d) | |
3278 return true; | |
3279 n = idom(n); | |
3280 } | |
3281 return false; | |
3282 } | |
3283 | |
3284 //------------------------------dom_lca_for_get_late_ctrl_internal------------- | |
3285 // Pair-wise LCA with tags. | |
3286 // Tag each index with the node 'tag' currently being processed | |
3287 // before advancing up the dominator chain using idom(). | |
3288 // Later calls that find a match to 'tag' know that this path has already | |
3289 // been considered in the current LCA (which is input 'n1' by convention). | |
3290 // Since get_late_ctrl() is only called once for each node, the tag array | |
3291 // does not need to be cleared between calls to get_late_ctrl(). | |
3292 // Algorithm trades a larger constant factor for better asymptotic behavior | |
3293 // | |
3294 Node *PhaseIdealLoop::dom_lca_for_get_late_ctrl_internal( Node *n1, Node *n2, Node *tag ) { | |
3295 uint d1 = dom_depth(n1); | |
3296 uint d2 = dom_depth(n2); | |
3297 | |
3298 do { | |
3299 if (d1 > d2) { | |
3300 // current lca is deeper than n2 | |
3301 _dom_lca_tags.map(n1->_idx, tag); | |
3302 n1 = idom(n1); | |
3303 d1 = dom_depth(n1); | |
3304 } else if (d1 < d2) { | |
3305 // n2 is deeper than current lca | |
3306 Node *memo = _dom_lca_tags[n2->_idx]; | |
3307 if( memo == tag ) { | |
3308 return n1; // Return the current LCA | |
3309 } | |
3310 _dom_lca_tags.map(n2->_idx, tag); | |
3311 n2 = idom(n2); | |
3312 d2 = dom_depth(n2); | |
3313 } else { | |
3314 // Here d1 == d2. Due to edits of the dominator-tree, sections | |
3315 // of the tree might have the same depth. These sections have | |
3316 // to be searched more carefully. | |
3317 | |
3318 // Scan up all the n1's with equal depth, looking for n2. | |
3319 _dom_lca_tags.map(n1->_idx, tag); | |
3320 Node *t1 = idom(n1); | |
3321 while (dom_depth(t1) == d1) { | |
3322 if (t1 == n2) return n2; | |
3323 _dom_lca_tags.map(t1->_idx, tag); | |
3324 t1 = idom(t1); | |
3325 } | |
3326 // Scan up all the n2's with equal depth, looking for n1. | |
3327 _dom_lca_tags.map(n2->_idx, tag); | |
3328 Node *t2 = idom(n2); | |
3329 while (dom_depth(t2) == d2) { | |
3330 if (t2 == n1) return n1; | |
3331 _dom_lca_tags.map(t2->_idx, tag); | |
3332 t2 = idom(t2); | |
3333 } | |
3334 // Move up to a new dominator-depth value as well as up the dom-tree. | |
3335 n1 = t1; | |
3336 n2 = t2; | |
3337 d1 = dom_depth(n1); | |
3338 d2 = dom_depth(n2); | |
3339 } | |
3340 } while (n1 != n2); | |
3341 return n1; | |
3342 } | |
3343 | |
3344 //------------------------------init_dom_lca_tags------------------------------ | |
3345 // Tag could be a node's integer index, 32bits instead of 64bits in some cases | |
3346 // Intended use does not involve any growth for the array, so it could | |
3347 // be of fixed size. | |
3348 void PhaseIdealLoop::init_dom_lca_tags() { | |
3349 uint limit = C->unique() + 1; | |
3350 _dom_lca_tags.map( limit, NULL ); | |
3351 #ifdef ASSERT | |
3352 for( uint i = 0; i < limit; ++i ) { | |
3353 assert(_dom_lca_tags[i] == NULL, "Must be distinct from each node pointer"); | |
3354 } | |
3355 #endif // ASSERT | |
3356 } | |
3357 | |
3358 //------------------------------clear_dom_lca_tags------------------------------ | |
3359 // Tag could be a node's integer index, 32bits instead of 64bits in some cases | |
3360 // Intended use does not involve any growth for the array, so it could | |
3361 // be of fixed size. | |
3362 void PhaseIdealLoop::clear_dom_lca_tags() { | |
3363 uint limit = C->unique() + 1; | |
3364 _dom_lca_tags.map( limit, NULL ); | |
3365 _dom_lca_tags.clear(); | |
3366 #ifdef ASSERT | |
3367 for( uint i = 0; i < limit; ++i ) { | |
3368 assert(_dom_lca_tags[i] == NULL, "Must be distinct from each node pointer"); | |
3369 } | |
3370 #endif // ASSERT | |
3371 } | |
3372 | |
3373 //------------------------------build_loop_late-------------------------------- | |
3374 // Put Data nodes into some loop nest, by setting the _nodes[]->loop mapping. | |
3375 // Second pass finds latest legal placement, and ideal loop placement. | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3376 void PhaseIdealLoop::build_loop_late( VectorSet &visited, Node_List &worklist, Node_Stack &nstack ) { |
0 | 3377 while (worklist.size() != 0) { |
3378 Node *n = worklist.pop(); | |
3379 // Only visit once | |
3380 if (visited.test_set(n->_idx)) continue; | |
3381 uint cnt = n->outcnt(); | |
3382 uint i = 0; | |
3383 while (true) { | |
3384 assert( _nodes[n->_idx], "no dead nodes" ); | |
3385 // Visit all children | |
3386 if (i < cnt) { | |
3387 Node* use = n->raw_out(i); | |
3388 ++i; | |
3389 // Check for dead uses. Aggressively prune such junk. It might be | |
3390 // dead in the global sense, but still have local uses so I cannot | |
3391 // easily call 'remove_dead_node'. | |
3392 if( _nodes[use->_idx] != NULL || use->is_top() ) { // Not dead? | |
3393 // Due to cycles, we might not hit the same fixed point in the verify | |
3394 // pass as we do in the regular pass. Instead, visit such phis as | |
3395 // simple uses of the loop head. | |
3396 if( use->in(0) && (use->is_CFG() || use->is_Phi()) ) { | |
3397 if( !visited.test(use->_idx) ) | |
3398 worklist.push(use); | |
3399 } else if( !visited.test_set(use->_idx) ) { | |
3400 nstack.push(n, i); // Save parent and next use's index. | |
3401 n = use; // Process all children of current use. | |
3402 cnt = use->outcnt(); | |
3403 i = 0; | |
3404 } | |
3405 } else { | |
3406 // Do not visit around the backedge of loops via data edges. | |
3407 // push dead code onto a worklist | |
3408 _deadlist.push(use); | |
3409 } | |
3410 } else { | |
3411 // All of n's children have been processed, complete post-processing. | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3412 build_loop_late_post(n); |
0 | 3413 if (nstack.is_empty()) { |
3414 // Finished all nodes on stack. | |
3415 // Process next node on the worklist. | |
3416 break; | |
3417 } | |
3418 // Get saved parent node and next use's index. Visit the rest of uses. | |
3419 n = nstack.node(); | |
3420 cnt = n->outcnt(); | |
3421 i = nstack.index(); | |
3422 nstack.pop(); | |
3423 } | |
3424 } | |
3425 } | |
3426 } | |
3427 | |
3428 //------------------------------build_loop_late_post--------------------------- | |
3429 // Put Data nodes into some loop nest, by setting the _nodes[]->loop mapping. | |
3430 // Second pass finds latest legal placement, and ideal loop placement. | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3431 void PhaseIdealLoop::build_loop_late_post( Node *n ) { |
0 | 3432 |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3433 if (n->req() == 2 && n->Opcode() == Op_ConvI2L && !C->major_progress() && !_verify_only) { |
0 | 3434 _igvn._worklist.push(n); // Maybe we'll normalize it, if no more loops. |
3435 } | |
3436 | |
3437 // CFG and pinned nodes already handled | |
3438 if( n->in(0) ) { | |
3439 if( n->in(0)->is_top() ) return; // Dead? | |
3440 | |
3441 // We'd like +VerifyLoopOptimizations to not believe that Mod's/Loads | |
3442 // _must_ be pinned (they have to observe their control edge of course). | |
3443 // Unlike Stores (which modify an unallocable resource, the memory | |
3444 // state), Mods/Loads can float around. So free them up. | |
3445 bool pinned = true; | |
3446 switch( n->Opcode() ) { | |
3447 case Op_DivI: | |
3448 case Op_DivF: | |
3449 case Op_DivD: | |
3450 case Op_ModI: | |
3451 case Op_ModF: | |
3452 case Op_ModD: | |
3453 case Op_LoadB: // Same with Loads; they can sink | |
6179
8c92982cbbc4
7119644: Increase superword's vector size up to 256 bits
kvn
parents:
6144
diff
changeset
|
3454 case Op_LoadUB: // during loop optimizations. |
8c92982cbbc4
7119644: Increase superword's vector size up to 256 bits
kvn
parents:
6144
diff
changeset
|
3455 case Op_LoadUS: |
0 | 3456 case Op_LoadD: |
3457 case Op_LoadF: | |
3458 case Op_LoadI: | |
3459 case Op_LoadKlass: | |
293
c3e045194476
6731641: assert(m->adr_type() == mach->adr_type(),"matcher should not change adr type")
kvn
parents:
235
diff
changeset
|
3460 case Op_LoadNKlass: |
0 | 3461 case Op_LoadL: |
3462 case Op_LoadS: | |
3463 case Op_LoadP: | |
293
c3e045194476
6731641: assert(m->adr_type() == mach->adr_type(),"matcher should not change adr type")
kvn
parents:
235
diff
changeset
|
3464 case Op_LoadN: |
0 | 3465 case Op_LoadRange: |
3466 case Op_LoadD_unaligned: | |
3467 case Op_LoadL_unaligned: | |
3468 case Op_StrComp: // Does a bunch of load-like effects | |
681 | 3469 case Op_StrEquals: |
3470 case Op_StrIndexOf: | |
169
9148c65abefc
6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents:
39
diff
changeset
|
3471 case Op_AryEq: |
0 | 3472 pinned = false; |
3473 } | |
3474 if( pinned ) { | |
605 | 3475 IdealLoopTree *chosen_loop = get_loop(n->is_CFG() ? n : get_ctrl(n)); |
3476 if( !chosen_loop->_child ) // Inner loop? | |
3477 chosen_loop->_body.push(n); // Collect inner loops | |
0 | 3478 return; |
3479 } | |
3480 } else { // No slot zero | |
3481 if( n->is_CFG() ) { // CFG with no slot 0 is dead | |
3482 _nodes.map(n->_idx,0); // No block setting, it's globally dead | |
3483 return; | |
3484 } | |
3485 assert(!n->is_CFG() || n->outcnt() == 0, ""); | |
3486 } | |
3487 | |
3488 // Do I have a "safe range" I can select over? | |
3489 Node *early = get_ctrl(n);// Early location already computed | |
3490 | |
3491 // Compute latest point this Node can go | |
3492 Node *LCA = get_late_ctrl( n, early ); | |
3493 // LCA is NULL due to uses being dead | |
3494 if( LCA == NULL ) { | |
3495 #ifdef ASSERT | |
3496 for (DUIterator i1 = n->outs(); n->has_out(i1); i1++) { | |
3497 assert( _nodes[n->out(i1)->_idx] == NULL, "all uses must also be dead"); | |
3498 } | |
3499 #endif | |
3500 _nodes.map(n->_idx, 0); // This node is useless | |
3501 _deadlist.push(n); | |
3502 return; | |
3503 } | |
3504 assert(LCA != NULL && !LCA->is_top(), "no dead nodes"); | |
3505 | |
3506 Node *legal = LCA; // Walk 'legal' up the IDOM chain | |
3507 Node *least = legal; // Best legal position so far | |
3508 while( early != legal ) { // While not at earliest legal | |
1172 | 3509 #ifdef ASSERT |
3510 if (legal->is_Start() && !early->is_Root()) { | |
3511 // Bad graph. Print idom path and fail. | |
8048
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
3512 dump_bad_graph("Bad graph detected in build_loop_late", n, early, LCA); |
1172 | 3513 assert(false, "Bad graph detected in build_loop_late"); |
3514 } | |
3515 #endif | |
0 | 3516 // Find least loop nesting depth |
3517 legal = idom(legal); // Bump up the IDOM tree | |
3518 // Check for lower nesting depth | |
3519 if( get_loop(legal)->_nest < get_loop(least)->_nest ) | |
3520 least = legal; | |
3521 } | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3522 assert(early == legal || legal != C->root(), "bad dominance of inputs"); |
0 | 3523 |
3524 // Try not to place code on a loop entry projection | |
3525 // which can inhibit range check elimination. | |
3526 if (least != early) { | |
3527 Node* ctrl_out = least->unique_ctrl_out(); | |
3528 if (ctrl_out && ctrl_out->is_CountedLoop() && | |
3529 least == ctrl_out->in(LoopNode::EntryControl)) { | |
3530 Node* least_dom = idom(least); | |
3531 if (get_loop(least_dom)->is_member(get_loop(least))) { | |
3532 least = least_dom; | |
3533 } | |
3534 } | |
3535 } | |
3536 | |
3537 #ifdef ASSERT | |
3538 // If verifying, verify that 'verify_me' has a legal location | |
3539 // and choose it as our location. | |
921
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3540 if( _verify_me ) { |
046932b72aa2
6862956: PhaseIdealLoop should have a CFG verification mode
never
parents:
681
diff
changeset
|
3541 Node *v_ctrl = _verify_me->get_ctrl_no_update(n); |
0 | 3542 Node *legal = LCA; |
3543 while( early != legal ) { // While not at earliest legal | |
3544 if( legal == v_ctrl ) break; // Check for prior good location | |
3545 legal = idom(legal) ;// Bump up the IDOM tree | |
3546 } | |
3547 // Check for prior good location | |
3548 if( legal == v_ctrl ) least = legal; // Keep prior if found | |
3549 } | |
3550 #endif | |
3551 | |
3552 // Assign discovered "here or above" point | |
3553 least = find_non_split_ctrl(least); | |
3554 set_ctrl(n, least); | |
3555 | |
3556 // Collect inner loop bodies | |
605 | 3557 IdealLoopTree *chosen_loop = get_loop(least); |
3558 if( !chosen_loop->_child ) // Inner loop? | |
3559 chosen_loop->_body.push(n);// Collect inner loops | |
0 | 3560 } |
3561 | |
4779
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3562 #ifdef ASSERT |
8048
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
3563 void PhaseIdealLoop::dump_bad_graph(const char* msg, Node* n, Node* early, Node* LCA) { |
8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
roland
parents:
6846
diff
changeset
|
3564 tty->print_cr(msg); |
4779
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3565 tty->print("n: "); n->dump(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3566 tty->print("early(n): "); early->dump(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3567 if (n->in(0) != NULL && !n->in(0)->is_top() && |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3568 n->in(0) != early && !n->in(0)->is_Root()) { |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3569 tty->print("n->in(0): "); n->in(0)->dump(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3570 } |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3571 for (uint i = 1; i < n->req(); i++) { |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3572 Node* in1 = n->in(i); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3573 if (in1 != NULL && in1 != n && !in1->is_top()) { |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3574 tty->print("n->in(%d): ", i); in1->dump(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3575 Node* in1_early = get_ctrl(in1); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3576 tty->print("early(n->in(%d)): ", i); in1_early->dump(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3577 if (in1->in(0) != NULL && !in1->in(0)->is_top() && |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3578 in1->in(0) != in1_early && !in1->in(0)->is_Root()) { |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3579 tty->print("n->in(%d)->in(0): ", i); in1->in(0)->dump(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3580 } |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3581 for (uint j = 1; j < in1->req(); j++) { |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3582 Node* in2 = in1->in(j); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3583 if (in2 != NULL && in2 != n && in2 != in1 && !in2->is_top()) { |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3584 tty->print("n->in(%d)->in(%d): ", i, j); in2->dump(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3585 Node* in2_early = get_ctrl(in2); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3586 tty->print("early(n->in(%d)->in(%d)): ", i, j); in2_early->dump(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3587 if (in2->in(0) != NULL && !in2->in(0)->is_top() && |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3588 in2->in(0) != in2_early && !in2->in(0)->is_Root()) { |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3589 tty->print("n->in(%d)->in(%d)->in(0): ", i, j); in2->in(0)->dump(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3590 } |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3591 } |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3592 } |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3593 } |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3594 } |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3595 tty->cr(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3596 tty->print("LCA(n): "); LCA->dump(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3597 for (uint i = 0; i < n->outcnt(); i++) { |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3598 Node* u1 = n->raw_out(i); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3599 if (u1 == n) |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3600 continue; |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3601 tty->print("n->out(%d): ", i); u1->dump(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3602 if (u1->is_CFG()) { |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3603 for (uint j = 0; j < u1->outcnt(); j++) { |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3604 Node* u2 = u1->raw_out(j); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3605 if (u2 != u1 && u2 != n && u2->is_CFG()) { |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3606 tty->print("n->out(%d)->out(%d): ", i, j); u2->dump(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3607 } |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3608 } |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3609 } else { |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3610 Node* u1_later = get_ctrl(u1); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3611 tty->print("later(n->out(%d)): ", i); u1_later->dump(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3612 if (u1->in(0) != NULL && !u1->in(0)->is_top() && |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3613 u1->in(0) != u1_later && !u1->in(0)->is_Root()) { |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3614 tty->print("n->out(%d)->in(0): ", i); u1->in(0)->dump(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3615 } |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3616 for (uint j = 0; j < u1->outcnt(); j++) { |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3617 Node* u2 = u1->raw_out(j); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3618 if (u2 == n || u2 == u1) |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3619 continue; |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3620 tty->print("n->out(%d)->out(%d): ", i, j); u2->dump(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3621 if (!u2->is_CFG()) { |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3622 Node* u2_later = get_ctrl(u2); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3623 tty->print("later(n->out(%d)->out(%d)): ", i, j); u2_later->dump(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3624 if (u2->in(0) != NULL && !u2->in(0)->is_top() && |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3625 u2->in(0) != u2_later && !u2->in(0)->is_Root()) { |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3626 tty->print("n->out(%d)->in(0): ", i); u2->in(0)->dump(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3627 } |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3628 } |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3629 } |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3630 } |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3631 } |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3632 tty->cr(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3633 int ct = 0; |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3634 Node *dbg_legal = LCA; |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3635 while(!dbg_legal->is_Start() && ct < 100) { |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3636 tty->print("idom[%d] ",ct); dbg_legal->dump(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3637 ct++; |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3638 dbg_legal = idom(dbg_legal); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3639 } |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3640 tty->cr(); |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3641 } |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3642 #endif |
c8d8e124380c
7064302: JDK7 build 147 crashed after testing my java 6-compiled web app
kvn
parents:
4115
diff
changeset
|
3643 |
0 | 3644 #ifndef PRODUCT |
3645 //------------------------------dump------------------------------------------- | |
3646 void PhaseIdealLoop::dump( ) const { | |
3647 ResourceMark rm; | |
3648 Arena* arena = Thread::current()->resource_area(); | |
3649 Node_Stack stack(arena, C->unique() >> 2); | |
3650 Node_List rpo_list; | |
3651 VectorSet visited(arena); | |
3652 visited.set(C->top()->_idx); | |
3653 rpo( C->root(), stack, visited, rpo_list ); | |
3654 // Dump root loop indexed by last element in PO order | |
3655 dump( _ltree_root, rpo_list.size(), rpo_list ); | |
3656 } | |
3657 | |
3658 void PhaseIdealLoop::dump( IdealLoopTree *loop, uint idx, Node_List &rpo_list ) const { | |
367
194b8e3a2fc4
6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents:
293
diff
changeset
|
3659 loop->dump_head(); |
0 | 3660 |
3661 // Now scan for CFG nodes in the same loop | |
3662 for( uint j=idx; j > 0; j-- ) { | |
3663 Node *n = rpo_list[j-1]; | |
3664 if( !_nodes[n->_idx] ) // Skip dead nodes | |
3665 continue; | |
3666 if( get_loop(n) != loop ) { // Wrong loop nest | |
3667 if( get_loop(n)->_head == n && // Found nested loop? | |
3668 get_loop(n)->_parent == loop ) | |
3669 dump(get_loop(n),rpo_list.size(),rpo_list); // Print it nested-ly | |
3670 continue; | |
3671 } | |
3672 | |
3673 // Dump controlling node | |
3674 for( uint x = 0; x < loop->_nest; x++ ) | |
3675 tty->print(" "); | |
3676 tty->print("C"); | |
3677 if( n == C->root() ) { | |
3678 n->dump(); | |
3679 } else { | |
3680 Node* cached_idom = idom_no_update(n); | |
3681 Node *computed_idom = n->in(0); | |
3682 if( n->is_Region() ) { | |
3683 computed_idom = compute_idom(n); | |
3684 // computed_idom() will return n->in(0) when idom(n) is an IfNode (or | |
3685 // any MultiBranch ctrl node), so apply a similar transform to | |
3686 // the cached idom returned from idom_no_update. | |
3687 cached_idom = find_non_split_ctrl(cached_idom); | |
3688 } | |
3689 tty->print(" ID:%d",computed_idom->_idx); | |
3690 n->dump(); | |
3691 if( cached_idom != computed_idom ) { | |
3692 tty->print_cr("*** BROKEN IDOM! Computed as: %d, cached as: %d", | |
3693 computed_idom->_idx, cached_idom->_idx); | |
3694 } | |
3695 } | |
3696 // Dump nodes it controls | |
3697 for( uint k = 0; k < _nodes.Size(); k++ ) { | |
3698 // (k < C->unique() && get_ctrl(find(k)) == n) | |
3699 if (k < C->unique() && _nodes[k] == (Node*)((intptr_t)n + 1)) { | |
3700 Node *m = C->root()->find(k); | |
3701 if( m && m->outcnt() > 0 ) { | |
3702 if (!(has_ctrl(m) && get_ctrl_no_update(m) == n)) { | |
3703 tty->print_cr("*** BROKEN CTRL ACCESSOR! _nodes[k] is %p, ctrl is %p", | |
3704 _nodes[k], has_ctrl(m) ? get_ctrl_no_update(m) : NULL); | |
3705 } | |
3706 for( uint j = 0; j < loop->_nest; j++ ) | |
3707 tty->print(" "); | |
3708 tty->print(" "); | |
3709 m->dump(); | |
3710 } | |
3711 } | |
3712 } | |
3713 } | |
3714 } | |
3715 | |
3716 // Collect a R-P-O for the whole CFG. | |
3717 // Result list is in post-order (scan backwards for RPO) | |
3718 void PhaseIdealLoop::rpo( Node *start, Node_Stack &stk, VectorSet &visited, Node_List &rpo_list ) const { | |
3719 stk.push(start, 0); | |
3720 visited.set(start->_idx); | |
3721 | |
3722 while (stk.is_nonempty()) { | |
3723 Node* m = stk.node(); | |
3724 uint idx = stk.index(); | |
3725 if (idx < m->outcnt()) { | |
3726 stk.set_index(idx + 1); | |
3727 Node* n = m->raw_out(idx); | |
3728 if (n->is_CFG() && !visited.test_set(n->_idx)) { | |
3729 stk.push(n, 0); | |
3730 } | |
3731 } else { | |
3732 rpo_list.push(m); | |
3733 stk.pop(); | |
3734 } | |
3735 } | |
3736 } | |
3737 #endif | |
3738 | |
3739 | |
3740 //============================================================================= | |
3741 //------------------------------LoopTreeIterator----------------------------------- | |
3742 | |
3743 // Advance to next loop tree using a preorder, left-to-right traversal. | |
3744 void LoopTreeIterator::next() { | |
3745 assert(!done(), "must not be done."); | |
3746 if (_curnt->_child != NULL) { | |
3747 _curnt = _curnt->_child; | |
3748 } else if (_curnt->_next != NULL) { | |
3749 _curnt = _curnt->_next; | |
3750 } else { | |
3751 while (_curnt != _root && _curnt->_next == NULL) { | |
3752 _curnt = _curnt->_parent; | |
3753 } | |
3754 if (_curnt == _root) { | |
3755 _curnt = NULL; | |
3756 assert(done(), "must be done."); | |
3757 } else { | |
3758 assert(_curnt->_next != NULL, "must be more to do"); | |
3759 _curnt = _curnt->_next; | |
3760 } | |
3761 } | |
3762 } |