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