9 * This code is distributed in the hope that it will be useful, but WITHOUT
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 "precompiled.hpp"
26 #include "memory/allocation.inline.hpp"
27 #include "opto/addnode.hpp"
28 #include "opto/callnode.hpp"
29 #include "opto/loopnode.hpp"
30 #include "opto/movenode.hpp"
31 #include "opto/node.hpp"
32 #include "opto/opaquenode.hpp"
33 #include "opto/predicates.hpp"
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));
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 }
636 else if (m != iff && split_up(m, region, iff)) {
637 // fall through
638 } else {
639 continue;
640 }
641 // Something unpredictable changed.
642 // Tell the iterators to refresh themselves, and rerun the loop.
643 i = region->refresh_out_pos(i);
644 j = region->refresh_out_pos(j);
645 progress = true;
646 }
647 }
648 }
649
650 // Now we have no instructions in the block containing the IF.
651 // Split the IF.
652 RegionNode *new_iff = split_thru_region(iff, region);
653
654 // Replace both uses of 'new_iff' with Regions merging True/False
655 // paths. This makes 'new_iff' go dead.
656 Node *old_false = nullptr, *old_true = nullptr;
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT
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 "precompiled.hpp"
26 #include "memory/allocation.inline.hpp"
27 #include "opto/addnode.hpp"
28 #include "opto/callnode.hpp"
29 #include "opto/inlinetypenode.hpp"
30 #include "opto/loopnode.hpp"
31 #include "opto/movenode.hpp"
32 #include "opto/node.hpp"
33 #include "opto/opaquenode.hpp"
34 #include "opto/predicates.hpp"
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));
616 Node* n = region->out(i);
617 if( n == region ) continue;
618 // The IF to be split is OK.
619 if( n == iff ) continue;
620 if( !n->is_Phi() ) { // Found pinned memory op or such
621 if (split_up(n, region, iff)) {
622 i = region->refresh_out_pos(i);
623 progress = true;
624 }
625 continue;
626 }
627 assert( n->in(0) == region, "" );
628
629 // Recursively split up all users of a Phi
630 for (j = n->outs(); n->has_out(j); j++) {
631 Node* m = n->out(j);
632 // If m is dead, throw it away, and declare progress
633 if (_loop_or_ctrl[m->_idx] == nullptr) {
634 _igvn.remove_dead_node(m);
635 // fall through
636 } else if (m != iff && split_up(m, region, iff)) {
637 // fall through
638 } else {
639 continue;
640 }
641 // Something unpredictable changed.
642 // Tell the iterators to refresh themselves, and rerun the loop.
643 i = region->refresh_out_pos(i);
644 j = region->refresh_out_pos(j);
645 progress = true;
646 }
647 }
648 }
649
650 // Now we have no instructions in the block containing the IF.
651 // Split the IF.
652 RegionNode *new_iff = split_thru_region(iff, region);
653
654 // Replace both uses of 'new_iff' with Regions merging True/False
655 // paths. This makes 'new_iff' go dead.
656 Node *old_false = nullptr, *old_true = nullptr;
|