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)); |