RFR: 8321308: AArch64: Fix matching predication for cbz/cbnz
Fei Yang
fyang at openjdk.org
Fri Jan 26 02:04:25 UTC 2024
On Wed, 6 Dec 2023 01:54:59 GMT, Fei Gao <fgao at openjdk.org> wrote:
> For array length check like:
>
> if (a.length > 0) {
> [Block 1]
> } else {
> [Block 2]
> }
>
>
> Since `a.length` is unsigned, it's semantically equivalent to:
>
> if (a.length != 0) {
> [Block 1]
> } else {
> [Block 2]
> }
>
>
> On aarch64 port, we can do the conversion like above, during c2 compiler instruction matching, for certain unsigned integral comparisons.
>
> For example,
>
> cmpw w11, #0 # unsigned
> bls label # unsigned
> [Block 1]
>
> label:
> [Block 2]
>
>
> can be converted to:
>
> cbz w11, label
> [Block 1]
>
> label:
> [Block 2]
>
>
> Currently, we have some matching rules to do the conversion [[1]](https://github.com/openjdk/jdk/blob/master/src/hotspot/cpu/aarch64/aarch64.ad#L16179). But the predicate here [[2]](https://github.com/openjdk/jdk/blob/master/src/hotspot/cpu/aarch64/aarch64.ad#L6140) matches wrong `BoolTest` masks, so these rules fail to convert. I guess it's a typo introduced in [JDK-8160006](https://bugs.openjdk.org/browse/JDK-8160006). The patch fixes it.
LGTM. Now the predicate the same as riscv's `cmpOpUEqNeLeGt` operand.
-------------
Marked as reviewed by fyang (Reviewer).
PR Review: https://git.openjdk.org/jdk/pull/16989#pullrequestreview-1844980318
More information about the hotspot-compiler-dev
mailing list