changeset 7337:c1a5c3bc5656

more accurate inferStamp for UnsafeCastNode and CheckCastNode
author Lukas Stadler <lukas.stadler@jku.at>
date Fri, 11 Jan 2013 11:44:44 +0100
parents 4e25ceefee4c
children 13d5545e24e2
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java
diffstat 2 files changed, 16 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java	Fri Jan 11 11:44:11 2013 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java	Fri Jan 11 11:44:44 2013 +0100
@@ -50,6 +50,19 @@
     }
 
     @Override
+    public boolean inferStamp() {
+        if (kind() != Kind.Object || object().kind() != Kind.Object) {
+            return false;
+        }
+        if (object().objectStamp().alwaysNull() && objectStamp().nonNull()) {
+            // a null value flowing into a nonNull UnsafeCastNode should be guarded by a type/isNull guard, but the
+            // compiler might see this situation before the branch is deleted
+            return false;
+        }
+        return updateStamp(stamp().join(object().stamp()));
+    }
+
+    @Override
     public ValueNode canonical(CanonicalizerTool tool) {
         if (kind() != object.kind()) {
             return this;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java	Fri Jan 11 11:44:11 2013 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java	Fri Jan 11 11:44:44 2013 +0100
@@ -59,11 +59,10 @@
 
     @Override
     public boolean inferStamp() {
-        if (object().stamp().nonNull() && !stamp().nonNull()) {
-            setStamp(StampFactory.declaredNonNull(type));
-            return true;
+        if (object().objectStamp().alwaysNull() && objectStamp().nonNull()) {
+            return false;
         }
-        return super.inferStamp();
+        return updateStamp(stamp().join(object().stamp()));
     }
 
     @Override