# HG changeset patch # User Lukas Stadler # Date 1373896693 -7200 # Node ID 5e338844c64c3b9b991bcb1cabb74d6462505606 # Parent c483912aaf70f8d39d224507b79da1f6f0411428 make early read elimination see through ValueProxies diff -r c483912aaf70 -r 5e338844c64c graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PEAReadEliminationTest.java --- 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 { + 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()); diff -r c483912aaf70 -r 5e338844c64c graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/ReadEliminationPEClosure.java --- 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();