Mercurial > hg > truffle
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(); }