# HG changeset patch # User Tom Rodriguez # Date 1418786798 28800 # Node ID 0ce6ee3d7a98d6243469ac94bba3a414d5aecbe0 # Parent 41d12b67bc9e38019e80f0edce9adf6f9af83f77 lzcnt inferStamp reports too large values for Integer.numberOfLeadingZeros diff -r 41d12b67bc9e -r 0ce6ee3d7a98 graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64CountLeadingZerosNode.java --- 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)); }