hotspot/src/share/vm/opto/loopUnswitch.cpp
changeset 34164 a9e6034d7707
parent 33166 81352250770f
child 34174 4db2fb26dc49
equal deleted inserted replaced
34163:513739bb6c10 34164:a9e6034d7707
   130   // Need to revert back to normal loop
   130   // Need to revert back to normal loop
   131   if (head->is_CountedLoop() && !head->as_CountedLoop()->is_normal_loop()) {
   131   if (head->is_CountedLoop() && !head->as_CountedLoop()->is_normal_loop()) {
   132     head->as_CountedLoop()->set_normal_loop();
   132     head->as_CountedLoop()->set_normal_loop();
   133   }
   133   }
   134 
   134 
   135   ProjNode* proj_true = create_slow_version_of_loop(loop, old_new);
   135   ProjNode* proj_true = create_slow_version_of_loop(loop, old_new, unswitch_iff->Opcode());
   136 
   136 
   137 #ifdef ASSERT
   137 #ifdef ASSERT
   138   Node* uniqc = proj_true->unique_ctrl_out();
   138   Node* uniqc = proj_true->unique_ctrl_out();
   139   Node* entry = head->in(LoopNode::EntryControl);
   139   Node* entry = head->in(LoopNode::EntryControl);
   140   Node* predicate = find_predicate(entry);
   140   Node* predicate = find_predicate(entry);
   220 //-------------------------create_slow_version_of_loop------------------------
   220 //-------------------------create_slow_version_of_loop------------------------
   221 // Create a slow version of the loop by cloning the loop
   221 // Create a slow version of the loop by cloning the loop
   222 // and inserting an if to select fast-slow versions.
   222 // and inserting an if to select fast-slow versions.
   223 // Return control projection of the entry to the fast version.
   223 // Return control projection of the entry to the fast version.
   224 ProjNode* PhaseIdealLoop::create_slow_version_of_loop(IdealLoopTree *loop,
   224 ProjNode* PhaseIdealLoop::create_slow_version_of_loop(IdealLoopTree *loop,
   225                                                       Node_List &old_new) {
   225                                                       Node_List &old_new,
       
   226                                                       int opcode) {
   226   LoopNode* head  = loop->_head->as_Loop();
   227   LoopNode* head  = loop->_head->as_Loop();
   227   bool counted_loop = head->is_CountedLoop();
   228   bool counted_loop = head->is_CountedLoop();
   228   Node*     entry = head->in(LoopNode::EntryControl);
   229   Node*     entry = head->in(LoopNode::EntryControl);
   229   _igvn.rehash_node_delayed(entry);
   230   _igvn.rehash_node_delayed(entry);
   230   IdealLoopTree* outer_loop = loop->_parent;
   231   IdealLoopTree* outer_loop = loop->_parent;
   233   set_ctrl(cont, C->root());
   234   set_ctrl(cont, C->root());
   234   Node* opq       = new Opaque1Node(C, cont);
   235   Node* opq       = new Opaque1Node(C, cont);
   235   register_node(opq, outer_loop, entry, dom_depth(entry));
   236   register_node(opq, outer_loop, entry, dom_depth(entry));
   236   Node *bol       = new Conv2BNode(opq);
   237   Node *bol       = new Conv2BNode(opq);
   237   register_node(bol, outer_loop, entry, dom_depth(entry));
   238   register_node(bol, outer_loop, entry, dom_depth(entry));
   238   IfNode* iff = new IfNode(entry, bol, PROB_MAX, COUNT_UNKNOWN);
   239   IfNode* iff = (opcode == Op_RangeCheck) ? new RangeCheckNode(entry, bol, PROB_MAX, COUNT_UNKNOWN) :
       
   240     new IfNode(entry, bol, PROB_MAX, COUNT_UNKNOWN);
   239   register_node(iff, outer_loop, entry, dom_depth(entry));
   241   register_node(iff, outer_loop, entry, dom_depth(entry));
   240   ProjNode* iffast = new IfTrueNode(iff);
   242   ProjNode* iffast = new IfTrueNode(iff);
   241   register_node(iffast, outer_loop, iff, dom_depth(iff));
   243   register_node(iffast, outer_loop, iff, dom_depth(iff));
   242   ProjNode* ifslow = new IfFalseNode(iff);
   244   ProjNode* ifslow = new IfFalseNode(iff);
   243   register_node(ifslow, outer_loop, iff, dom_depth(iff));
   245   register_node(ifslow, outer_loop, iff, dom_depth(iff));