Mercurial > hg > graal-compiler
changeset 9276:a9cfbe03d9c4
don't pushThroughPi if nullness before/after pi differs
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Tue, 23 Apr 2013 21:03:47 +0200 |
parents | 76afb8f4c930 |
children | 1fcaf6edc69d 2a4b57f02fb4 |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java |
diffstat | 2 files changed, 16 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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; + } } }
--- 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;