# HG changeset patch # User Andreas Woess # Date 1330087344 -3600 # Node ID 7cb57ac24ab81682f54c8309c4f9c910e3d0ca9c # Parent 84e7d66902935e636ac7239358c403fdc28e8434 Better ConvertDeoptimizeToGuardPhase (experimental). Spelling fixes. diff -r 84e7d6690293 -r 7cb57ac24ab8 graal/com.oracle.max.graal.alloc/src/com/oracle/max/graal/alloc/util/RegisterVerifier.java --- a/graal/com.oracle.max.graal.alloc/src/com/oracle/max/graal/alloc/util/RegisterVerifier.java Thu Feb 23 16:57:05 2012 -0800 +++ b/graal/com.oracle.max.graal.alloc/src/com/oracle/max/graal/alloc/util/RegisterVerifier.java Fri Feb 24 13:42:24 2012 +0100 @@ -145,7 +145,7 @@ if (savedValue != inputValue) { // Current inputState and previous savedState assume a different value in this register. // Assume that this register is invalid and remove it from the saved state. - Debug.log(" invalididating %s because it is inconsistent with %s", savedValue, inputValue); + Debug.log(" invalidating %s because it is inconsistent with %s", savedValue, inputValue); iter.remove(); // Must re-visit this block. addToWorkList(succ); diff -r 84e7d6690293 -r 7cb57ac24ab8 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java Thu Feb 23 16:57:05 2012 -0800 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java Fri Feb 24 13:42:24 2012 +0100 @@ -24,8 +24,10 @@ import java.util.*; +import com.oracle.max.graal.debug.*; import com.oracle.max.graal.graph.*; import com.oracle.max.graal.nodes.*; +import com.oracle.max.graal.nodes.util.*; public class ConvertDeoptimizeToGuardPhase extends Phase { @@ -42,32 +44,48 @@ @Override protected void run(final StructuredGraph graph) { - List nodes = graph.getNodes(DeoptimizeNode.class).snapshot(); - if (nodes.size() == 0) { + if (graph.getNodes(DeoptimizeNode.class).isEmpty()) { return; } - for (DeoptimizeNode d : nodes) { - BeginNode myBeginNode = findBeginNode(d); - Node controlSplit = myBeginNode.predecessor(); - - if (controlSplit instanceof IfNode) { - IfNode ifNode = (IfNode) controlSplit; - BeginNode otherBegin = ifNode.trueSuccessor(); - BooleanNode conditionNode = ifNode.compare(); - if (myBeginNode == ifNode.trueSuccessor()) { - conditionNode = conditionNode.negate(); - otherBegin = ifNode.falseSuccessor(); - } - BeginNode ifBlockBegin = findBeginNode(ifNode); - graph.unique(new GuardNode(conditionNode, ifBlockBegin)); - otherBegin.replaceAtUsages(ifBlockBegin); - FixedNode next = otherBegin.next(); - otherBegin.setNext(null); - ifNode.replaceAtPredecessors(next); - } + for (DeoptimizeNode d : graph.getNodes(DeoptimizeNode.class)) { + visitDeoptBranch(findBeginNode(d), d, graph); } new DeadCodeEliminationPhase().apply(graph); } + + private void visitDeoptBranch(BeginNode deoptBegin, DeoptimizeNode deopt, StructuredGraph graph) { + if (deoptBegin instanceof MergeNode) { + MergeNode mergeNode = (MergeNode) deoptBegin; + Debug.log("Eliminating %s followed by %s", mergeNode, deopt); + List ends = mergeNode.forwardEnds().snapshot(); + for (EndNode end : ends) { + if (!end.isDeleted()) { + BeginNode beginNode = findBeginNode(end); + visitDeoptBranch(beginNode, deopt, graph); + } + } + if (!deopt.isDeleted()) { + visitDeoptBranch(findBeginNode(deopt), deopt, graph); + } + } else if (deoptBegin.predecessor() instanceof IfNode) { + IfNode ifNode = (IfNode) deoptBegin.predecessor(); + BeginNode otherBegin = ifNode.trueSuccessor(); + BooleanNode conditionNode = ifNode.compare(); + if (deoptBegin == ifNode.trueSuccessor()) { + conditionNode = conditionNode.negate(); + otherBegin = ifNode.falseSuccessor(); + } + BeginNode ifBlockBegin = findBeginNode(ifNode); + Debug.log("Converting %s on %-5s branch of %s to guard for remaining branch %s. IfBegin=%s", deopt, deoptBegin == ifNode.trueSuccessor() ? "true" : "false", ifNode, otherBegin, ifBlockBegin); + FixedGuardNode guard = graph.add(new FixedGuardNode(conditionNode)); + otherBegin.replaceAtUsages(ifBlockBegin); + FixedNode next = otherBegin.next(); + otherBegin.setNext(null); + guard.setNext(next); + ifNode.replaceAtPredecessors(guard); + GraphUtil.killCFG(ifNode); + } + } } diff -r 84e7d6690293 -r 7cb57ac24ab8 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/SchedulePhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/SchedulePhase.java Thu Feb 23 16:57:05 2012 -0800 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/SchedulePhase.java Fri Feb 24 13:42:24 2012 +0100 @@ -116,7 +116,7 @@ } else if (GraalOptions.ScheduleOutOfLoops && !(n instanceof VirtualObjectFieldNode) && !(n instanceof VirtualObjectNode)) { Block earliestBlock = earliestBlock(n); block = scheduleOutOfLoops(n, latestBlock, earliestBlock); - assert earliestBlock.dominates(block) : "Graph can not be scheduled : inconsisitant for " + n; + assert earliestBlock.dominates(block) : "Graph can not be scheduled : inconsistent for " + n; } else { block = latestBlock; }