changeset 23147:2d578cb15516

Ensure indirect nodes trigger canonicalization
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Tue, 08 Dec 2015 17:24:35 -0800
parents 5eb7281c661c
children fea7e5ffe8ce
files graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/memory/address/AddressNode.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/util/HashSetNodeEventListener.java
diffstat 4 files changed, 21 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Tue Dec 08 12:30:15 2015 -0800
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Tue Dec 08 17:24:35 2015 -0800
@@ -201,6 +201,13 @@
     public interface ValueNumberable {
     }
 
+    /**
+     * Marker interface for nodes that contains other nodes. When the inputs to this node changes,
+     * users of this node should also be placed on the work list for canonicalization.
+     */
+    public interface IndirectCanonicalization {
+    }
+
     private Graph graph;
     int id;
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/memory/address/AddressNode.java	Tue Dec 08 12:30:15 2015 -0800
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/memory/address/AddressNode.java	Tue Dec 08 17:24:35 2015 -0800
@@ -24,6 +24,7 @@
 
 import com.oracle.graal.compiler.common.type.StampFactory;
 import com.oracle.graal.graph.NodeClass;
+import com.oracle.graal.graph.Node.IndirectCanonicalization;
 import com.oracle.graal.nodeinfo.InputType;
 import com.oracle.graal.nodeinfo.NodeInfo;
 import com.oracle.graal.nodeinfo.StructuralInput;
@@ -33,7 +34,7 @@
  * Base class for nodes that deal with addressing calculation.
  */
 @NodeInfo(allowedUsageTypes = InputType.Association)
-public abstract class AddressNode extends FloatingNode {
+public abstract class AddressNode extends FloatingNode implements IndirectCanonicalization {
     public static final NodeClass<AddressNode> TYPE = NodeClass.create(AddressNode.class);
 
     protected AddressNode(NodeClass<? extends AddressNode> c) {
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java	Tue Dec 08 12:30:15 2015 -0800
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java	Tue Dec 08 17:24:35 2015 -0800
@@ -33,6 +33,7 @@
 import com.oracle.graal.graph.Graph.NodeEventListener;
 import com.oracle.graal.graph.Graph.NodeEventScope;
 import com.oracle.graal.graph.Node;
+import com.oracle.graal.graph.Node.IndirectCanonicalization;
 import com.oracle.graal.graph.NodeClass;
 import com.oracle.graal.graph.NodeWorkList;
 import com.oracle.graal.graph.spi.Canonicalizable;
@@ -186,6 +187,11 @@
 
                 public void inputChanged(Node node) {
                     workList.add(node);
+                    if (node instanceof IndirectCanonicalization) {
+                        for (Node usage : node.usages()) {
+                            workList.add(usage);
+                        }
+                    }
                 }
 
                 public void usagesDroppedToZero(Node node) {
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/util/HashSetNodeEventListener.java	Tue Dec 08 12:30:15 2015 -0800
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/util/HashSetNodeEventListener.java	Tue Dec 08 17:24:35 2015 -0800
@@ -28,6 +28,7 @@
 
 import com.oracle.graal.graph.Graph.NodeEvent;
 import com.oracle.graal.graph.Graph.NodeEventListener;
+import com.oracle.graal.graph.Node.IndirectCanonicalization;
 import com.oracle.graal.graph.Node;
 
 /**
@@ -67,6 +68,11 @@
     public void event(NodeEvent e, Node node) {
         if (filter.contains(e)) {
             nodes.add(node);
+            if (node instanceof IndirectCanonicalization) {
+                for (Node usage : node.usages()) {
+                    nodes.add(usage);
+                }
+            }
         }
     }