changeset 5833:2a9fda4f9f1e

Fix canonicalisation of final reads and factor out read/floating read canonicalization code
author Gilles Duboscq <duboscq@ssw.jku.at>
date Fri, 13 Jul 2012 15:33:02 +0200
parents f489b0c20b56
children 2b786c82e329
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/Access.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java
diffstat 5 files changed, 27 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/Access.java	Fri Jul 13 15:31:53 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/Access.java	Fri Jul 13 15:33:02 2012 +0200
@@ -22,6 +22,7 @@
  */
 package com.oracle.graal.nodes.extended;
 
+import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.*;
 
 public interface Access {
@@ -31,4 +32,6 @@
     LocationNode location();
 
     void setNullCheck(boolean check);
+
+    Node node();
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java	Fri Jul 13 15:31:53 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java	Fri Jul 13 15:33:02 2012 +0200
@@ -22,6 +22,7 @@
  */
 package com.oracle.graal.nodes.extended;
 
+import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.type.*;
 
@@ -52,4 +53,9 @@
         this.object = object;
         this.location = location;
     }
+
+    @Override
+    public Node node() {
+        return this;
+    }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java	Fri Jul 13 15:31:53 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java	Fri Jul 13 15:33:02 2012 +0200
@@ -24,6 +24,7 @@
 
 import java.util.*;
 
+import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.type.*;
@@ -67,4 +68,9 @@
         this.object = object;
         this.location = location;
     }
+
+    @Override
+    public Node node() {
+        return this;
+    }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java	Fri Jul 13 15:31:53 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java	Fri Jul 13 15:33:02 2012 +0200
@@ -24,7 +24,6 @@
 
 import java.util.*;
 
-import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.spi.*;
@@ -59,18 +58,6 @@
 
     @Override
     public ValueNode canonical(CanonicalizerTool tool) {
-        MetaAccessProvider runtime = tool.runtime();
-        if (runtime != null && object() != null && object().isConstant() && object().kind() == Kind.Object) {
-            if (this.location() == LocationNode.FINAL_LOCATION && location().getClass() == LocationNode.class) {
-                Object value = object().asConstant().asObject();
-                long displacement = location().displacement();
-                Kind kind = location().kind();
-                Constant constant = kind.readUnsafeConstant(value, displacement);
-                if (constant != null) {
-                    return ConstantNode.forConstant(constant, runtime, graph());
-                }
-            }
-        }
-        return this;
+        return ReadNode.canonicalizeRead(this, tool);
     }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java	Fri Jul 13 15:31:53 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java	Fri Jul 13 15:33:02 2012 +0200
@@ -42,18 +42,22 @@
 
     @Override
     public ValueNode canonical(CanonicalizerTool tool) {
+        return canonicalizeRead(this, tool);
+    }
+
+    public static ValueNode canonicalizeRead(Access read, CanonicalizerTool tool) {
         MetaAccessProvider runtime = tool.runtime();
-        if (runtime != null && object() != null && object().isConstant() && object().kind() == Kind.Object) {
-            if (location() == LocationNode.FINAL_LOCATION && location().getClass() == LocationNode.class) {
-                Object value = object().asConstant().asObject();
-                long displacement = location().displacement();
-                Kind kind = location().kind();
+        if (runtime != null && read.object() != null && read.object().isConstant() && read.object().kind() == Kind.Object) {
+            if (read.location().locationIdentity() == LocationNode.FINAL_LOCATION && read.location().getClass() == LocationNode.class) {
+                Object value = read.object().asConstant().asObject();
+                long displacement = read.location().displacement();
+                Kind kind = read.location().kind();
                 Constant constant = kind.readUnsafeConstant(value, displacement);
                 if (constant != null) {
-                    return ConstantNode.forConstant(constant, runtime, graph());
+                    return ConstantNode.forConstant(constant, runtime, read.node().graph());
                 }
             }
         }
-        return this;
+        return (ValueNode) read;
     }
 }