Mercurial > hg > graal-compiler
changeset 12380:e027a51bdd33
exclude java.lang.ref.Reference from Escape Analysis
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Mon, 14 Oct 2013 10:45:02 +0200 |
parents | edb2e6bd6a01 |
children | 20150eaa1dc7 |
files | graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PartialEscapeAnalysisTest.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java |
diffstat | 2 files changed, 23 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PartialEscapeAnalysisTest.java Sat Oct 12 20:08:36 2013 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PartialEscapeAnalysisTest.java Mon Oct 14 10:45:02 2013 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.compiler.test.ea; +import java.lang.ref.*; import java.util.concurrent.*; import org.junit.*; @@ -163,6 +164,20 @@ return value; } + public static int testReference1Snippet(Object a) { + SoftReference<Object> softReference = new SoftReference<>(a); + if (softReference.get().hashCode() == 0) { + return 1; + } else { + return 2; + } + } + + @Test + public void testReference1() { + assertEquals(1, processMethod("testReference1Snippet").getNodes().filter(NewInstanceNode.class).count()); + } + @SafeVarargs final void testMaterialize(final String snippet, double expectedProbability, int expectedCount, Class<? extends Node>... invalidNodeClasses) { StructuredGraph result = processMethod(snippet);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java Sat Oct 12 20:08:36 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java Mon Oct 14 10:45:02 2013 +0200 @@ -22,6 +22,8 @@ */ package com.oracle.graal.nodes.java; +import java.lang.ref.*; + import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.spi.*; @@ -48,6 +50,7 @@ */ public NewInstanceNode(ResolvedJavaType type, boolean fillContents) { super(StampFactory.exactNonNull(type)); + assert !type.isArray(); this.instanceClass = type; this.fillContents = fillContents; } @@ -84,8 +87,11 @@ @Override public void virtualize(VirtualizerTool tool) { - if (instanceClass != null) { - assert !instanceClass().isArray(); + /* + * Reference objects can escape into their ReferenceQueue at any safepoint, therefore + * they're excluded from escape analysis. + */ + if (!tool.getMetaAccessProvider().lookupJavaType(Reference.class).isAssignableFrom(instanceClass)) { VirtualInstanceNode virtualObject = new VirtualInstanceNode(instanceClass(), true); ResolvedJavaField[] fields = virtualObject.getFields(); ValueNode[] state = new ValueNode[fields.length];