FloatEntryImpl.equals() and DoubleEntryImpl.equals() used == for comparison, which returns false for NaN == NaN per IEEE 754. This caused two different FloatEntry/DoubleEntry objects holding NaN to not be considered equal, violating the equals/hashCode contract (same hashCode but equals returns false).
Similarly, SplitConstantPool.findFloatEntry() and findDoubleEntry() used == to match values, so NaN entries could never be found in the pool, causing every floatEntry(Float.NaN) or doubleEntry(Double.NaN) call to create a duplicate entry and bloat the constant pool. Fix by using Float.floatToRawIntBits() and Double.doubleToRawLongBits() for bitwise comparison, which correctly handles NaN and also properly distinguishes +0.0 from -0.0. ------------- Commit messages: - Add tests for Float/Double NaN constant pool equality and deduplication - Fix Float/Double NaN constant pool entry equality and deduplication Changes: https://git.openjdk.org/jdk/pull/30196/files Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=30196&range=00 Issue: https://bugs.openjdk.org/browse/JDK-8379832 Stats: 223 lines in 3 files changed: 219 ins; 0 del; 4 mod Patch: https://git.openjdk.org/jdk/pull/30196.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/30196/head:pull/30196 PR: https://git.openjdk.org/jdk/pull/30196
