238 register_node(iff, outer_loop, entry, dom_depth(entry));
239 ProjNode* iffast = new (C, 1) IfTrueNode(iff);
240 register_node(iffast, outer_loop, iff, dom_depth(iff));
241 ProjNode* ifslow = new (C, 1) IfFalseNode(iff);
242 register_node(ifslow, outer_loop, iff, dom_depth(iff));
243
244 // Clone the loop body. The clone becomes the fast loop. The
245 // original pre-header will (illegally) have 3 control users
246 // (old & new loops & new if).
247 clone_loop(loop, old_new, dom_depth(head), iff);
248 assert(old_new[head->_idx]->is_Loop(), "" );
249
250 // Fast (true) control
251 Node* iffast_pred = clone_loop_predicates(entry, iffast, !counted_loop);
252 _igvn.hash_delete(head);
253 head->set_req(LoopNode::EntryControl, iffast_pred);
254 set_idom(head, iffast_pred, dom_depth(head));
255 _igvn._worklist.push(head);
256
257 // Slow (false) control
258 Node* ifslow_pred = move_loop_predicates(entry, ifslow, !counted_loop);
259 LoopNode* slow_head = old_new[head->_idx]->as_Loop();
260 _igvn.hash_delete(slow_head);
261 slow_head->set_req(LoopNode::EntryControl, ifslow_pred);
262 set_idom(slow_head, ifslow_pred, dom_depth(slow_head));
263 _igvn._worklist.push(slow_head);
264
265 recompute_dom_depth();
266
267 return iffast;
268 }
|
238 register_node(iff, outer_loop, entry, dom_depth(entry));
239 ProjNode* iffast = new (C, 1) IfTrueNode(iff);
240 register_node(iffast, outer_loop, iff, dom_depth(iff));
241 ProjNode* ifslow = new (C, 1) IfFalseNode(iff);
242 register_node(ifslow, outer_loop, iff, dom_depth(iff));
243
244 // Clone the loop body. The clone becomes the fast loop. The
245 // original pre-header will (illegally) have 3 control users
246 // (old & new loops & new if).
247 clone_loop(loop, old_new, dom_depth(head), iff);
248 assert(old_new[head->_idx]->is_Loop(), "" );
249
250 // Fast (true) control
251 Node* iffast_pred = clone_loop_predicates(entry, iffast, !counted_loop);
252 _igvn.hash_delete(head);
253 head->set_req(LoopNode::EntryControl, iffast_pred);
254 set_idom(head, iffast_pred, dom_depth(head));
255 _igvn._worklist.push(head);
256
257 // Slow (false) control
258 Node* ifslow_pred = clone_loop_predicates(entry, ifslow, !counted_loop);
259 LoopNode* slow_head = old_new[head->_idx]->as_Loop();
260 _igvn.hash_delete(slow_head);
261 slow_head->set_req(LoopNode::EntryControl, ifslow_pred);
262 set_idom(slow_head, ifslow_pred, dom_depth(slow_head));
263 _igvn._worklist.push(slow_head);
264
265 recompute_dom_depth();
266
267 return iffast;
268 }
|