RFR: 8303278: Imprecise bottom type of ExtractB/UB [v2]
Tobias Hartmann
thartmann at openjdk.org
Mon Apr 3 05:30:23 UTC 2023
On Wed, 29 Mar 2023 01:22:10 GMT, Eric Liu <eliu at openjdk.org> wrote:
>> This is a trivial patch, which fixes the bottom type of ExtractB/UB nodes.
>>
>> ExtractNode can be generated by Vector API Vector.lane(int), which gets the lane element at the given index. A more precise type of range can help to optimize out unnecessary type conversion in some cases.
>>
>> Below shows a typical case used ExtractBNode
>>
>>
>> public static byte byteLt16() {
>> ByteVector vecb = ByteVector.broadcast(ByteVector.SPECIES_128, 1);
>> return vecb.lane(1);
>> }
>>
>>
>> In this case, c2 constructs IR graph like:
>>
>> ExtractB ConI(24)
>> | __|
>> | / |
>> LShiftI __|
>> | /
>> RShiftI
>>
>> which generates AArch64 code:
>>
>> movi v16.16b, #0x1
>> smov x11, v16.b[1]
>> sxtb w0, w11
>>
>> with this patch, this shift pair can be optimized out by RShiftI's identity [1]. The code is optimized to:
>>
>> movi v16.16b, #0x1
>> smov x0, v16.b[1]
>>
>> [TEST]
>>
>> Full jtreg passed except 4 files on x86:
>>
>> jdk/incubator/vector/Byte128VectorTests.java
>> jdk/incubator/vector/Byte256VectorTests.java
>> jdk/incubator/vector/Byte512VectorTests.java
>> jdk/incubator/vector/Byte64VectorTests.java
>>
>> They are caused by a known issue on x86 [2].
>>
>> [1] https://github.com/openjdk/jdk/blob/742bc041eaba1ff9beb7f5b6d896e4f382b030ea/src/hotspot/share/opto/mulnode.cpp#L1052
>> [2] https://bugs.openjdk.org/browse/JDK-8303508
>
> Eric Liu has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains two additional commits since the last revision:
>
> - Merge jdk:master
>
> Change-Id: I40cce803da09bae31cd74b86bf93607a08219545
> - 8303278: Imprecise bottom type of ExtractB/UB
>
> This is a trivial patch, which fixes the bottom type of ExtractB/UB
> nodes.
>
> ExtractNode can be generated by Vector API Vector.lane(int), which gets
> the lane element at the given index. A more precise type of range can
> help to optimize out unnecessary type conversion in some cases.
>
> Below shows a typical case used ExtractBNode
>
> ```
> public static byte byteLt16() {
> ByteVector vecb = ByteVector.broadcast(ByteVector.SPECIES_128, 1);
> return vecb.lane(1);
> }
>
> ```
> In this case, c2 constructs IR graph like:
>
> ExtractB ConI(24)
> | __|
> | / |
> LShiftI __|
> | /
> RShiftI
>
> which generates AArch64 code:
>
> movi v16.16b, #0x1
> smov x11, v16.b[1]
> sxtb w0, w11
>
> with this patch, this shift pair can be optimized out by RShiftI's
> identity [1]. The code is optimized to:
>
> movi v16.16b, #0x1
> smov x0, v16.b[1]
>
> [TEST]
>
> Full jtreg passed except 4 files on x86:
>
> jdk/incubator/vector/Byte128VectorTests.java
> jdk/incubator/vector/Byte256VectorTests.java
> jdk/incubator/vector/Byte512VectorTests.java
> jdk/incubator/vector/Byte64VectorTests.java
>
> They are caused by a known issue on x86 [2].
>
> [1] https://github.com/openjdk/jdk/blob/742bc041eaba1ff9beb7f5b6d896e4f382b030ea/src/hotspot/share/opto/mulnode.cpp#L1052
> [2] https://bugs.openjdk.org/browse/JDK-8303508
>
> Change-Id: Ibea9aeacb41b4d1c5b2621c7a97494429394b599
Looks good. All tests passed.
-------------
Marked as reviewed by thartmann (Reviewer).
PR Review: https://git.openjdk.org/jdk/pull/13070#pullrequestreview-1368306807
More information about the hotspot-compiler-dev
mailing list