RFR: 8370409: Incorrect computation in Float16 reduction loop [v3]
    Jatin Bhateja 
    jbhateja at openjdk.org
       
    Thu Oct 30 09:06:03 UTC 2025
    
    
  
> Current floatToFloat16 intrinsic implementation always sign-extends the 16-bit short result to a 32-bit value in anticipation of safe consumption by subsequent integral (comparison) operation[s]. However, the safest way to compare two Float16 values is to use Float16.compare/compareTo method, given that floating point comparisons can also be unordered.
> 
> e.g., both 64512 and -1024 are equivalent bit representations of the Float16 -Inf value, but are not numerically equivalent with integral comparison.
> jshell> Float16.compare(Float16.shortBitsToFloat16((short)-1024), Float16.shortBitsToFlot16((short)64512))
> $3 ==> 0
> 
> In the scalar intrinsic of Float16.add/sub/mul/div/min/max, we always return a boxed value, which is then operated upon by the subsequent Float16 APIs. While Float.floatToFloat16 intrinsic always returns a 'short' value, this is special in the sense that even though the carrier type is 'short' but it encodes an IEEE 754 half precision value, being a short carrier if they get exposed to integral operators, then as per JVM specification, short must be sign-extended before operation.
> 
> Given that our Float16 binary operations inference is based on generic pattern match and is agnostic to how that graph pallet got created, i.e., either through Float16.* APIs or by explicit Float.float16ToFloat/floatToFloat16 operations, hence it's safe to sign-extend the result in all cases.
> 
> Kindly review the patch and share your feedback.
> 
> Best Regards,
> Jatin
Jatin Bhateja has updated the pull request incrementally with one additional commit since the last revision:
  Change GOLDEN constants to static variables
-------------
Changes:
  - all: https://git.openjdk.org/jdk/pull/27977/files
  - new: https://git.openjdk.org/jdk/pull/27977/files/f5e1a857..91970a18
Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=27977&range=02
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=27977&range=01-02
  Stats: 6 lines in 1 file changed: 0 ins; 0 del; 6 mod
  Patch: https://git.openjdk.org/jdk/pull/27977.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/27977/head:pull/27977
PR: https://git.openjdk.org/jdk/pull/27977
    
    
More information about the hotspot-compiler-dev
mailing list