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