RFR: 8351515: C2 incorrectly removes double negation for double and float [v2]

Tobias Hartmann thartmann at openjdk.org
Fri Mar 21 13:07:09 UTC 2025


On Fri, 21 Mar 2025 12:09:40 GMT, Manuel Hässig <duke at openjdk.org> wrote:

>> # Issue Summary
>> 
>> A fuzzer run discovered that code of the form `0 - (0 - x)` yields the wrong result for `x = -0.0`. According to the [Java Language Spec 15.8.2](https://docs.oracle.com/javase/specs/jls/se23/html/jls-15.html#jls-15.18.2) the sum of floating point zeroes of opposite sign is positive zero. Hence, `(0 - (0 - (-0.0))` must result in `+0.0`, but due to the folding of all double negations in `SubNode::Identity` this was optimized to `-0.0`
>> 
>> # Changeset overview
>> 
>> To fix this issue, I excluded floating point numbers from the folding of double negations, which also includes `Float16` values. This might seem excessive at first glance, but we do not track range information for floating point types. Hence, we could still perform the folding of the double negation if a floating point constant is not `-0.0`. However, constant folding already takes care of this.
>> 
>> Changes:
>>  - IR-Framework: fix `IRNode.SUB`not matching `SubHFNode`
>>  - Add a regression IR-test
>>  - Exclude floating point `SubNodes` from folding double negations
>> 
>> # Testing
>> - [Github Actions](https://github.com/mhaessig/jdk/actions/runs/13989207348)
>> - `tier1` through `tier5` plus Oracle internal testing
>
> Manuel Hässig has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Improve comment

Looks good to me otherwise!

src/hotspot/share/opto/subnode.cpp line 61:

> 59:   // is not the same as subtraction for floating point numbers
> 60:   // (cf. JLS § 15.15.4). `0-(0-(-0.0))` must equal to positive 0.0 according to
> 61:   // JLS § 15.8.2, but would result in -0.0 this would apply.

Suggestion:

  // (cf. JLS § 15.15.4). `0-(0-(-0.0))` must be equal to positive 0.0 according to
  // JLS § 15.8.2, but would result in -0.0 if this folding would be applied.

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

Marked as reviewed by thartmann (Reviewer).

PR Review: https://git.openjdk.org/jdk/pull/24150#pullrequestreview-2705876414
PR Review Comment: https://git.openjdk.org/jdk/pull/24150#discussion_r2007540226


More information about the hotspot-compiler-dev mailing list