< prev index next >

src/hotspot/share/opto/split_if.cpp

Print this page

 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  *
 23  */
 24 
 25 #include "opto/addnode.hpp"
 26 #include "opto/node.hpp"
 27 #include "precompiled.hpp"
 28 #include "memory/allocation.inline.hpp"
 29 #include "opto/callnode.hpp"

 30 #include "opto/loopnode.hpp"
 31 #include "opto/movenode.hpp"
 32 #include "opto/opaquenode.hpp"
 33 
 34 
 35 //------------------------------split_thru_region------------------------------
 36 // Split Node 'n' through merge point.
 37 RegionNode* PhaseIdealLoop::split_thru_region(Node* n, RegionNode* region) {
 38   assert(n->is_CFG(), "");
 39   RegionNode* r = new RegionNode(region->req());
 40   IdealLoopTree* loop = get_loop(n);
 41   for (uint i = 1; i < region->req(); i++) {
 42     Node* x = n->clone();
 43     Node* in0 = n->in(0);
 44     if (in0->in(0) == region) x->set_req(0, in0->in(i));
 45     for (uint j = 1; j < n->req(); j++) {
 46       Node* in = n->in(j);
 47       if (get_ctrl(in) == region) {
 48         x->set_req(j, in->in(i));
 49       }

614       Node* n = region->out(i);
615       if( n == region ) continue;
616       // The IF to be split is OK.
617       if( n == iff ) continue;
618       if( !n->is_Phi() ) {      // Found pinned memory op or such
619         if (split_up(n, region, iff)) {
620           i = region->refresh_out_pos(i);
621           progress = true;
622         }
623         continue;
624       }
625       assert( n->in(0) == region, "" );
626 
627       // Recursively split up all users of a Phi
628       for (j = n->outs(); n->has_out(j); j++) {
629         Node* m = n->out(j);
630         // If m is dead, throw it away, and declare progress
631         if (_loop_or_ctrl[m->_idx] == nullptr) {
632           _igvn.remove_dead_node(m);
633           // fall through
634         }
635         else if (m != iff && split_up(m, region, iff)) {
636           // fall through
637         } else {
638           continue;
639         }
640         // Something unpredictable changed.
641         // Tell the iterators to refresh themselves, and rerun the loop.
642         i = region->refresh_out_pos(i);
643         j = region->refresh_out_pos(j);
644         progress = true;
645       }
646     }
647   }
648 
649   // Now we have no instructions in the block containing the IF.
650   // Split the IF.
651   RegionNode *new_iff = split_thru_region(iff, region);
652 
653   // Replace both uses of 'new_iff' with Regions merging True/False
654   // paths.  This makes 'new_iff' go dead.
655   Node *old_false = nullptr, *old_true = nullptr;

 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  *
 23  */
 24 
 25 #include "opto/addnode.hpp"
 26 #include "opto/node.hpp"
 27 #include "precompiled.hpp"
 28 #include "memory/allocation.inline.hpp"
 29 #include "opto/callnode.hpp"
 30 #include "opto/inlinetypenode.hpp"
 31 #include "opto/loopnode.hpp"
 32 #include "opto/movenode.hpp"
 33 #include "opto/opaquenode.hpp"
 34 
 35 
 36 //------------------------------split_thru_region------------------------------
 37 // Split Node 'n' through merge point.
 38 RegionNode* PhaseIdealLoop::split_thru_region(Node* n, RegionNode* region) {
 39   assert(n->is_CFG(), "");
 40   RegionNode* r = new RegionNode(region->req());
 41   IdealLoopTree* loop = get_loop(n);
 42   for (uint i = 1; i < region->req(); i++) {
 43     Node* x = n->clone();
 44     Node* in0 = n->in(0);
 45     if (in0->in(0) == region) x->set_req(0, in0->in(i));
 46     for (uint j = 1; j < n->req(); j++) {
 47       Node* in = n->in(j);
 48       if (get_ctrl(in) == region) {
 49         x->set_req(j, in->in(i));
 50       }

615       Node* n = region->out(i);
616       if( n == region ) continue;
617       // The IF to be split is OK.
618       if( n == iff ) continue;
619       if( !n->is_Phi() ) {      // Found pinned memory op or such
620         if (split_up(n, region, iff)) {
621           i = region->refresh_out_pos(i);
622           progress = true;
623         }
624         continue;
625       }
626       assert( n->in(0) == region, "" );
627 
628       // Recursively split up all users of a Phi
629       for (j = n->outs(); n->has_out(j); j++) {
630         Node* m = n->out(j);
631         // If m is dead, throw it away, and declare progress
632         if (_loop_or_ctrl[m->_idx] == nullptr) {
633           _igvn.remove_dead_node(m);
634           // fall through
635         } else if (m != iff && split_up(m, region, iff)) {

636           // fall through
637         } else {
638           continue;
639         }
640         // Something unpredictable changed.
641         // Tell the iterators to refresh themselves, and rerun the loop.
642         i = region->refresh_out_pos(i);
643         j = region->refresh_out_pos(j);
644         progress = true;
645       }
646     }
647   }
648 
649   // Now we have no instructions in the block containing the IF.
650   // Split the IF.
651   RegionNode *new_iff = split_thru_region(iff, region);
652 
653   // Replace both uses of 'new_iff' with Regions merging True/False
654   // paths.  This makes 'new_iff' go dead.
655   Node *old_false = nullptr, *old_true = nullptr;
< prev index next >