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