src/share/vm/opto/loopUnswitch.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 8034812 Sdiff src/share/vm/opto

src/share/vm/opto/loopUnswitch.cpp

Print this page




 208   }
 209 #endif
 210 
 211   C->set_major_progress();
 212 }
 213 
 214 //-------------------------create_slow_version_of_loop------------------------
 215 // Create a slow version of the loop by cloning the loop
 216 // and inserting an if to select fast-slow versions.
 217 // Return control projection of the entry to the fast version.
 218 ProjNode* PhaseIdealLoop::create_slow_version_of_loop(IdealLoopTree *loop,
 219                                                       Node_List &old_new) {
 220   LoopNode* head  = loop->_head->as_Loop();
 221   bool counted_loop = head->is_CountedLoop();
 222   Node*     entry = head->in(LoopNode::EntryControl);
 223   _igvn.rehash_node_delayed(entry);
 224   IdealLoopTree* outer_loop = loop->_parent;
 225 
 226   Node *cont      = _igvn.intcon(1);
 227   set_ctrl(cont, C->root());
 228   Node* opq       = new (C) Opaque1Node(C, cont);
 229   register_node(opq, outer_loop, entry, dom_depth(entry));
 230   Node *bol       = new (C) Conv2BNode(opq);
 231   register_node(bol, outer_loop, entry, dom_depth(entry));
 232   IfNode* iff = new (C) IfNode(entry, bol, PROB_MAX, COUNT_UNKNOWN);
 233   register_node(iff, outer_loop, entry, dom_depth(entry));
 234   ProjNode* iffast = new (C) IfTrueNode(iff);
 235   register_node(iffast, outer_loop, iff, dom_depth(iff));
 236   ProjNode* ifslow = new (C) IfFalseNode(iff);
 237   register_node(ifslow, outer_loop, iff, dom_depth(iff));
 238 
 239   // Clone the loop body.  The clone becomes the fast loop.  The
 240   // original pre-header will (illegally) have 3 control users
 241   // (old & new loops & new if).
 242   clone_loop(loop, old_new, dom_depth(head), iff);
 243   assert(old_new[head->_idx]->is_Loop(), "" );
 244 
 245   // Fast (true) control
 246   Node* iffast_pred = clone_loop_predicates(entry, iffast, !counted_loop);
 247   _igvn.replace_input_of(head, LoopNode::EntryControl, iffast_pred);
 248   set_idom(head, iffast_pred, dom_depth(head));
 249 
 250   // Slow (false) control
 251   Node* ifslow_pred = clone_loop_predicates(entry, ifslow, !counted_loop);
 252   LoopNode* slow_head = old_new[head->_idx]->as_Loop();
 253   _igvn.replace_input_of(slow_head, LoopNode::EntryControl, ifslow_pred);
 254   set_idom(slow_head, ifslow_pred, dom_depth(slow_head));
 255 
 256   recompute_dom_depth();


 208   }
 209 #endif
 210 
 211   C->set_major_progress();
 212 }
 213 
 214 //-------------------------create_slow_version_of_loop------------------------
 215 // Create a slow version of the loop by cloning the loop
 216 // and inserting an if to select fast-slow versions.
 217 // Return control projection of the entry to the fast version.
 218 ProjNode* PhaseIdealLoop::create_slow_version_of_loop(IdealLoopTree *loop,
 219                                                       Node_List &old_new) {
 220   LoopNode* head  = loop->_head->as_Loop();
 221   bool counted_loop = head->is_CountedLoop();
 222   Node*     entry = head->in(LoopNode::EntryControl);
 223   _igvn.rehash_node_delayed(entry);
 224   IdealLoopTree* outer_loop = loop->_parent;
 225 
 226   Node *cont      = _igvn.intcon(1);
 227   set_ctrl(cont, C->root());
 228   Node* opq       = new Opaque1Node(C, cont);
 229   register_node(opq, outer_loop, entry, dom_depth(entry));
 230   Node *bol       = new Conv2BNode(opq);
 231   register_node(bol, outer_loop, entry, dom_depth(entry));
 232   IfNode* iff = new IfNode(entry, bol, PROB_MAX, COUNT_UNKNOWN);
 233   register_node(iff, outer_loop, entry, dom_depth(entry));
 234   ProjNode* iffast = new IfTrueNode(iff);
 235   register_node(iffast, outer_loop, iff, dom_depth(iff));
 236   ProjNode* ifslow = new IfFalseNode(iff);
 237   register_node(ifslow, outer_loop, iff, dom_depth(iff));
 238 
 239   // Clone the loop body.  The clone becomes the fast loop.  The
 240   // original pre-header will (illegally) have 3 control users
 241   // (old & new loops & new if).
 242   clone_loop(loop, old_new, dom_depth(head), iff);
 243   assert(old_new[head->_idx]->is_Loop(), "" );
 244 
 245   // Fast (true) control
 246   Node* iffast_pred = clone_loop_predicates(entry, iffast, !counted_loop);
 247   _igvn.replace_input_of(head, LoopNode::EntryControl, iffast_pred);
 248   set_idom(head, iffast_pred, dom_depth(head));
 249 
 250   // Slow (false) control
 251   Node* ifslow_pred = clone_loop_predicates(entry, ifslow, !counted_loop);
 252   LoopNode* slow_head = old_new[head->_idx]->as_Loop();
 253   _igvn.replace_input_of(slow_head, LoopNode::EntryControl, ifslow_pred);
 254   set_idom(slow_head, ifslow_pred, dom_depth(slow_head));
 255 
 256   recompute_dom_depth();
src/share/vm/opto/loopUnswitch.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File