Mercurial > hg > truffle
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();