# HG changeset patch # User Lukas Stadler # Date 1366743827 -7200 # Node ID a9cfbe03d9c4d880c6c532194378af45833472a1 # Parent 76afb8f4c930c5d3d9309b9f97577ed5a069fe1e don't pushThroughPi if nullness before/after pi differs diff -r 76afb8f4c930 -r a9cfbe03d9c4 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java Tue Apr 23 20:17:21 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java Tue Apr 23 21:03:47 2013 +0200 @@ -25,6 +25,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; /** * An IsNullNode will be true if the supplied value is null, and false if it is non-null. @@ -81,7 +82,13 @@ @Override public boolean push(PiNode parent) { - replaceFirstInput(parent, parent.object()); - return true; + ObjectStamp piStamp = parent.objectStamp(); + ObjectStamp piValueStamp = parent.object().objectStamp(); + if (piStamp.nonNull() == piValueStamp.nonNull() && piStamp.alwaysNull() == piValueStamp.alwaysNull()) { + replaceFirstInput(parent, parent.object()); + return true; + } else { + return false; + } } } diff -r 76afb8f4c930 -r a9cfbe03d9c4 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 Tue Apr 23 20:17:21 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Tue Apr 23 21:03:47 2013 +0200 @@ -103,11 +103,15 @@ Object locId = location().locationIdentity(); if (locId instanceof ResolvedJavaField) { ResolvedJavaType fieldType = ((ResolvedJavaField) locId).getDeclaringClass(); - ResolvedJavaType beforePiType = parent.object().objectStamp().type(); + ValueNode piValueStamp = parent.object(); + ResolvedJavaType beforePiType = piValueStamp.objectStamp().type(); if (beforePiType != null && fieldType.isAssignableFrom(beforePiType)) { - replaceFirstInput(parent, parent.object()); - return true; + ObjectStamp piStamp = parent.objectStamp(); + if (piStamp.nonNull() == piValueStamp.objectStamp().nonNull() && piStamp.alwaysNull() == piValueStamp.objectStamp().alwaysNull()) { + replaceFirstInput(parent, piValueStamp); + return true; + } } } return false;