RFR: 8321308: AArch64: Fix matching predication for cbz/cbnz
Fei Gao
fgao at openjdk.org
Wed Dec 6 02:00:10 UTC 2023
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.
-------------
Commit messages:
- 8321308: AArch64: Fix matching predication for cbz/cbnz
Changes: https://git.openjdk.org/jdk/pull/16989/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=16989&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8321308
Stats: 103 lines in 3 files changed: 94 ins; 0 del; 9 mod
Patch: https://git.openjdk.org/jdk/pull/16989.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/16989/head:pull/16989
PR: https://git.openjdk.org/jdk/pull/16989
More information about the hotspot-compiler-dev
mailing list