changeset 11308:77167d6f868c

Fix forward propagation of guarded nodes in ConvertDeoptimizeToGuardPhase.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Wed, 14 Aug 2013 17:02:45 +0200
parents da412706d0fd
children 2f216d44bce4
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java
diffstat 2 files changed, 13 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java	Wed Aug 14 15:44:05 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java	Wed Aug 14 17:02:45 2013 +0200
@@ -115,6 +115,7 @@
                 ifNode = graph().add(new IfNode(condition, next, deopt, 1));
             }
             ((FixedWithNextNode) predecessor()).setNext(ifNode);
+            this.replaceAtUsages(next.predecessor());
             GraphUtil.killWithUnusedFloatingInputs(this);
         }
     }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java	Wed Aug 14 15:44:05 2013 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java	Wed Aug 14 17:02:45 2013 +0200
@@ -79,10 +79,20 @@
             LogicNode conditionNode = ifNode.condition();
             FixedGuardNode guard = graph.add(new FixedGuardNode(conditionNode, deopt.reason(), deopt.action(), deoptBegin == ifNode.trueSuccessor()));
             FixedWithNextNode pred = (FixedWithNextNode) ifNode.predecessor();
+            AbstractBeginNode survivingSuccessor;
             if (deoptBegin == ifNode.trueSuccessor()) {
-                graph.removeSplitPropagate(ifNode, ifNode.falseSuccessor());
+                survivingSuccessor = ifNode.falseSuccessor();
             } else {
-                graph.removeSplitPropagate(ifNode, ifNode.trueSuccessor());
+                survivingSuccessor = ifNode.trueSuccessor();
+            }
+            graph.removeSplitPropagate(ifNode, survivingSuccessor);
+            for (Node n : survivingSuccessor.usages().snapshot()) {
+                if (n instanceof GuardNode || n instanceof ProxyNode) {
+                    // Keep wired to the begin node.
+                } else {
+                    // Rewire to the fixed guard.
+                    n.replaceFirstInput(survivingSuccessor, guard);
+                }
             }
             Debug.log("Converting %s on %-5s branch of %s to guard for remaining branch %s.", deopt, deoptBegin == ifNode.trueSuccessor() ? "true" : "false", ifNode, otherBegin);
             FixedNode next = pred.next();