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