RFR: 8342103: C2 compiler support for Float16 type and associated scalar operations [v3]
Emanuel Peter
epeter at openjdk.org
Tue Dec 17 16:58:43 UTC 2024
On Tue, 17 Dec 2024 11:05:18 GMT, Jatin Bhateja <jbhateja at openjdk.org> wrote:
>> src/hotspot/share/opto/divnode.cpp line 840:
>>
>>> 838: if (g_isnan(t1->getf()) || g_isnan(t2->getf())) {
>>> 839: return TypeH::make(NAN);
>>> 840: }
>>
>> I'm a little confused here. We are working with nodes that have type Float16, but we are asking for Float constants here. Why is that, how does it work?
>
> Please refer to PhaseIGVN::transform, we create constant IR for singleton types.
> https://github.com/openjdk/jdk/blob/master/src/hotspot/share/opto/phaseX.cpp#L721
That misses my question, I was again confused about float vs Float16. But I see from your previous answer that `getf` does the conversion from `Float16` -> `float`. So all good.
>> src/hotspot/share/opto/subnode.cpp line 566:
>>
>>> 564: return t1;
>>> 565: }
>>> 566: else if(g_isnan(t2->getf())) {
>>
>> General question: why are you using `getf` and not `geth` all over the code?
>
> getf is a routine that performs half float to float conversion for TypeH.
Ah right, I see now. Thanks.
>> src/hotspot/share/opto/type.cpp line 1530:
>>
>>> 1528: uint TypeH::hash(void) const {
>>> 1529: return *(uint*)(&_f);
>>> 1530: }
>>
>> I just saw that `_f` is a `short`, which I think is 16 bits, right? And the cast to `uint` would mean we take 32 bits. That looks a bit off, but maybe it is not. Can you explain, and maybe also put a comment in the code for that?
>
> This is to comply with Node::hash signature which returns uint value
But does that not mean that we have a 4-byte load, but the end of the object already happens after 2 bytes? If so, what are those 2 extra bytes? Is that safe and correct?
>> test/hotspot/jtreg/compiler/c2/irTests/TestFloat16ScalarOperations.java line 494:
>>
>>> 492: assertResult(fma(valueOf(1.0f), valueOf(2.0f), valueOf(3.0f)).floatValue(), 1.0f * 2.0f + 3.0f, "testFMAConstantFolding");
>>> 493: }
>>> 494: }
>>
>> I am missing constant folding tests with `shortBitsToFloat16` etc.
>
> Added a few test points for the same
Oh, I was more hoping for a separate test with `shortBitsToFloat16`, not mixed in with `fma`.
And what about constant folding tests for `float16ToRawShortBits`?
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/22754#discussion_r1888887926
PR Review Comment: https://git.openjdk.org/jdk/pull/22754#discussion_r1888885400
PR Review Comment: https://git.openjdk.org/jdk/pull/22754#discussion_r1888869947
PR Review Comment: https://git.openjdk.org/jdk/pull/22754#discussion_r1888875984
More information about the hotspot-compiler-dev
mailing list