# HG changeset patch # User Roland Schatz # Date 1393250572 -3600 # Node ID c7c9624f8ca23239ab4fc4054e8f2d64aea57a33 # Parent 384d7fc0e27b6d4b19f731e5f356c5df6b82374f Fix corner case in stamp computation of zero extension. diff -r 384d7fc0e27b -r c7c9624f8ca2 graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/optimize/ConvertCompare.java --- 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); } } diff -r 384d7fc0e27b -r c7c9624f8ca2 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java --- 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(); }