Mercurial > hg > graal-compiler
changeset 6572:542c0184ee90
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
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Wed, 24 Oct 2012 17:40:06 +0200 |
parents | f182f58459fa |
children | 4eba1a717254 |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/SimplifierTool.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java |
diffstat | 2 files changed, 18 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- 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); }
--- 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