changeset 10763:5e338844c64c

make early read elimination see through ValueProxies
author Lukas Stadler <lukas.stadler@jku.at>
date Mon, 15 Jul 2013 15:58:13 +0200
parents c483912aaf70
children d2f8addaf504
files graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PEAReadEliminationTest.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/ReadEliminationPEClosure.java
diffstat 2 files changed, 37 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PEAReadEliminationTest.java	Mon Jul 15 16:39:11 2013 +0200
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PEAReadEliminationTest.java	Mon Jul 15 15:58:13 2013 +0200
@@ -24,8 +24,6 @@
 
 import static org.junit.Assert.*;
 
-import java.util.concurrent.*;
-
 import org.junit.*;
 
 import com.oracle.graal.api.code.*;
@@ -43,7 +41,7 @@
 
     public static Object staticField;
 
-    public static class TestObject implements Callable<Integer> {
+    public static class TestObject {
 
         public int x;
         public int y;
@@ -52,11 +50,6 @@
             this.x = x;
             this.y = y;
         }
-
-        @Override
-        public Integer call() throws Exception {
-            return x;
-        }
     }
 
     public static class TestObject2 {
@@ -70,6 +63,16 @@
         }
     }
 
+    public static class TestObject3 extends TestObject {
+
+        public int z;
+
+        public TestObject3(int x, int y, int z) {
+            super(x, y);
+            this.z = z;
+        }
+    }
+
     @SuppressWarnings("all")
     public static int testSimpleSnippet(TestObject a) {
         a.x = 2;
@@ -213,6 +216,24 @@
         assertEquals(1, graph.getNodes().filter(StoreFieldNode.class).count());
     }
 
+    public static int testValueProxySnippet(boolean b, TestObject o) {
+        int sum = 0;
+        if (b) {
+            sum += o.x;
+        } else {
+            TestObject3 p = (TestObject3) o;
+            sum += p.x;
+        }
+        sum += o.x;
+        return sum;
+    }
+
+    @Test
+    public void testValueProxy() {
+        processMethod("testValueProxySnippet");
+        assertEquals(2, graph.getNodes().filter(LoadFieldNode.class).count());
+    }
+
     final ReturnNode getReturn(String snippet) {
         processMethod(snippet);
         assertEquals(1, graph.getNodes(ReturnNode.class).count());
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/ReadEliminationPEClosure.java	Mon Jul 15 16:39:11 2013 +0200
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/ReadEliminationPEClosure.java	Mon Jul 15 15:58:13 2013 +0200
@@ -34,6 +34,7 @@
 import com.oracle.graal.nodes.cfg.*;
 import com.oracle.graal.nodes.extended.*;
 import com.oracle.graal.nodes.java.*;
+import com.oracle.graal.nodes.util.*;
 import com.oracle.graal.phases.schedule.*;
 import com.oracle.graal.virtual.phases.ea.ReadEliminationPEBlockState.ReadCacheEntry;
 
@@ -54,24 +55,26 @@
         if (!deleted) {
             if (node instanceof LoadFieldNode) {
                 LoadFieldNode load = (LoadFieldNode) node;
-                ValueNode cachedValue = state.getReadCache(load.object(), load.field());
+                ValueNode object = GraphUtil.unproxify(load.object());
+                ValueNode cachedValue = state.getReadCache(object, load.field());
                 if (cachedValue != null) {
                     effects.replaceAtUsages(load, cachedValue);
                     state.addScalarAlias(load, cachedValue);
+                    deleted = true;
                 } else {
-                    state.addReadCache(load.object(), load.field(), load);
+                    state.addReadCache(object, load.field(), load);
                 }
-                deleted = true;
             } else if (node instanceof StoreFieldNode) {
                 StoreFieldNode store = (StoreFieldNode) node;
-                ValueNode cachedValue = state.getReadCache(store.object(), store.field());
+                ValueNode object = GraphUtil.unproxify(store.object());
+                ValueNode cachedValue = state.getReadCache(object, store.field());
 
                 if (state.getScalarAlias(store.value()) == cachedValue) {
                     effects.deleteFixedNode(store);
                     deleted = true;
                 }
                 state.killReadCache(store.field());
-                state.addReadCache(store.object(), store.field(), store.value());
+                state.addReadCache(object, store.field(), store.value());
             } else if (node instanceof MemoryCheckpoint.Single) {
                 METRIC_MEMORYCHECKOINT.increment();
                 LocationIdentity identity = ((MemoryCheckpoint.Single) node).getLocationIdentity();