changeset 19750:b8cab8ce9827

Add succeeding stamp inference for integer test node.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Tue, 10 Mar 2015 15:20:13 +0100
parents 7568501597c2
children 34fd3a18f211
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerTestNode.java
diffstat 1 files changed, 26 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerTestNode.java	Tue Mar 10 15:19:57 2015 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerTestNode.java	Tue Mar 10 15:20:13 2015 +0100
@@ -62,12 +62,37 @@
 
     @Override
     public Stamp getSucceedingStampForX(boolean negated) {
+        Stamp xStampGeneric = this.getX().stamp();
+        Stamp yStampGeneric = this.getY().stamp();
+        return getSucceedingStamp(negated, xStampGeneric, yStampGeneric);
+    }
+
+    private static Stamp getSucceedingStamp(boolean negated, Stamp xStampGeneric, Stamp otherStampGeneric) {
+        if (xStampGeneric instanceof IntegerStamp && otherStampGeneric instanceof IntegerStamp) {
+            IntegerStamp xStamp = (IntegerStamp) xStampGeneric;
+            IntegerStamp otherStamp = (IntegerStamp) otherStampGeneric;
+            if (negated) {
+                if (Long.bitCount(otherStamp.upMask()) == 1) {
+                    long newDownMask = xStamp.downMask() | otherStamp.upMask();
+                    if (xStamp.downMask() != newDownMask) {
+                        return IntegerStamp.stampForMask(xStamp.getBits(), newDownMask, xStamp.upMask()).join(xStamp);
+                    }
+                }
+            } else {
+                long restrictedUpMask = ((~otherStamp.downMask()) & xStamp.upMask());
+                if (xStamp.upMask() != restrictedUpMask) {
+                    return IntegerStamp.stampForMask(xStamp.getBits(), xStamp.downMask(), restrictedUpMask).join(xStamp);
+                }
+            }
+        }
         return null;
     }
 
     @Override
     public Stamp getSucceedingStampForY(boolean negated) {
-        return null;
+        Stamp xStampGeneric = this.getX().stamp();
+        Stamp yStampGeneric = this.getY().stamp();
+        return getSucceedingStamp(negated, yStampGeneric, xStampGeneric);
     }
 
     @Override