changeset 18704:0ce6ee3d7a98

lzcnt inferStamp reports too large values for Integer.numberOfLeadingZeros
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Tue, 16 Dec 2014 19:26:38 -0800
parents 41d12b67bc9e
children 5dcb9fdea75a
files graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64CountLeadingZerosNode.java
diffstat 1 files changed, 6 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64CountLeadingZerosNode.java	Tue Dec 16 19:25:48 2014 -0800
+++ b/graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64CountLeadingZerosNode.java	Tue Dec 16 19:26:38 2014 -0800
@@ -48,10 +48,14 @@
 
     @Override
     public boolean inferStamp() {
+        assert value.getKind() == Kind.Int || value.getKind() == Kind.Long;
         IntegerStamp valueStamp = (IntegerStamp) getValue().stamp();
         long mask = CodeUtil.mask(valueStamp.getBits());
-        int min = Long.numberOfLeadingZeros(valueStamp.upMask() & mask);
-        int max = Long.numberOfLeadingZeros(valueStamp.downMask() & mask);
+        // Don't count zeros from the mask in the result.
+        int adjust = Long.numberOfLeadingZeros(mask);
+        assert adjust == 0 || adjust == 32;
+        int min = Long.numberOfLeadingZeros(valueStamp.upMask() & mask) - adjust;
+        int max = Long.numberOfLeadingZeros(valueStamp.downMask() & mask) - adjust;
         return updateStamp(StampFactory.forInteger(Kind.Int, min, max));
     }