Mercurial > hg > graal-compiler
changeset 10842:63c3d7b5edd9
Merge
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Mon, 22 Jul 2013 16:19:39 +0200 |
parents | 020f63bfd781 (diff) 02a5f5abd842 (current diff) |
children | 50f3f3958555 |
files | |
diffstat | 4 files changed, 38 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ConditionalEliminationTest.java Mon Jul 22 13:35:23 2013 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ConditionalEliminationTest.java Mon Jul 22 16:19:39 2013 +0200 @@ -39,6 +39,8 @@ */ public class ConditionalEliminationTest extends GraalCompilerTest { + public static Object field; + static class Entry { final String name; @@ -108,7 +110,7 @@ } } else { if (b == null) { - return 3; + return -3; } else { return 4; } @@ -196,4 +198,34 @@ assertEquals(InvokeKind.Special, ((MethodCallTargetNode) invoke.callTarget()).invokeKind()); } + public static void testTypeMergingSnippet(Object o, boolean b) { + if (b) { + if (!(o instanceof Double)) { + return; + } + } else { + if (!(o instanceof Integer)) { + return; + } + } + + /* + * For this test the conditional elimination has to correctly merge the type information it + * has about o, so that it can remove the check on Number. + */ + if (!(o instanceof Number)) { + field = o; + } + } + + @Test + public void testTypeMerging() { + StructuredGraph graph = parse("testTypeMergingSnippet"); + new CanonicalizerPhase.Instance(runtime(), null, true).apply(graph); + new ConditionalEliminationPhase(runtime()).apply(graph); + new CanonicalizerPhase.Instance(runtime(), null, true).apply(graph); + + assertEquals(0, graph.getNodes().filter(StoreFieldNode.class).count()); + } + }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java Mon Jul 22 13:35:23 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java Mon Jul 22 16:19:39 2013 +0200 @@ -114,7 +114,7 @@ break; } } - if (type == null && type != node.objectStamp().type()) { + if (type != null && type != node.objectStamp().type()) { newKnownTypes.put(node, type); } }
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PEReadEliminationClosure.java Mon Jul 22 13:35:23 2013 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PEReadEliminationClosure.java Mon Jul 22 16:19:39 2013 +0200 @@ -70,7 +70,7 @@ ValueNode cachedValue = state.getReadCache(object, store.field()); ValueNode value = state.getScalarAlias(store.value()); - if (value == cachedValue) { + if (GraphUtil.unproxify(value) == GraphUtil.unproxify(cachedValue)) { effects.deleteFixedNode(store); deleted = true; }
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/ReadEliminationClosure.java Mon Jul 22 13:35:23 2013 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/ReadEliminationClosure.java Mon Jul 22 16:19:39 2013 +0200 @@ -36,8 +36,8 @@ import com.oracle.graal.nodes.util.*; import com.oracle.graal.phases.schedule.*; import com.oracle.graal.virtual.phases.ea.ReadEliminationBlockState.CacheEntry; +import com.oracle.graal.virtual.phases.ea.ReadEliminationBlockState.LoadCacheEntry; import com.oracle.graal.virtual.phases.ea.ReadEliminationBlockState.ReadCacheEntry; -import com.oracle.graal.virtual.phases.ea.ReadEliminationBlockState.LoadCacheEntry; public class ReadEliminationClosure extends EffectsClosure<ReadEliminationBlockState> { @@ -106,6 +106,8 @@ } state.killReadCache(write.location().getLocationIdentity()); state.addCacheEntry(identifier, value); + } else { + state.killReadCache(write.location().getLocationIdentity()); } } else if (node instanceof MemoryCheckpoint.Single) { processIdentity(state, ((MemoryCheckpoint.Single) node).getLocationIdentity());