Mercurial > hg > truffle
changeset 9544:5bf09c5cd2e6
ReadNode/PiPush: compute declaring class by field offset
instead of obtaining it through the LocationIdentity
author | Bernhard Urban <bernhard.urban@jku.at> |
---|---|
date | Fri, 03 May 2013 16:30:39 +0200 |
parents | f8a5f7f7d0bd |
children | 7931508747f5 76937211a12d |
files | graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/PushNodesThroughPiTest.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java |
diffstat | 2 files changed, 33 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/PushNodesThroughPiTest.java Fri May 03 15:05:07 2013 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/PushNodesThroughPiTest.java Fri May 03 16:30:39 2013 +0200 @@ -31,9 +31,9 @@ import com.oracle.graal.debug.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; -import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.spi.Lowerable.LoweringType; +import com.oracle.graal.nodes.type.*; import com.oracle.graal.phases.common.*; import com.oracle.graal.phases.tiers.*; @@ -66,17 +66,24 @@ public void run() { StructuredGraph graph = compileTestSnippet(snippet); + int counter = 0; for (ReadNode rn : graph.getNodes().filter(ReadNode.class)) { - LocationIdentity locId = rn.location().getLocationIdentity(); - if (locId instanceof ResolvedJavaField) { - ResolvedJavaField field = (ResolvedJavaField) locId; - if (field.getName().equals("x")) { - Assert.assertTrue(rn.object() instanceof LocalNode); - } else { - Assert.assertTrue(rn.object() instanceof UnsafeCastNode); + if (rn.location() instanceof ConstantLocationNode && rn.object().stamp() instanceof ObjectStamp) { + long disp = ((ConstantLocationNode) rn.location()).getDisplacement(); + ResolvedJavaType receiverType = rn.object().objectStamp().type(); + ResolvedJavaField field = receiverType.findInstanceFieldWithOffset(disp); + + if (field != null) { + if (field.getName().equals("x")) { + Assert.assertTrue(rn.object() instanceof LocalNode); + } else { + Assert.assertTrue(rn.object() instanceof UnsafeCastNode); + } + counter++; } } } + Assert.assertEquals(2, counter); Assert.assertTrue(graph.getNodes().filter(IsNullNode.class).count() == 1); }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Fri May 03 15:05:07 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Fri May 03 16:30:39 2013 +0200 @@ -102,19 +102,27 @@ @Override public boolean push(PiNode parent) { - LocationIdentity locId = location().getLocationIdentity(); - if (locId instanceof ResolvedJavaField) { - ResolvedJavaType fieldType = ((ResolvedJavaField) locId).getDeclaringClass(); - ValueNode piValueStamp = parent.object(); - ResolvedJavaType beforePiType = piValueStamp.objectStamp().type(); + if (location() instanceof ConstantLocationNode) { + long displacement = ((ConstantLocationNode) location()).getDisplacement(); + if (parent.stamp() instanceof ObjectStamp) { + ObjectStamp piStamp = parent.objectStamp(); + ResolvedJavaType receiverType = piStamp.type(); + if (receiverType != null) { + ResolvedJavaField field = receiverType.findInstanceFieldWithOffset(displacement); - if (beforePiType != null && fieldType.isAssignableFrom(beforePiType)) { - ObjectStamp piStamp = parent.objectStamp(); - if (piStamp.nonNull() == piValueStamp.objectStamp().nonNull() && piStamp.alwaysNull() == piValueStamp.objectStamp().alwaysNull()) { - replaceFirstInput(parent, piValueStamp); - return true; + if (field != null) { + ResolvedJavaType declaringClass = field.getDeclaringClass(); + if (declaringClass.isAssignableFrom(receiverType) && declaringClass != receiverType) { + ObjectStamp piValueStamp = parent.object().objectStamp(); + if (piStamp.nonNull() == piValueStamp.nonNull() && piStamp.alwaysNull() == piValueStamp.alwaysNull()) { + replaceFirstInput(parent, parent.object()); + return true; + } + } + } } } + } return false; }