# HG changeset patch # User Thomas Wuerthinger # Date 1363712735 -3600 # Node ID 496db8bf756d723eed479526cdfb80f1cd0cfdad # Parent 25691fcb505a408f350330aeafb15958f9d1cb52 Killing cfg path to deoptimization. diff -r 25691fcb505a -r 496db8bf756d 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 Tue Mar 19 14:13:51 2013 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java Tue Mar 19 18:05:35 2013 +0100 @@ -28,6 +28,7 @@ import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.java.*; +import com.oracle.graal.nodes.util.*; import com.oracle.graal.phases.*; public class ConvertDeoptimizeToGuardPhase extends Phase { @@ -75,27 +76,36 @@ visitDeoptBegin(findBeginNode(deopt), deopt, graph); } } + return; } else if (deoptBegin.predecessor() instanceof IfNode) { IfNode ifNode = (IfNode) deoptBegin.predecessor(); BeginNode otherBegin = ifNode.trueSuccessor(); LogicNode conditionNode = ifNode.condition(); - if (conditionNode instanceof InstanceOfNode || conditionNode instanceof InstanceOfDynamicNode) { + if (!(conditionNode instanceof InstanceOfNode) && !(conditionNode instanceof InstanceOfDynamicNode)) { // TODO The lowering currently does not support a FixedGuard as the usage of an // InstanceOfNode. Relax this restriction. + FixedGuardNode guard = graph.add(new FixedGuardNode(conditionNode, deopt.reason(), deopt.action(), deoptBegin == ifNode.trueSuccessor())); + FixedWithNextNode pred = (FixedWithNextNode) ifNode.predecessor(); + if (deoptBegin == ifNode.trueSuccessor()) { + graph.removeSplitPropagate(ifNode, ifNode.falseSuccessor()); + } else { + graph.removeSplitPropagate(ifNode, ifNode.trueSuccessor()); + } + 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(); + pred.setNext(guard); + guard.setNext(next); return; } - FixedGuardNode guard = graph.add(new FixedGuardNode(conditionNode, deopt.reason(), deopt.action(), deoptBegin == ifNode.trueSuccessor())); - FixedWithNextNode pred = (FixedWithNextNode) ifNode.predecessor(); - if (deoptBegin == ifNode.trueSuccessor()) { - graph.removeSplitPropagate(ifNode, ifNode.falseSuccessor()); - } else { - graph.removeSplitPropagate(ifNode, ifNode.trueSuccessor()); - } - 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(); - pred.setNext(guard); - guard.setNext(next); - Debug.dump(graph, "After introducing fixed guard %s", guard); + } + + // We could not convert the control split - at least cut off control flow after the split. + FixedNode next = deoptBegin.next(); + if (next != deopt) { + FixedWithNextNode pred = (FixedWithNextNode) deopt.predecessor(); + pred.setNext(null); + deoptBegin.setNext(deopt); + GraphUtil.killCFG(next); } } }