< prev index next >

src/hotspot/share/opto/loopopts.cpp

Print this page
rev 48506 : [mq]: JDK-8194992


1714       }
1715 
1716       // If 'use' was in the loop-exit block, it now needs to be sunk
1717       // below the post-loop merge point.
1718       sink_use( use, prev );
1719     }
1720   }
1721 }
1722 
1723 void PhaseIdealLoop::clone_outer_loop(LoopNode* head, CloneLoopMode mode, IdealLoopTree *loop,
1724                                       IdealLoopTree* outer_loop, int dd, Node_List &old_new,
1725                                       Node_List& extra_data_nodes) {
1726   if (head->is_strip_mined() && mode != IgnoreStripMined) {
1727     CountedLoopNode* cl = head->as_CountedLoop();
1728     Node* l = cl->outer_loop();
1729     Node* tail = cl->outer_loop_tail();
1730     IfNode* le = cl->outer_loop_end();
1731     Node* sfpt = cl->outer_safepoint();
1732     CountedLoopEndNode* cle = cl->loopexit();
1733     CountedLoopNode* new_cl = old_new[cl->_idx]->as_CountedLoop();
1734     CountedLoopEndNode* new_cle = new_cl->as_CountedLoop()->loopexit();
1735     Node* cle_out = cle->proj_out(false);
1736 
1737     Node* new_sfpt = NULL;
1738     Node* new_cle_out = cle_out->clone();
1739     old_new.map(cle_out->_idx, new_cle_out);
1740     if (mode == CloneIncludesStripMined) {
1741       // clone outer loop body
1742       Node* new_l = l->clone();
1743       Node* new_tail = tail->clone();
1744       IfNode* new_le = le->clone()->as_If();
1745       new_sfpt = sfpt->clone();
1746 
1747       set_loop(new_l, outer_loop->_parent);
1748       set_idom(new_l, new_l->in(LoopNode::EntryControl), dd);
1749       set_loop(new_cle_out, outer_loop->_parent);
1750       set_idom(new_cle_out, new_cle, dd);
1751       set_loop(new_sfpt, outer_loop->_parent);
1752       set_idom(new_sfpt, new_cle_out, dd);
1753       set_loop(new_le, outer_loop->_parent);
1754       set_idom(new_le, new_sfpt, dd);




1714       }
1715 
1716       // If 'use' was in the loop-exit block, it now needs to be sunk
1717       // below the post-loop merge point.
1718       sink_use( use, prev );
1719     }
1720   }
1721 }
1722 
1723 void PhaseIdealLoop::clone_outer_loop(LoopNode* head, CloneLoopMode mode, IdealLoopTree *loop,
1724                                       IdealLoopTree* outer_loop, int dd, Node_List &old_new,
1725                                       Node_List& extra_data_nodes) {
1726   if (head->is_strip_mined() && mode != IgnoreStripMined) {
1727     CountedLoopNode* cl = head->as_CountedLoop();
1728     Node* l = cl->outer_loop();
1729     Node* tail = cl->outer_loop_tail();
1730     IfNode* le = cl->outer_loop_end();
1731     Node* sfpt = cl->outer_safepoint();
1732     CountedLoopEndNode* cle = cl->loopexit();
1733     CountedLoopNode* new_cl = old_new[cl->_idx]->as_CountedLoop();
1734     CountedLoopEndNode* new_cle = new_cl->as_CountedLoop()->loopexit_or_null();
1735     Node* cle_out = cle->proj_out(false);
1736 
1737     Node* new_sfpt = NULL;
1738     Node* new_cle_out = cle_out->clone();
1739     old_new.map(cle_out->_idx, new_cle_out);
1740     if (mode == CloneIncludesStripMined) {
1741       // clone outer loop body
1742       Node* new_l = l->clone();
1743       Node* new_tail = tail->clone();
1744       IfNode* new_le = le->clone()->as_If();
1745       new_sfpt = sfpt->clone();
1746 
1747       set_loop(new_l, outer_loop->_parent);
1748       set_idom(new_l, new_l->in(LoopNode::EntryControl), dd);
1749       set_loop(new_cle_out, outer_loop->_parent);
1750       set_idom(new_cle_out, new_cle, dd);
1751       set_loop(new_sfpt, outer_loop->_parent);
1752       set_idom(new_sfpt, new_cle_out, dd);
1753       set_loop(new_le, outer_loop->_parent);
1754       set_idom(new_le, new_sfpt, dd);


< prev index next >