changeset 14010:c7c9624f8ca2

Fix corner case in stamp computation of zero extension.
author Roland Schatz <roland.schatz@oracle.com>
date Mon, 24 Feb 2014 15:02:52 +0100
parents 384d7fc0e27b
children 134491e79cde
files graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/optimize/ConvertCompare.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java
diffstat 2 files changed, 39 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/optimize/ConvertCompare.java	Mon Feb 24 11:37:48 2014 +0100
+++ b/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/optimize/ConvertCompare.java	Mon Feb 24 15:02:52 2014 +0100
@@ -35,12 +35,31 @@
         runTest("test", 0, 2.87f);
     }
 
-    public static boolean testChar(int x) {
+    public static boolean testChar42(int x) {
         return ((char) x) == 42;
     }
 
     @Test
     public void run1() {
-        runTest("testChar", 42);
+        runTest("testChar42", 42);
+    }
+
+    @Test
+    public void run2() {
+        runTest("testChar42", (int) Character.MAX_VALUE);
+    }
+
+    public static boolean testCharMax(int x) {
+        return ((char) x) == Character.MAX_VALUE;
+    }
+
+    @Test
+    public void run3() {
+        runTest("testCharMax", 42);
+    }
+
+    @Test
+    public void run4() {
+        runTest("testCharMax", (int) Character.MAX_VALUE);
     }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java	Mon Feb 24 11:37:48 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java	Mon Feb 24 15:02:52 2014 +0100
@@ -343,8 +343,25 @@
 
             long downMask = ZeroExtendNode.zeroExtend(inputStamp.downMask(), inputBits);
             long upMask = ZeroExtendNode.zeroExtend(inputStamp.upMask(), inputBits);
+            long lowerBound;
+            long upperBound;
+            if (inputStamp.lowerBound() < 0) {
+                if (inputStamp.upperBound() >= 0) {
+                    // signed range including 0 and -1
+                    // after sign extension, the whole range from 0 to MAX_INT is possible
+                    return stampForMask(resultBits, downMask, upMask);
+                } else {
+                    // negative range
+                    upperBound = ZeroExtendNode.zeroExtend(inputStamp.lowerBound(), inputBits);
+                    lowerBound = ZeroExtendNode.zeroExtend(inputStamp.upperBound(), inputBits);
+                }
+            } else {
+                // positive range
+                lowerBound = ZeroExtendNode.zeroExtend(inputStamp.lowerBound(), inputBits);
+                upperBound = ZeroExtendNode.zeroExtend(inputStamp.upperBound(), inputBits);
+            }
 
-            return new IntegerStamp(resultBits, inputStamp.isUnsigned(), inputStamp.lowerBound(), inputStamp.upperBound(), downMask, upMask);
+            return new IntegerStamp(resultBits, inputStamp.isUnsigned(), lowerBound, upperBound, downMask, upMask);
         } else {
             return input.illegal();
         }