changeset 3112:607c6500c22e

Added immediate gvn for LocationNode instances.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Tue, 28 Jun 2011 15:28:30 +0200
parents 46fe56f202a4
children 0dfaf5733c63
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LocationNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ReadEliminationPhase.java graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java
diffstat 3 files changed, 21 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LocationNode.java	Tue Jun 28 14:17:06 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LocationNode.java	Tue Jun 28 15:28:30 2011 +0200
@@ -36,7 +36,12 @@
     private CiKind valueKind;
     private Object locationIdentity;
 
-    public LocationNode(Object identity, CiKind kind, int displacement, Graph graph) {
+    public static LocationNode create(Object identity, CiKind kind, int displacement, Graph graph) {
+        LocationNode result = new LocationNode(identity, kind, displacement, graph);
+        return graph.ideal(result);
+    }
+
+    private LocationNode(Object identity, CiKind kind, int displacement, Graph graph) {
         super(CiKind.Illegal, INPUT_COUNT, SUCCESSOR_COUNT, graph);
         this.displacement = displacement;
         this.valueKind = kind;
@@ -73,7 +78,17 @@
         return locationIdentity;
     }
 
-    public boolean same(LocationNode location) {
-        return valueKind == location.valueKind && displacement == location.displacement;
+    @Override
+    public boolean valueEqual(Node i) {
+        if (i instanceof LocationNode) {
+            LocationNode locationNode = (LocationNode) i;
+            return locationNode.locationIdentity == locationIdentity && locationNode.displacement == displacement;
+        }
+        return false;
+    }
+
+    @Override
+    public int valueNumber() {
+        return locationIdentity.hashCode() + displacement;
     }
 }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ReadEliminationPhase.java	Tue Jun 28 14:17:06 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ReadEliminationPhase.java	Tue Jun 28 15:28:30 2011 +0200
@@ -38,7 +38,7 @@
             Node memoryInput = n.inputs().variablePart().get(0);
             if (memoryInput instanceof WriteNode) {
                 WriteNode other = (WriteNode) memoryInput;
-                if (other.object() == n.object() && other.location().same(n.location())) {
+                if (other.object() == n.object() && other.location() == n.location()) {
                     if (GraalOptions.TraceReadElimination) {
                         TTY.println("Eliminated memory read " + n + "and replaced with node " + other.value());
                     }
--- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java	Tue Jun 28 14:17:06 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java	Tue Jun 28 15:28:30 2011 +0200
@@ -251,7 +251,7 @@
             Graph graph = field.graph();
             int displacement = ((HotSpotField) field.field()).offset();
             assert field.kind != CiKind.Illegal;
-            ReadNode memoryRead = new ReadNode(field.field().kind().stackKind(), field.object(), new LocationNode(field.field(), field.field().kind(), displacement, graph), graph);
+            ReadNode memoryRead = new ReadNode(field.field().kind().stackKind(), field.object(), LocationNode.create(field.field(), field.field().kind(), displacement, graph), graph);
             memoryRead.setGuard((GuardNode) tool.createGuard(new IsNonNull(field.object(), graph)));
             memoryRead.setNext(field.next());
             field.replaceAndDelete(memoryRead);
@@ -262,7 +262,7 @@
             }
             Graph graph = field.graph();
             int displacement = ((HotSpotField) field.field()).offset();
-            WriteNode memoryWrite = new WriteNode(CiKind.Illegal, field.object(), field.value(), new LocationNode(field.field(), field.field().kind(), displacement, graph), graph);
+            WriteNode memoryWrite = new WriteNode(CiKind.Illegal, field.object(), field.value(), LocationNode.create(field.field(), field.field().kind(), displacement, graph), graph);
             memoryWrite.setGuard((GuardNode) tool.createGuard(new IsNonNull(field.object(), graph)));
             memoryWrite.setStateAfter(field.stateAfter());
             memoryWrite.setNext(field.next());