Mercurial > hg > graal-jvmci-8
changeset 4620:bd8aca42516f
Merge
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Thu, 16 Feb 2012 17:47:43 +0100 |
parents | a09b44a28e7f (current diff) 97d11635f2bf (diff) |
children | 2ab543f06630 |
files | graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/StructuredGraph.java |
diffstat | 2 files changed, 28 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/BeginNode.java Thu Feb 16 17:47:14 2012 +0100 +++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/BeginNode.java Thu Feb 16 17:47:43 2012 +0100 @@ -25,10 +25,11 @@ import java.util.*; import com.oracle.max.graal.graph.*; +import com.oracle.max.graal.graph.iterators.*; import com.oracle.max.graal.nodes.spi.*; import com.oracle.max.graal.nodes.type.*; -public class BeginNode extends AbstractStateSplit implements LIRLowerable, Simplifiable { +public class BeginNode extends AbstractStateSplit implements LIRLowerable, Simplifiable, Node.IterableNodeType { public BeginNode() { super(StampFactory.illegal()); } @@ -58,15 +59,28 @@ // This begin node is necessary. } else { // This begin node can be removed and all guards moved up to the preceding begin node. - Node prevBegin = prev; + if (!usages().isEmpty()) { + Node prevBegin = prev; + while (!(prevBegin instanceof BeginNode)) { + prevBegin = prevBegin.predecessor(); + } + for (Node usage : usages()) { + tool.addToWorkList(usage); + } + replaceAtUsages(prevBegin); + } + ((StructuredGraph) graph()).removeFixed(this); + } + } + + public void evacuateGuards() { + if (!usages().isEmpty()) { + Node prevBegin = predecessor(); + assert prevBegin != null; while (!(prevBegin instanceof BeginNode)) { prevBegin = prevBegin.predecessor(); } - for (Node usage : usages()) { - tool.addToWorkList(usage); - } replaceAtUsages(prevBegin); - ((StructuredGraph) graph()).removeFixed(this); } } @@ -80,4 +94,8 @@ public void generate(LIRGeneratorTool gen) { // nop } + + public NodeIterable<GuardNode> guards() { + return usages().filter(GuardNode.class); + } }
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/StructuredGraph.java Thu Feb 16 17:47:14 2012 +0100 +++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/StructuredGraph.java Thu Feb 16 17:47:43 2012 +0100 @@ -194,6 +194,7 @@ assert node.usages().isEmpty(); assert survivingSuccessor >= 0 && survivingSuccessor < node.blockSuccessorCount() : "invalid surviving successor " + survivingSuccessor + " for " + node; BeginNode begin = node.blockSuccessor(survivingSuccessor); + begin.evacuateGuards(); FixedNode next = begin.next(); begin.setNext(null); for (int i = 0; i < node.blockSuccessorCount(); i++) { @@ -208,6 +209,7 @@ assert node.usages().isEmpty(); assert survivingSuccessor >= 0 && survivingSuccessor < node.blockSuccessorCount() : "invalid surviving successor " + survivingSuccessor + " for " + node; BeginNode begin = node.blockSuccessor(survivingSuccessor); + begin.evacuateGuards(); FixedNode next = begin.next(); begin.setNext(null); for (int i = 0; i < node.blockSuccessorCount(); i++) { @@ -240,6 +242,7 @@ assert node != null && replacement != null && node.isAlive() && replacement.isAlive() : "cannot replace " + node + " with " + replacement; assert survivingSuccessor >= 0 && survivingSuccessor < node.blockSuccessorCount() : "invalid surviving successor " + survivingSuccessor + " for " + node; BeginNode begin = node.blockSuccessor(survivingSuccessor); + begin.evacuateGuards(); FixedNode next = begin.next(); begin.setNext(null); for (int i = 0; i < node.blockSuccessorCount(); i++) { @@ -254,6 +257,7 @@ assert node != null && replacement != null && node.isAlive() && replacement.isAlive() : "cannot replace " + node + " with " + replacement; assert survivingSuccessor >= 0 && survivingSuccessor < node.blockSuccessorCount() : "invalid surviving successor " + survivingSuccessor + " for " + node; BeginNode begin = node.blockSuccessor(survivingSuccessor); + begin.evacuateGuards(); FixedNode next = begin.next(); begin.setNext(null); for (int i = 0; i < node.blockSuccessorCount(); i++) {