# HG changeset patch # User Doug Simon # Date 1351093206 -7200 # Node ID 542c0184ee90e4069087b36e95b4c6c795bcec32 # Parent f182f58459fac8c87f09bd9658f6640b1d3d6f4b re-add successor of a canonicalized fixed node to the canonicalization work list as the removal may have presented new canonicalization opportunities for the successor diff -r f182f58459fa -r 542c0184ee90 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/SimplifierTool.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/SimplifierTool.java Wed Oct 24 17:37:03 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/SimplifierTool.java Wed Oct 24 17:40:06 2012 +0200 @@ -25,8 +25,14 @@ import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; - +/** + * @see Simplifiable + */ public interface SimplifierTool extends CanonicalizerTool { void deleteBranch(FixedNode branch); + + /** + * Adds a node to the worklist independent of whether it has already been on the worklist. + */ void addToWorkList(Node node); } diff -r f182f58459fa -r 542c0184ee90 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java Wed Oct 24 17:37:03 2012 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java Wed Oct 24 17:40:06 2012 +0200 @@ -216,23 +216,29 @@ } } else { assert node instanceof FixedWithNextNode && node.predecessor() != null : node + " -> " + canonical + " : node should be fixed & connected (" + node.predecessor() + ")"; + FixedWithNextNode fixedWithNext = (FixedWithNextNode) node; + + // When removing a fixed node, new canonicalization opportunities for its successor may arise + assert fixedWithNext.next() != null; + tool.addToWorkList(fixedWithNext.next()); + if (canonical == null) { // case 3 - graph.removeFixed((FixedWithNextNode) node); + graph.removeFixed(fixedWithNext); } else if (canonical instanceof FloatingNode) { // case 4 - graph.replaceFixedWithFloating((FixedWithNextNode) node, (FloatingNode) canonical); + graph.replaceFixedWithFloating(fixedWithNext, (FloatingNode) canonical); } else { assert canonical instanceof FixedNode; if (canonical.predecessor() == null) { assert !canonical.cfgSuccessors().iterator().hasNext() : "replacement " + canonical + " shouldn't have successors"; // case 5 - graph.replaceFixedWithFixed((FixedWithNextNode) node, (FixedWithNextNode) canonical); + graph.replaceFixedWithFixed(fixedWithNext, (FixedWithNextNode) canonical); } else { assert canonical.cfgSuccessors().iterator().hasNext() : "replacement " + canonical + " should have successors"; // case 6 node.replaceAtUsages(canonical); - graph.removeFixed((FixedWithNextNode) node); + graph.removeFixed(fixedWithNext); } } } @@ -321,7 +327,7 @@ @Override public void addToWorkList(Node node) { - nodeWorkSet.add(node); + nodeWorkSet.addAgain(node); } @Override