# HG changeset patch # User Bernhard Urban # Date 1367591439 -7200 # Node ID 5bf09c5cd2e66fb60b46440b68cb5e7675984b1a # Parent f8a5f7f7d0bd9c120d136a6941bfd19e5ce7c665 ReadNode/PiPush: compute declaring class by field offset instead of obtaining it through the LocationIdentity diff -r f8a5f7f7d0bd -r 5bf09c5cd2e6 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/PushNodesThroughPiTest.java --- 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); } diff -r f8a5f7f7d0bd -r 5bf09c5cd2e6 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java --- 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; }