# HG changeset patch # User Gilles Duboscq # Date 1329410863 -3600 # Node ID bd8aca42516f6e25ddb694b40726e4eaa1fdc9d5 # Parent a09b44a28e7f91a21a236ef3edefd1b058d45c5a# Parent 97d11635f2bfb26e351ab24f8f2bc521fb397326 Merge diff -r a09b44a28e7f -r bd8aca42516f graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/BeginNode.java --- 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 guards() { + return usages().filter(GuardNode.class); + } } diff -r a09b44a28e7f -r bd8aca42516f graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/StructuredGraph.java --- 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++) {