Mercurial > hg > graal-compiler
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();