annotate src/share/vm/opto/loopUnswitch.cpp @ 452:00b023ae2d78

6722113: CMS: Incorrect overflow handling during precleaning of Reference lists Summary: When we encounter marking stack overflow during precleaning of Reference lists, we were using the overflow list mechanism, which can cause problems on account of mutating the mark word of the header because of conflicts with mutator accesses and updates of that field. Instead we should use the usual mechanism for overflow handling in concurrent phases, namely dirtying of the card on which the overflowed object lies. Since precleaning effectively does a form of discovered list processing, albeit with discovery enabled, we needed to adjust some code to be correct in the face of interleaved processing and discovery. Reviewed-by: apetrusenko, jcoomes
author ysr
date Thu, 20 Nov 2008 12:27:41 -0800
parents 9c2ecc2ffb12
children 98cb887364d3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
196
d1605aabd0a1 6719955: Update copyright year
xdono
parents: 108
diff changeset
2 * Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 #include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 #include "incls/_loopUnswitch.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 //================= Loop Unswitching =====================
a61af66fc99e Initial load
duke
parents:
diff changeset
29 //
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // orig: transformed:
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // if (invariant-test) then
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // loop loop
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // stmt1 stmt1
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // if (invariant-test) then stmt2
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // stmt2 stmt4
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // else endloop
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // stmt3 else
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // endif loop [clone]
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // stmt4 stmt1 [clone]
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // endloop stmt3
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // stmt4 [clone]
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // endloop
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // endif
a61af66fc99e Initial load
duke
parents:
diff changeset
44 //
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // Note: the "else" clause may be empty
a61af66fc99e Initial load
duke
parents:
diff changeset
46
a61af66fc99e Initial load
duke
parents:
diff changeset
47 //------------------------------policy_unswitching-----------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // Return TRUE or FALSE if the loop should be unswitched
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // (ie. clone loop with an invariant test that does not exit the loop)
a61af66fc99e Initial load
duke
parents:
diff changeset
50 bool IdealLoopTree::policy_unswitching( PhaseIdealLoop *phase ) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
51 if( !LoopUnswitching ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
52 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 }
108
a761c2d3b76a 6684385: Loop unswitching crashes without LoopNode
rasbold
parents: 0
diff changeset
54 if (!_head->is_Loop()) {
a761c2d3b76a 6684385: Loop unswitching crashes without LoopNode
rasbold
parents: 0
diff changeset
55 return false;
a761c2d3b76a 6684385: Loop unswitching crashes without LoopNode
rasbold
parents: 0
diff changeset
56 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
57 uint nodes_left = MaxNodeLimit - phase->C->unique();
a61af66fc99e Initial load
duke
parents:
diff changeset
58 if (2 * _body.size() > nodes_left) {
a61af66fc99e Initial load
duke
parents:
diff changeset
59 return false; // Too speculative if running low on nodes.
a61af66fc99e Initial load
duke
parents:
diff changeset
60 }
a61af66fc99e Initial load
duke
parents:
diff changeset
61 LoopNode* head = _head->as_Loop();
a61af66fc99e Initial load
duke
parents:
diff changeset
62 if (head->unswitch_count() + 1 > head->unswitch_max()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
63 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 }
a61af66fc99e Initial load
duke
parents:
diff changeset
65 return phase->find_unswitching_candidate(this) != NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 }
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 //------------------------------find_unswitching_candidate-----------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // Find candidate "if" for unswitching
a61af66fc99e Initial load
duke
parents:
diff changeset
70 IfNode* PhaseIdealLoop::find_unswitching_candidate(const IdealLoopTree *loop) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // Find first invariant test that doesn't exit the loop
a61af66fc99e Initial load
duke
parents:
diff changeset
73 LoopNode *head = loop->_head->as_Loop();
a61af66fc99e Initial load
duke
parents:
diff changeset
74 IfNode* unswitch_iff = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 Node* n = head->in(LoopNode::LoopBackControl);
a61af66fc99e Initial load
duke
parents:
diff changeset
76 while (n != head) {
a61af66fc99e Initial load
duke
parents:
diff changeset
77 Node* n_dom = idom(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
78 if (n->is_Region()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
79 if (n_dom->is_If()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
80 IfNode* iff = n_dom->as_If();
a61af66fc99e Initial load
duke
parents:
diff changeset
81 if (iff->in(1)->is_Bool()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
82 BoolNode* bol = iff->in(1)->as_Bool();
a61af66fc99e Initial load
duke
parents:
diff changeset
83 if (bol->in(1)->is_Cmp()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // If condition is invariant and not a loop exit,
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // then found reason to unswitch.
a61af66fc99e Initial load
duke
parents:
diff changeset
86 if (loop->is_invariant(bol) && !loop->is_loop_exit(iff)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
87 unswitch_iff = iff;
a61af66fc99e Initial load
duke
parents:
diff changeset
88 }
a61af66fc99e Initial load
duke
parents:
diff changeset
89 }
a61af66fc99e Initial load
duke
parents:
diff changeset
90 }
a61af66fc99e Initial load
duke
parents:
diff changeset
91 }
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93 n = n_dom;
a61af66fc99e Initial load
duke
parents:
diff changeset
94 }
a61af66fc99e Initial load
duke
parents:
diff changeset
95 return unswitch_iff;
a61af66fc99e Initial load
duke
parents:
diff changeset
96 }
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 //------------------------------do_unswitching-----------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // Clone loop with an invariant test (that does not exit) and
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // insert a clone of the test that selects which version to
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // execute.
a61af66fc99e Initial load
duke
parents:
diff changeset
102 void PhaseIdealLoop::do_unswitching (IdealLoopTree *loop, Node_List &old_new) {
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // Find first invariant test that doesn't exit the loop
a61af66fc99e Initial load
duke
parents:
diff changeset
105 LoopNode *head = loop->_head->as_Loop();
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 IfNode* unswitch_iff = find_unswitching_candidate((const IdealLoopTree *)loop);
a61af66fc99e Initial load
duke
parents:
diff changeset
108 assert(unswitch_iff != NULL, "should be at least one");
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // Need to revert back to normal loop
a61af66fc99e Initial load
duke
parents:
diff changeset
111 if (head->is_CountedLoop() && !head->as_CountedLoop()->is_normal_loop()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
112 head->as_CountedLoop()->set_normal_loop();
a61af66fc99e Initial load
duke
parents:
diff changeset
113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 ProjNode* proj_true = create_slow_version_of_loop(loop, old_new);
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 assert(proj_true->is_IfTrue() && proj_true->unique_ctrl_out() == head, "by construction");
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // Increment unswitch count
a61af66fc99e Initial load
duke
parents:
diff changeset
120 LoopNode* head_clone = old_new[head->_idx]->as_Loop();
a61af66fc99e Initial load
duke
parents:
diff changeset
121 int nct = head->unswitch_count() + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 head->set_unswitch_count(nct);
a61af66fc99e Initial load
duke
parents:
diff changeset
123 head_clone->set_unswitch_count(nct);
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // Add test to new "if" outside of loop
a61af66fc99e Initial load
duke
parents:
diff changeset
126 IfNode* invar_iff = proj_true->in(0)->as_If();
a61af66fc99e Initial load
duke
parents:
diff changeset
127 Node* invar_iff_c = invar_iff->in(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
128 BoolNode* bol = unswitch_iff->in(1)->as_Bool();
a61af66fc99e Initial load
duke
parents:
diff changeset
129 invar_iff->set_req(1, bol);
a61af66fc99e Initial load
duke
parents:
diff changeset
130 invar_iff->_prob = unswitch_iff->_prob;
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132 ProjNode* proj_false = invar_iff->proj_out(0)->as_Proj();
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // Hoist invariant casts out of each loop to the appropiate
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // control projection.
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 Node_List worklist;
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 for (DUIterator_Fast imax, i = unswitch_iff->fast_outs(imax); i < imax; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
140 ProjNode* proj= unswitch_iff->fast_out(i)->as_Proj();
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // Copy to a worklist for easier manipulation
a61af66fc99e Initial load
duke
parents:
diff changeset
142 for (DUIterator_Fast jmax, j = proj->fast_outs(jmax); j < jmax; j++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 Node* use = proj->fast_out(j);
a61af66fc99e Initial load
duke
parents:
diff changeset
144 if (use->Opcode() == Op_CheckCastPP && loop->is_invariant(use->in(1))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
145 worklist.push(use);
a61af66fc99e Initial load
duke
parents:
diff changeset
146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148 ProjNode* invar_proj = invar_iff->proj_out(proj->_con)->as_Proj();
a61af66fc99e Initial load
duke
parents:
diff changeset
149 while (worklist.size() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
150 Node* use = worklist.pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
151 Node* nuse = use->clone();
a61af66fc99e Initial load
duke
parents:
diff changeset
152 nuse->set_req(0, invar_proj);
a61af66fc99e Initial load
duke
parents:
diff changeset
153 _igvn.hash_delete(use);
a61af66fc99e Initial load
duke
parents:
diff changeset
154 use->set_req(1, nuse);
a61af66fc99e Initial load
duke
parents:
diff changeset
155 _igvn._worklist.push(use);
a61af66fc99e Initial load
duke
parents:
diff changeset
156 register_new_node(nuse, invar_proj);
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // Same for the clone
a61af66fc99e Initial load
duke
parents:
diff changeset
158 Node* use_clone = old_new[use->_idx];
a61af66fc99e Initial load
duke
parents:
diff changeset
159 _igvn.hash_delete(use_clone);
a61af66fc99e Initial load
duke
parents:
diff changeset
160 use_clone->set_req(1, nuse);
a61af66fc99e Initial load
duke
parents:
diff changeset
161 _igvn._worklist.push(use_clone);
a61af66fc99e Initial load
duke
parents:
diff changeset
162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // Hardwire the control paths in the loops into if(true) and if(false)
a61af66fc99e Initial load
duke
parents:
diff changeset
166 _igvn.hash_delete(unswitch_iff);
a61af66fc99e Initial load
duke
parents:
diff changeset
167 short_circuit_if(unswitch_iff, proj_true);
a61af66fc99e Initial load
duke
parents:
diff changeset
168 _igvn._worklist.push(unswitch_iff);
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170 IfNode* unswitch_iff_clone = old_new[unswitch_iff->_idx]->as_If();
a61af66fc99e Initial load
duke
parents:
diff changeset
171 _igvn.hash_delete(unswitch_iff_clone);
a61af66fc99e Initial load
duke
parents:
diff changeset
172 short_circuit_if(unswitch_iff_clone, proj_false);
a61af66fc99e Initial load
duke
parents:
diff changeset
173 _igvn._worklist.push(unswitch_iff_clone);
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // Reoptimize loops
a61af66fc99e Initial load
duke
parents:
diff changeset
176 loop->record_for_igvn();
a61af66fc99e Initial load
duke
parents:
diff changeset
177 for(int i = loop->_body.size() - 1; i >= 0 ; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
178 Node *n = loop->_body[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
179 Node *n_clone = old_new[n->_idx];
a61af66fc99e Initial load
duke
parents:
diff changeset
180 _igvn._worklist.push(n_clone);
a61af66fc99e Initial load
duke
parents:
diff changeset
181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
184 if (TraceLoopUnswitching) {
a61af66fc99e Initial load
duke
parents:
diff changeset
185 tty->print_cr("Loop unswitching orig: %d @ %d new: %d @ %d",
a61af66fc99e Initial load
duke
parents:
diff changeset
186 head->_idx, unswitch_iff->_idx,
a61af66fc99e Initial load
duke
parents:
diff changeset
187 old_new[head->_idx]->_idx, unswitch_iff_clone->_idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
189 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 C->set_major_progress();
a61af66fc99e Initial load
duke
parents:
diff changeset
192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 //-------------------------create_slow_version_of_loop------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // Create a slow version of the loop by cloning the loop
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // and inserting an if to select fast-slow versions.
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // Return control projection of the entry to the fast version.
a61af66fc99e Initial load
duke
parents:
diff changeset
198 ProjNode* PhaseIdealLoop::create_slow_version_of_loop(IdealLoopTree *loop,
a61af66fc99e Initial load
duke
parents:
diff changeset
199 Node_List &old_new) {
a61af66fc99e Initial load
duke
parents:
diff changeset
200 LoopNode* head = loop->_head->as_Loop();
a61af66fc99e Initial load
duke
parents:
diff changeset
201 Node* entry = head->in(LoopNode::EntryControl);
a61af66fc99e Initial load
duke
parents:
diff changeset
202 _igvn.hash_delete(entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
203 _igvn._worklist.push(entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 IdealLoopTree* outer_loop = loop->_parent;
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 Node *cont = _igvn.intcon(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
207 set_ctrl(cont, C->root());
216
8d191a7697e2 6715633: when matching a memory node the adr_type should not change
kvn
parents: 108
diff changeset
208 Node* opq = new (C, 2) Opaque1Node(C, cont);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
209 register_node(opq, outer_loop, entry, dom_depth(entry));
a61af66fc99e Initial load
duke
parents:
diff changeset
210 Node *bol = new (C, 2) Conv2BNode(opq);
a61af66fc99e Initial load
duke
parents:
diff changeset
211 register_node(bol, outer_loop, entry, dom_depth(entry));
a61af66fc99e Initial load
duke
parents:
diff changeset
212 IfNode* iff = new (C, 2) IfNode(entry, bol, PROB_MAX, COUNT_UNKNOWN);
a61af66fc99e Initial load
duke
parents:
diff changeset
213 register_node(iff, outer_loop, entry, dom_depth(entry));
a61af66fc99e Initial load
duke
parents:
diff changeset
214 ProjNode* iffast = new (C, 1) IfTrueNode(iff);
a61af66fc99e Initial load
duke
parents:
diff changeset
215 register_node(iffast, outer_loop, iff, dom_depth(iff));
a61af66fc99e Initial load
duke
parents:
diff changeset
216 ProjNode* ifslow = new (C, 1) IfFalseNode(iff);
a61af66fc99e Initial load
duke
parents:
diff changeset
217 register_node(ifslow, outer_loop, iff, dom_depth(iff));
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // Clone the loop body. The clone becomes the fast loop. The
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // original pre-header will (illegally) have 2 control users (old & new loops).
a61af66fc99e Initial load
duke
parents:
diff changeset
221 clone_loop(loop, old_new, dom_depth(head), iff);
a61af66fc99e Initial load
duke
parents:
diff changeset
222 assert(old_new[head->_idx]->is_Loop(), "" );
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // Fast (true) control
a61af66fc99e Initial load
duke
parents:
diff changeset
225 _igvn.hash_delete(head);
a61af66fc99e Initial load
duke
parents:
diff changeset
226 head->set_req(LoopNode::EntryControl, iffast);
a61af66fc99e Initial load
duke
parents:
diff changeset
227 set_idom(head, iffast, dom_depth(head));
a61af66fc99e Initial load
duke
parents:
diff changeset
228 _igvn._worklist.push(head);
a61af66fc99e Initial load
duke
parents:
diff changeset
229
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // Slow (false) control
a61af66fc99e Initial load
duke
parents:
diff changeset
231 LoopNode* slow_head = old_new[head->_idx]->as_Loop();
a61af66fc99e Initial load
duke
parents:
diff changeset
232 _igvn.hash_delete(slow_head);
a61af66fc99e Initial load
duke
parents:
diff changeset
233 slow_head->set_req(LoopNode::EntryControl, ifslow);
a61af66fc99e Initial load
duke
parents:
diff changeset
234 set_idom(slow_head, ifslow, dom_depth(slow_head));
a61af66fc99e Initial load
duke
parents:
diff changeset
235 _igvn._worklist.push(slow_head);
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 recompute_dom_depth();
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 return iffast;
a61af66fc99e Initial load
duke
parents:
diff changeset
240 }