Integrated: 8349637: Integer.numberOfLeadingZeros outputs incorrectly in certain cases

Jasmine Karthikeyan jkarthikeyan at openjdk.org
Mon Mar 3 05:22:00 UTC 2025


On Wed, 12 Feb 2025 05:47:52 GMT, Jasmine Karthikeyan <jkarthikeyan at openjdk.org> wrote:

> Hi all,
> This is a fix for a miscompile in the AVX2 implementation of `CountLeadingZerosV` for int types. Currently, the implementation turns ints into floats, in order to calculating the leading zeros based on the exponent part of the float. Unfortunately, floats can only accurately represent integers up to 2^24. After that, multiple integer values can map onto the same floating point value. The issue manifests when an int is converted to a floating point representation that is higher than it, crossing a bit boundary. As an example, `(float)0x01FFFFFF == (float)0x02000000`, but `lzcnt(0x01FFFFFF) == 7` and `lzcnt(0x02000000) == 6`. The values are incorrectly rounded up.
> 
> This patch fixes the issue by masking the input in the cases where it is larger than 2^24, to set the low bits to 0. Removing these bits prevents the accidental rounding behavior. I've added these cases to`TestNumberOfContinuousZeros`, and removed the set random seed so that it can produce random inputs to test with.
> 
> Reviews would be appreciated!

This pull request has now been integrated.

Changeset: 3657e92e
Author:    Jasmine Karthikeyan <jkarthikeyan at openjdk.org>
URL:       https://git.openjdk.org/jdk/commit/3657e92ead1e678942fcb272e77c3867eb5aa13e
Stats:     222 lines in 3 files changed: 215 ins; 0 del; 7 mod

8349637: Integer.numberOfLeadingZeros outputs incorrectly in certain cases

Reviewed-by: thartmann, qamai, jbhateja

-------------

PR: https://git.openjdk.org/jdk/pull/23579


More information about the hotspot-compiler-dev mailing list