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;