# HG changeset patch # User Thomas Wuerthinger # Date 1376492565 -7200 # Node ID 77167d6f868c62150c634ffdf14970b914cf389a # Parent da412706d0fd404e078122a7195a36893b20eb1c Fix forward propagation of guarded nodes in ConvertDeoptimizeToGuardPhase. diff -r da412706d0fd -r 77167d6f868c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java --- 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); } } diff -r da412706d0fd -r 77167d6f868c graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java --- 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();