Mercurial > hg > graal-compiler
changeset 4682:7cb57ac24ab8
Better ConvertDeoptimizeToGuardPhase (experimental).
Spelling fixes.
author | Andreas Woess <andreas.woess@jku.at> |
---|---|
date | Fri, 24 Feb 2012 13:42:24 +0100 |
parents | 84e7d6690293 |
children | f5c1bd9c70b9 |
files | graal/com.oracle.max.graal.alloc/src/com/oracle/max/graal/alloc/util/RegisterVerifier.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/SchedulePhase.java |
diffstat | 3 files changed, 41 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- 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);
--- 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<DeoptimizeNode> 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<EndNode> 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); + } + } }
--- 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; }