diff options
author | Kerry McLaughlin <kerry.mclaughlin@arm.com> | 2025-03-19 17:10:02 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-19 17:10:02 +0000 |
commit | d09ecb07c2894e3167b6cfb5761663fe0f01b905 (patch) | |
tree | 85a4cb28ffb8b5be43e6c732b23d8d808869755d | |
parent | dd17c649abbfc7e4052e45d3240b23feb6530a31 (diff) | |
download | llvm-d09ecb07c2894e3167b6cfb5761663fe0f01b905.zip llvm-d09ecb07c2894e3167b6cfb5761663fe0f01b905.tar.gz llvm-d09ecb07c2894e3167b6cfb5761663fe0f01b905.tar.bz2 |
[AArch64][CodeGen] Add +lsfe atomicrmw tests where the result is unused. (#132022)
Following the discussion on #131174, update generate-tests.py script to
emit atomicrmw tests where the result is unused and add a note to
explain why these do use ST[F]ADD.
3 files changed, 379 insertions, 4 deletions
diff --git a/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll b/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll index fc9a126..ef1f11e 100644 --- a/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll +++ b/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll @@ -3,6 +3,9 @@ ; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 -mattr=+lsfe -O0 | FileCheck %s --check-prefixes=CHECK,-O0 ; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 -mattr=+lsfe -O1 | FileCheck %s --check-prefixes=CHECK,-O1 +; NOTE: '_unused' tests are added to ensure we do not lower to ST[F]ADD when the destination register is WZR/XZR. +; See discussion on https://github.com/llvm/llvm-project/pull/131174 + define dso_local half @atomicrmw_fadd_half_aligned_monotonic(ptr %ptr, half %value) { ; CHECK-LABEL: atomicrmw_fadd_half_aligned_monotonic: ; CHECK: ldfadd h0, h0, [x0] @@ -10,6 +13,13 @@ define dso_local half @atomicrmw_fadd_half_aligned_monotonic(ptr %ptr, half %val ret half %r } +define dso_local void @atomicrmw_fadd_half_aligned_monotonic_unused(ptr %ptr, half %value) { +; CHECK-LABEL: atomicrmw_fadd_half_aligned_monotonic_unused: +; CHECK: ldfadd h0, h0, [x0] + %r = atomicrmw fadd ptr %ptr, half %value monotonic, align 2 + ret void +} + define dso_local half @atomicrmw_fadd_half_aligned_acquire(ptr %ptr, half %value) { ; CHECK-LABEL: atomicrmw_fadd_half_aligned_acquire: ; CHECK: ldfadda h0, h0, [x0] @@ -24,6 +34,13 @@ define dso_local half @atomicrmw_fadd_half_aligned_release(ptr %ptr, half %value ret half %r } +define dso_local void @atomicrmw_fadd_half_aligned_release_unused(ptr %ptr, half %value) { +; CHECK-LABEL: atomicrmw_fadd_half_aligned_release_unused: +; CHECK: ldfaddl h0, h0, [x0] + %r = atomicrmw fadd ptr %ptr, half %value release, align 2 + ret void +} + define dso_local half @atomicrmw_fadd_half_aligned_acq_rel(ptr %ptr, half %value) { ; CHECK-LABEL: atomicrmw_fadd_half_aligned_acq_rel: ; CHECK: ldfaddal h0, h0, [x0] @@ -45,6 +62,13 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_monotonic(ptr %ptr, bfloa ret bfloat %r } +define dso_local void @atomicrmw_fadd_bfloat_aligned_monotonic_unused(ptr %ptr, bfloat %value) { +; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_monotonic_unused: +; CHECK: ldbfadd h0, h0, [x0] + %r = atomicrmw fadd ptr %ptr, bfloat %value monotonic, align 2 + ret void +} + define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acquire(ptr %ptr, bfloat %value) { ; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acquire: ; CHECK: ldbfadda h0, h0, [x0] @@ -59,6 +83,13 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_release(ptr %ptr, bfloat ret bfloat %r } +define dso_local void @atomicrmw_fadd_bfloat_aligned_release_unused(ptr %ptr, bfloat %value) { +; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_release_unused: +; CHECK: ldbfaddl h0, h0, [x0] + %r = atomicrmw fadd ptr %ptr, bfloat %value release, align 2 + ret void +} + define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) { ; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acq_rel: ; CHECK: ldbfaddal h0, h0, [x0] @@ -80,6 +111,13 @@ define dso_local float @atomicrmw_fadd_float_aligned_monotonic(ptr %ptr, float % ret float %r } +define dso_local void @atomicrmw_fadd_float_aligned_monotonic_unused(ptr %ptr, float %value) { +; CHECK-LABEL: atomicrmw_fadd_float_aligned_monotonic_unused: +; CHECK: ldfadd s0, s0, [x0] + %r = atomicrmw fadd ptr %ptr, float %value monotonic, align 4 + ret void +} + define dso_local float @atomicrmw_fadd_float_aligned_acquire(ptr %ptr, float %value) { ; CHECK-LABEL: atomicrmw_fadd_float_aligned_acquire: ; CHECK: ldfadda s0, s0, [x0] @@ -94,6 +132,13 @@ define dso_local float @atomicrmw_fadd_float_aligned_release(ptr %ptr, float %va ret float %r } +define dso_local void @atomicrmw_fadd_float_aligned_release_unused(ptr %ptr, float %value) { +; CHECK-LABEL: atomicrmw_fadd_float_aligned_release_unused: +; CHECK: ldfaddl s0, s0, [x0] + %r = atomicrmw fadd ptr %ptr, float %value release, align 4 + ret void +} + define dso_local float @atomicrmw_fadd_float_aligned_acq_rel(ptr %ptr, float %value) { ; CHECK-LABEL: atomicrmw_fadd_float_aligned_acq_rel: ; CHECK: ldfaddal s0, s0, [x0] @@ -115,6 +160,13 @@ define dso_local double @atomicrmw_fadd_double_aligned_monotonic(ptr %ptr, doubl ret double %r } +define dso_local void @atomicrmw_fadd_double_aligned_monotonic_unused(ptr %ptr, double %value) { +; CHECK-LABEL: atomicrmw_fadd_double_aligned_monotonic_unused: +; CHECK: ldfadd d0, d0, [x0] + %r = atomicrmw fadd ptr %ptr, double %value monotonic, align 8 + ret void +} + define dso_local double @atomicrmw_fadd_double_aligned_acquire(ptr %ptr, double %value) { ; CHECK-LABEL: atomicrmw_fadd_double_aligned_acquire: ; CHECK: ldfadda d0, d0, [x0] @@ -129,6 +181,13 @@ define dso_local double @atomicrmw_fadd_double_aligned_release(ptr %ptr, double ret double %r } +define dso_local void @atomicrmw_fadd_double_aligned_release_unused(ptr %ptr, double %value) { +; CHECK-LABEL: atomicrmw_fadd_double_aligned_release_unused: +; CHECK: ldfaddl d0, d0, [x0] + %r = atomicrmw fadd ptr %ptr, double %value release, align 8 + ret void +} + define dso_local double @atomicrmw_fadd_double_aligned_acq_rel(ptr %ptr, double %value) { ; CHECK-LABEL: atomicrmw_fadd_double_aligned_acq_rel: ; CHECK: ldfaddal d0, d0, [x0] @@ -805,6 +864,13 @@ define dso_local half @atomicrmw_fmax_half_aligned_monotonic(ptr %ptr, half %val ret half %r } +define dso_local void @atomicrmw_fmax_half_aligned_monotonic_unused(ptr %ptr, half %value) { +; CHECK-LABEL: atomicrmw_fmax_half_aligned_monotonic_unused: +; CHECK: ldfmaxnm h0, h0, [x0] + %r = atomicrmw fmax ptr %ptr, half %value monotonic, align 2 + ret void +} + define dso_local half @atomicrmw_fmax_half_aligned_acquire(ptr %ptr, half %value) { ; CHECK-LABEL: atomicrmw_fmax_half_aligned_acquire: ; CHECK: ldfmaxnma h0, h0, [x0] @@ -819,6 +885,13 @@ define dso_local half @atomicrmw_fmax_half_aligned_release(ptr %ptr, half %value ret half %r } +define dso_local void @atomicrmw_fmax_half_aligned_release_unused(ptr %ptr, half %value) { +; CHECK-LABEL: atomicrmw_fmax_half_aligned_release_unused: +; CHECK: ldfmaxnml h0, h0, [x0] + %r = atomicrmw fmax ptr %ptr, half %value release, align 2 + ret void +} + define dso_local half @atomicrmw_fmax_half_aligned_acq_rel(ptr %ptr, half %value) { ; CHECK-LABEL: atomicrmw_fmax_half_aligned_acq_rel: ; CHECK: ldfmaxnmal h0, h0, [x0] @@ -840,6 +913,13 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_monotonic(ptr %ptr, bfloa ret bfloat %r } +define dso_local void @atomicrmw_fmax_bfloat_aligned_monotonic_unused(ptr %ptr, bfloat %value) { +; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_monotonic_unused: +; CHECK: ldbfmaxnm h0, h0, [x0] + %r = atomicrmw fmax ptr %ptr, bfloat %value monotonic, align 2 + ret void +} + define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acquire(ptr %ptr, bfloat %value) { ; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acquire: ; CHECK: ldbfmaxnma h0, h0, [x0] @@ -854,6 +934,13 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_release(ptr %ptr, bfloat ret bfloat %r } +define dso_local void @atomicrmw_fmax_bfloat_aligned_release_unused(ptr %ptr, bfloat %value) { +; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_release_unused: +; CHECK: ldbfmaxnml h0, h0, [x0] + %r = atomicrmw fmax ptr %ptr, bfloat %value release, align 2 + ret void +} + define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) { ; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acq_rel: ; CHECK: ldbfmaxnmal h0, h0, [x0] @@ -875,6 +962,13 @@ define dso_local float @atomicrmw_fmax_float_aligned_monotonic(ptr %ptr, float % ret float %r } +define dso_local void @atomicrmw_fmax_float_aligned_monotonic_unused(ptr %ptr, float %value) { +; CHECK-LABEL: atomicrmw_fmax_float_aligned_monotonic_unused: +; CHECK: ldfmaxnm s0, s0, [x0] + %r = atomicrmw fmax ptr %ptr, float %value monotonic, align 4 + ret void +} + define dso_local float @atomicrmw_fmax_float_aligned_acquire(ptr %ptr, float %value) { ; CHECK-LABEL: atomicrmw_fmax_float_aligned_acquire: ; CHECK: ldfmaxnma s0, s0, [x0] @@ -889,6 +983,13 @@ define dso_local float @atomicrmw_fmax_float_aligned_release(ptr %ptr, float %va ret float %r } +define dso_local void @atomicrmw_fmax_float_aligned_release_unused(ptr %ptr, float %value) { +; CHECK-LABEL: atomicrmw_fmax_float_aligned_release_unused: +; CHECK: ldfmaxnml s0, s0, [x0] + %r = atomicrmw fmax ptr %ptr, float %value release, align 4 + ret void +} + define dso_local float @atomicrmw_fmax_float_aligned_acq_rel(ptr %ptr, float %value) { ; CHECK-LABEL: atomicrmw_fmax_float_aligned_acq_rel: ; CHECK: ldfmaxnmal s0, s0, [x0] @@ -910,6 +1011,13 @@ define dso_local double @atomicrmw_fmax_double_aligned_monotonic(ptr %ptr, doubl ret double %r } +define dso_local void @atomicrmw_fmax_double_aligned_monotonic_unused(ptr %ptr, double %value) { +; CHECK-LABEL: atomicrmw_fmax_double_aligned_monotonic_unused: +; CHECK: ldfmaxnm d0, d0, [x0] + %r = atomicrmw fmax ptr %ptr, double %value monotonic, align 8 + ret void +} + define dso_local double @atomicrmw_fmax_double_aligned_acquire(ptr %ptr, double %value) { ; CHECK-LABEL: atomicrmw_fmax_double_aligned_acquire: ; CHECK: ldfmaxnma d0, d0, [x0] @@ -924,6 +1032,13 @@ define dso_local double @atomicrmw_fmax_double_aligned_release(ptr %ptr, double ret double %r } +define dso_local void @atomicrmw_fmax_double_aligned_release_unused(ptr %ptr, double %value) { +; CHECK-LABEL: atomicrmw_fmax_double_aligned_release_unused: +; CHECK: ldfmaxnml d0, d0, [x0] + %r = atomicrmw fmax ptr %ptr, double %value release, align 8 + ret void +} + define dso_local double @atomicrmw_fmax_double_aligned_acq_rel(ptr %ptr, double %value) { ; CHECK-LABEL: atomicrmw_fmax_double_aligned_acq_rel: ; CHECK: ldfmaxnmal d0, d0, [x0] @@ -1120,6 +1235,13 @@ define dso_local half @atomicrmw_fmin_half_aligned_monotonic(ptr %ptr, half %val ret half %r } +define dso_local void @atomicrmw_fmin_half_aligned_monotonic_unused(ptr %ptr, half %value) { +; CHECK-LABEL: atomicrmw_fmin_half_aligned_monotonic_unused: +; CHECK: ldfminnm h0, h0, [x0] + %r = atomicrmw fmin ptr %ptr, half %value monotonic, align 2 + ret void +} + define dso_local half @atomicrmw_fmin_half_aligned_acquire(ptr %ptr, half %value) { ; CHECK-LABEL: atomicrmw_fmin_half_aligned_acquire: ; CHECK: ldfminnma h0, h0, [x0] @@ -1134,6 +1256,13 @@ define dso_local half @atomicrmw_fmin_half_aligned_release(ptr %ptr, half %value ret half %r } +define dso_local void @atomicrmw_fmin_half_aligned_release_unused(ptr %ptr, half %value) { +; CHECK-LABEL: atomicrmw_fmin_half_aligned_release_unused: +; CHECK: ldfminnml h0, h0, [x0] + %r = atomicrmw fmin ptr %ptr, half %value release, align 2 + ret void +} + define dso_local half @atomicrmw_fmin_half_aligned_acq_rel(ptr %ptr, half %value) { ; CHECK-LABEL: atomicrmw_fmin_half_aligned_acq_rel: ; CHECK: ldfminnmal h0, h0, [x0] @@ -1155,6 +1284,13 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_monotonic(ptr %ptr, bfloa ret bfloat %r } +define dso_local void @atomicrmw_fmin_bfloat_aligned_monotonic_unused(ptr %ptr, bfloat %value) { +; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_monotonic_unused: +; CHECK: ldbfminnm h0, h0, [x0] + %r = atomicrmw fmin ptr %ptr, bfloat %value monotonic, align 2 + ret void +} + define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acquire(ptr %ptr, bfloat %value) { ; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acquire: ; CHECK: ldbfminnma h0, h0, [x0] @@ -1169,6 +1305,13 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_release(ptr %ptr, bfloat ret bfloat %r } +define dso_local void @atomicrmw_fmin_bfloat_aligned_release_unused(ptr %ptr, bfloat %value) { +; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_release_unused: +; CHECK: ldbfminnml h0, h0, [x0] + %r = atomicrmw fmin ptr %ptr, bfloat %value release, align 2 + ret void +} + define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) { ; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acq_rel: ; CHECK: ldbfminnmal h0, h0, [x0] @@ -1190,6 +1333,13 @@ define dso_local float @atomicrmw_fmin_float_aligned_monotonic(ptr %ptr, float % ret float %r } +define dso_local void @atomicrmw_fmin_float_aligned_monotonic_unused(ptr %ptr, float %value) { +; CHECK-LABEL: atomicrmw_fmin_float_aligned_monotonic_unused: +; CHECK: ldfminnm s0, s0, [x0] + %r = atomicrmw fmin ptr %ptr, float %value monotonic, align 4 + ret void +} + define dso_local float @atomicrmw_fmin_float_aligned_acquire(ptr %ptr, float %value) { ; CHECK-LABEL: atomicrmw_fmin_float_aligned_acquire: ; CHECK: ldfminnma s0, s0, [x0] @@ -1204,6 +1354,13 @@ define dso_local float @atomicrmw_fmin_float_aligned_release(ptr %ptr, float %va ret float %r } +define dso_local void @atomicrmw_fmin_float_aligned_release_unused(ptr %ptr, float %value) { +; CHECK-LABEL: atomicrmw_fmin_float_aligned_release_unused: +; CHECK: ldfminnml s0, s0, [x0] + %r = atomicrmw fmin ptr %ptr, float %value release, align 4 + ret void +} + define dso_local float @atomicrmw_fmin_float_aligned_acq_rel(ptr %ptr, float %value) { ; CHECK-LABEL: atomicrmw_fmin_float_aligned_acq_rel: ; CHECK: ldfminnmal s0, s0, [x0] @@ -1225,6 +1382,13 @@ define dso_local double @atomicrmw_fmin_double_aligned_monotonic(ptr %ptr, doubl ret double %r } +define dso_local void @atomicrmw_fmin_double_aligned_monotonic_unused(ptr %ptr, double %value) { +; CHECK-LABEL: atomicrmw_fmin_double_aligned_monotonic_unused: +; CHECK: ldfminnm d0, d0, [x0] + %r = atomicrmw fmin ptr %ptr, double %value monotonic, align 8 + ret void +} + define dso_local double @atomicrmw_fmin_double_aligned_acquire(ptr %ptr, double %value) { ; CHECK-LABEL: atomicrmw_fmin_double_aligned_acquire: ; CHECK: ldfminnma d0, d0, [x0] @@ -1239,6 +1403,13 @@ define dso_local double @atomicrmw_fmin_double_aligned_release(ptr %ptr, double ret double %r } +define dso_local void @atomicrmw_fmin_double_aligned_release_unused(ptr %ptr, double %value) { +; CHECK-LABEL: atomicrmw_fmin_double_aligned_release_unused: +; CHECK: ldfminnml d0, d0, [x0] + %r = atomicrmw fmin ptr %ptr, double %value release, align 8 + ret void +} + define dso_local double @atomicrmw_fmin_double_aligned_acq_rel(ptr %ptr, double %value) { ; CHECK-LABEL: atomicrmw_fmin_double_aligned_acq_rel: ; CHECK: ldfminnmal d0, d0, [x0] diff --git a/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll b/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll index a22cc58..b43d6eb 100644 --- a/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll +++ b/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll @@ -3,6 +3,9 @@ ; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64_be -mattr=+lsfe -O0 | FileCheck %s --check-prefixes=CHECK,-O0 ; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64_be -mattr=+lsfe -O1 | FileCheck %s --check-prefixes=CHECK,-O1 +; NOTE: '_unused' tests are added to ensure we do not lower to ST[F]ADD when the destination register is WZR/XZR. +; See discussion on https://github.com/llvm/llvm-project/pull/131174 + define dso_local half @atomicrmw_fadd_half_aligned_monotonic(ptr %ptr, half %value) { ; CHECK-LABEL: atomicrmw_fadd_half_aligned_monotonic: ; CHECK: ldfadd h0, h0, [x0] @@ -10,6 +13,13 @@ define dso_local half @atomicrmw_fadd_half_aligned_monotonic(ptr %ptr, half %val ret half %r } +define dso_local void @atomicrmw_fadd_half_aligned_monotonic_unused(ptr %ptr, half %value) { +; CHECK-LABEL: atomicrmw_fadd_half_aligned_monotonic_unused: +; CHECK: ldfadd h0, h0, [x0] + %r = atomicrmw fadd ptr %ptr, half %value monotonic, align 2 + ret void +} + define dso_local half @atomicrmw_fadd_half_aligned_acquire(ptr %ptr, half %value) { ; CHECK-LABEL: atomicrmw_fadd_half_aligned_acquire: ; CHECK: ldfadda h0, h0, [x0] @@ -24,6 +34,13 @@ define dso_local half @atomicrmw_fadd_half_aligned_release(ptr %ptr, half %value ret half %r } +define dso_local void @atomicrmw_fadd_half_aligned_release_unused(ptr %ptr, half %value) { +; CHECK-LABEL: atomicrmw_fadd_half_aligned_release_unused: +; CHECK: ldfaddl h0, h0, [x0] + %r = atomicrmw fadd ptr %ptr, half %value release, align 2 + ret void +} + define dso_local half @atomicrmw_fadd_half_aligned_acq_rel(ptr %ptr, half %value) { ; CHECK-LABEL: atomicrmw_fadd_half_aligned_acq_rel: ; CHECK: ldfaddal h0, h0, [x0] @@ -45,6 +62,13 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_monotonic(ptr %ptr, bfloa ret bfloat %r } +define dso_local void @atomicrmw_fadd_bfloat_aligned_monotonic_unused(ptr %ptr, bfloat %value) { +; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_monotonic_unused: +; CHECK: ldbfadd h0, h0, [x0] + %r = atomicrmw fadd ptr %ptr, bfloat %value monotonic, align 2 + ret void +} + define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acquire(ptr %ptr, bfloat %value) { ; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acquire: ; CHECK: ldbfadda h0, h0, [x0] @@ -59,6 +83,13 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_release(ptr %ptr, bfloat ret bfloat %r } +define dso_local void @atomicrmw_fadd_bfloat_aligned_release_unused(ptr %ptr, bfloat %value) { +; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_release_unused: +; CHECK: ldbfaddl h0, h0, [x0] + %r = atomicrmw fadd ptr %ptr, bfloat %value release, align 2 + ret void +} + define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) { ; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acq_rel: ; CHECK: ldbfaddal h0, h0, [x0] @@ -80,6 +111,13 @@ define dso_local float @atomicrmw_fadd_float_aligned_monotonic(ptr %ptr, float % ret float %r } +define dso_local void @atomicrmw_fadd_float_aligned_monotonic_unused(ptr %ptr, float %value) { +; CHECK-LABEL: atomicrmw_fadd_float_aligned_monotonic_unused: +; CHECK: ldfadd s0, s0, [x0] + %r = atomicrmw fadd ptr %ptr, float %value monotonic, align 4 + ret void +} + define dso_local float @atomicrmw_fadd_float_aligned_acquire(ptr %ptr, float %value) { ; CHECK-LABEL: atomicrmw_fadd_float_aligned_acquire: ; CHECK: ldfadda s0, s0, [x0] @@ -94,6 +132,13 @@ define dso_local float @atomicrmw_fadd_float_aligned_release(ptr %ptr, float %va ret float %r } +define dso_local void @atomicrmw_fadd_float_aligned_release_unused(ptr %ptr, float %value) { +; CHECK-LABEL: atomicrmw_fadd_float_aligned_release_unused: +; CHECK: ldfaddl s0, s0, [x0] + %r = atomicrmw fadd ptr %ptr, float %value release, align 4 + ret void +} + define dso_local float @atomicrmw_fadd_float_aligned_acq_rel(ptr %ptr, float %value) { ; CHECK-LABEL: atomicrmw_fadd_float_aligned_acq_rel: ; CHECK: ldfaddal s0, s0, [x0] @@ -115,6 +160,13 @@ define dso_local double @atomicrmw_fadd_double_aligned_monotonic(ptr %ptr, doubl ret double %r } +define dso_local void @atomicrmw_fadd_double_aligned_monotonic_unused(ptr %ptr, double %value) { +; CHECK-LABEL: atomicrmw_fadd_double_aligned_monotonic_unused: +; CHECK: ldfadd d0, d0, [x0] + %r = atomicrmw fadd ptr %ptr, double %value monotonic, align 8 + ret void +} + define dso_local double @atomicrmw_fadd_double_aligned_acquire(ptr %ptr, double %value) { ; CHECK-LABEL: atomicrmw_fadd_double_aligned_acquire: ; CHECK: ldfadda d0, d0, [x0] @@ -129,6 +181,13 @@ define dso_local double @atomicrmw_fadd_double_aligned_release(ptr %ptr, double ret double %r } +define dso_local void @atomicrmw_fadd_double_aligned_release_unused(ptr %ptr, double %value) { +; CHECK-LABEL: atomicrmw_fadd_double_aligned_release_unused: +; CHECK: ldfaddl d0, d0, [x0] + %r = atomicrmw fadd ptr %ptr, double %value release, align 8 + ret void +} + define dso_local double @atomicrmw_fadd_double_aligned_acq_rel(ptr %ptr, double %value) { ; CHECK-LABEL: atomicrmw_fadd_double_aligned_acq_rel: ; CHECK: ldfaddal d0, d0, [x0] @@ -820,6 +879,13 @@ define dso_local half @atomicrmw_fmax_half_aligned_monotonic(ptr %ptr, half %val ret half %r } +define dso_local void @atomicrmw_fmax_half_aligned_monotonic_unused(ptr %ptr, half %value) { +; CHECK-LABEL: atomicrmw_fmax_half_aligned_monotonic_unused: +; CHECK: ldfmaxnm h0, h0, [x0] + %r = atomicrmw fmax ptr %ptr, half %value monotonic, align 2 + ret void +} + define dso_local half @atomicrmw_fmax_half_aligned_acquire(ptr %ptr, half %value) { ; CHECK-LABEL: atomicrmw_fmax_half_aligned_acquire: ; CHECK: ldfmaxnma h0, h0, [x0] @@ -834,6 +900,13 @@ define dso_local half @atomicrmw_fmax_half_aligned_release(ptr %ptr, half %value ret half %r } +define dso_local void @atomicrmw_fmax_half_aligned_release_unused(ptr %ptr, half %value) { +; CHECK-LABEL: atomicrmw_fmax_half_aligned_release_unused: +; CHECK: ldfmaxnml h0, h0, [x0] + %r = atomicrmw fmax ptr %ptr, half %value release, align 2 + ret void +} + define dso_local half @atomicrmw_fmax_half_aligned_acq_rel(ptr %ptr, half %value) { ; CHECK-LABEL: atomicrmw_fmax_half_aligned_acq_rel: ; CHECK: ldfmaxnmal h0, h0, [x0] @@ -855,6 +928,13 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_monotonic(ptr %ptr, bfloa ret bfloat %r } +define dso_local void @atomicrmw_fmax_bfloat_aligned_monotonic_unused(ptr %ptr, bfloat %value) { +; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_monotonic_unused: +; CHECK: ldbfmaxnm h0, h0, [x0] + %r = atomicrmw fmax ptr %ptr, bfloat %value monotonic, align 2 + ret void +} + define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acquire(ptr %ptr, bfloat %value) { ; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acquire: ; CHECK: ldbfmaxnma h0, h0, [x0] @@ -869,6 +949,13 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_release(ptr %ptr, bfloat ret bfloat %r } +define dso_local void @atomicrmw_fmax_bfloat_aligned_release_unused(ptr %ptr, bfloat %value) { +; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_release_unused: +; CHECK: ldbfmaxnml h0, h0, [x0] + %r = atomicrmw fmax ptr %ptr, bfloat %value release, align 2 + ret void +} + define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) { ; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acq_rel: ; CHECK: ldbfmaxnmal h0, h0, [x0] @@ -890,6 +977,13 @@ define dso_local float @atomicrmw_fmax_float_aligned_monotonic(ptr %ptr, float % ret float %r } +define dso_local void @atomicrmw_fmax_float_aligned_monotonic_unused(ptr %ptr, float %value) { +; CHECK-LABEL: atomicrmw_fmax_float_aligned_monotonic_unused: +; CHECK: ldfmaxnm s0, s0, [x0] + %r = atomicrmw fmax ptr %ptr, float %value monotonic, align 4 + ret void +} + define dso_local float @atomicrmw_fmax_float_aligned_acquire(ptr %ptr, float %value) { ; CHECK-LABEL: atomicrmw_fmax_float_aligned_acquire: ; CHECK: ldfmaxnma s0, s0, [x0] @@ -904,6 +998,13 @@ define dso_local float @atomicrmw_fmax_float_aligned_release(ptr %ptr, float %va ret float %r } +define dso_local void @atomicrmw_fmax_float_aligned_release_unused(ptr %ptr, float %value) { +; CHECK-LABEL: atomicrmw_fmax_float_aligned_release_unused: +; CHECK: ldfmaxnml s0, s0, [x0] + %r = atomicrmw fmax ptr %ptr, float %value release, align 4 + ret void +} + define dso_local float @atomicrmw_fmax_float_aligned_acq_rel(ptr %ptr, float %value) { ; CHECK-LABEL: atomicrmw_fmax_float_aligned_acq_rel: ; CHECK: ldfmaxnmal s0, s0, [x0] @@ -925,6 +1026,13 @@ define dso_local double @atomicrmw_fmax_double_aligned_monotonic(ptr %ptr, doubl ret double %r } +define dso_local void @atomicrmw_fmax_double_aligned_monotonic_unused(ptr %ptr, double %value) { +; CHECK-LABEL: atomicrmw_fmax_double_aligned_monotonic_unused: +; CHECK: ldfmaxnm d0, d0, [x0] + %r = atomicrmw fmax ptr %ptr, double %value monotonic, align 8 + ret void +} + define dso_local double @atomicrmw_fmax_double_aligned_acquire(ptr %ptr, double %value) { ; CHECK-LABEL: atomicrmw_fmax_double_aligned_acquire: ; CHECK: ldfmaxnma d0, d0, [x0] @@ -939,6 +1047,13 @@ define dso_local double @atomicrmw_fmax_double_aligned_release(ptr %ptr, double ret double %r } +define dso_local void @atomicrmw_fmax_double_aligned_release_unused(ptr %ptr, double %value) { +; CHECK-LABEL: atomicrmw_fmax_double_aligned_release_unused: +; CHECK: ldfmaxnml d0, d0, [x0] + %r = atomicrmw fmax ptr %ptr, double %value release, align 8 + ret void +} + define dso_local double @atomicrmw_fmax_double_aligned_acq_rel(ptr %ptr, double %value) { ; CHECK-LABEL: atomicrmw_fmax_double_aligned_acq_rel: ; CHECK: ldfmaxnmal d0, d0, [x0] @@ -1135,6 +1250,13 @@ define dso_local half @atomicrmw_fmin_half_aligned_monotonic(ptr %ptr, half %val ret half %r } +define dso_local void @atomicrmw_fmin_half_aligned_monotonic_unused(ptr %ptr, half %value) { +; CHECK-LABEL: atomicrmw_fmin_half_aligned_monotonic_unused: +; CHECK: ldfminnm h0, h0, [x0] + %r = atomicrmw fmin ptr %ptr, half %value monotonic, align 2 + ret void +} + define dso_local half @atomicrmw_fmin_half_aligned_acquire(ptr %ptr, half %value) { ; CHECK-LABEL: atomicrmw_fmin_half_aligned_acquire: ; CHECK: ldfminnma h0, h0, [x0] @@ -1149,6 +1271,13 @@ define dso_local half @atomicrmw_fmin_half_aligned_release(ptr %ptr, half %value ret half %r } +define dso_local void @atomicrmw_fmin_half_aligned_release_unused(ptr %ptr, half %value) { +; CHECK-LABEL: atomicrmw_fmin_half_aligned_release_unused: +; CHECK: ldfminnml h0, h0, [x0] + %r = atomicrmw fmin ptr %ptr, half %value release, align 2 + ret void +} + define dso_local half @atomicrmw_fmin_half_aligned_acq_rel(ptr %ptr, half %value) { ; CHECK-LABEL: atomicrmw_fmin_half_aligned_acq_rel: ; CHECK: ldfminnmal h0, h0, [x0] @@ -1170,6 +1299,13 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_monotonic(ptr %ptr, bfloa ret bfloat %r } +define dso_local void @atomicrmw_fmin_bfloat_aligned_monotonic_unused(ptr %ptr, bfloat %value) { +; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_monotonic_unused: +; CHECK: ldbfminnm h0, h0, [x0] + %r = atomicrmw fmin ptr %ptr, bfloat %value monotonic, align 2 + ret void +} + define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acquire(ptr %ptr, bfloat %value) { ; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acquire: ; CHECK: ldbfminnma h0, h0, [x0] @@ -1184,6 +1320,13 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_release(ptr %ptr, bfloat ret bfloat %r } +define dso_local void @atomicrmw_fmin_bfloat_aligned_release_unused(ptr %ptr, bfloat %value) { +; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_release_unused: +; CHECK: ldbfminnml h0, h0, [x0] + %r = atomicrmw fmin ptr %ptr, bfloat %value release, align 2 + ret void +} + define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) { ; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acq_rel: ; CHECK: ldbfminnmal h0, h0, [x0] @@ -1205,6 +1348,13 @@ define dso_local float @atomicrmw_fmin_float_aligned_monotonic(ptr %ptr, float % ret float %r } +define dso_local void @atomicrmw_fmin_float_aligned_monotonic_unused(ptr %ptr, float %value) { +; CHECK-LABEL: atomicrmw_fmin_float_aligned_monotonic_unused: +; CHECK: ldfminnm s0, s0, [x0] + %r = atomicrmw fmin ptr %ptr, float %value monotonic, align 4 + ret void +} + define dso_local float @atomicrmw_fmin_float_aligned_acquire(ptr %ptr, float %value) { ; CHECK-LABEL: atomicrmw_fmin_float_aligned_acquire: ; CHECK: ldfminnma s0, s0, [x0] @@ -1219,6 +1369,13 @@ define dso_local float @atomicrmw_fmin_float_aligned_release(ptr %ptr, float %va ret float %r } +define dso_local void @atomicrmw_fmin_float_aligned_release_unused(ptr %ptr, float %value) { +; CHECK-LABEL: atomicrmw_fmin_float_aligned_release_unused: +; CHECK: ldfminnml s0, s0, [x0] + %r = atomicrmw fmin ptr %ptr, float %value release, align 4 + ret void +} + define dso_local float @atomicrmw_fmin_float_aligned_acq_rel(ptr %ptr, float %value) { ; CHECK-LABEL: atomicrmw_fmin_float_aligned_acq_rel: ; CHECK: ldfminnmal s0, s0, [x0] @@ -1240,6 +1397,13 @@ define dso_local double @atomicrmw_fmin_double_aligned_monotonic(ptr %ptr, doubl ret double %r } +define dso_local void @atomicrmw_fmin_double_aligned_monotonic_unused(ptr %ptr, double %value) { +; CHECK-LABEL: atomicrmw_fmin_double_aligned_monotonic_unused: +; CHECK: ldfminnm d0, d0, [x0] + %r = atomicrmw fmin ptr %ptr, double %value monotonic, align 8 + ret void +} + define dso_local double @atomicrmw_fmin_double_aligned_acquire(ptr %ptr, double %value) { ; CHECK-LABEL: atomicrmw_fmin_double_aligned_acquire: ; CHECK: ldfminnma d0, d0, [x0] @@ -1254,6 +1418,13 @@ define dso_local double @atomicrmw_fmin_double_aligned_release(ptr %ptr, double ret double %r } +define dso_local void @atomicrmw_fmin_double_aligned_release_unused(ptr %ptr, double %value) { +; CHECK-LABEL: atomicrmw_fmin_double_aligned_release_unused: +; CHECK: ldfminnml d0, d0, [x0] + %r = atomicrmw fmin ptr %ptr, double %value release, align 8 + ret void +} + define dso_local double @atomicrmw_fmin_double_aligned_acq_rel(ptr %ptr, double %value) { ; CHECK-LABEL: atomicrmw_fmin_double_aligned_acq_rel: ; CHECK: ldfminnmal d0, d0, [x0] diff --git a/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py b/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py index f40bbae..24d1ef1 100755 --- a/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py +++ b/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py @@ -189,19 +189,29 @@ def relpath(): return fp +def generate_unused_res_test(featname, ordering, op, alignval): + if featname != "lsfe" or op == "fsub" or alignval == 1: + return False + if ordering not in [AtomicOrder.monotonic, AtomicOrder.release]: + return False + return True + + def align(val, aligned: bool) -> int: return val if aligned else 1 -def all_atomicrmw(f, datatype, atomicrmw_ops): +def all_atomicrmw(f, datatype, atomicrmw_ops, featname): + instr = "atomicrmw" + generate_unused = False + tests = [] for op in atomicrmw_ops: for aligned in Aligned: for ty, val in datatype: alignval = align(val, aligned) for ordering in ATOMICRMW_ORDERS: name = f"atomicrmw_{op}_{ty}_{aligned}_{ordering}" - instr = "atomicrmw" - f.write( + tests.append( textwrap.dedent( f""" define dso_local {ty} @{name}(ptr %ptr, {ty} %value) {{ @@ -211,6 +221,29 @@ def all_atomicrmw(f, datatype, atomicrmw_ops): """ ) ) + if generate_unused_res_test(featname, ordering, op, alignval): + generate_unused = True + name = f"atomicrmw_{op}_{ty}_{aligned}_{ordering}_unused" + tests.append( + textwrap.dedent( + f""" + define dso_local void @{name}(ptr %ptr, {ty} %value) {{ + %r = {instr} {op} ptr %ptr, {ty} %value {ordering}, align {alignval} + ret void + }} + """ + ) + ) + + if generate_unused: + f.write( + "\n; NOTE: '_unused' tests are added to ensure we do not lower to " + "ST[F]ADD when the destination register is WZR/XZR.\n" + "; See discussion on https://github.com/llvm/llvm-project/pull/131174\n" + ) + + for test in tests: + f.write(test) def all_load(f): @@ -340,7 +373,7 @@ def write_lit_tests(feature, datatypes, ops): with open(f"{triple}-atomicrmw-{feat.name}.ll", "w") as f: filter_args = r'--filter-out "\b(sp)\b" --filter "^\s*(ld[^r]|st[^r]|swp|cas|bl|add|and|eor|orn|orr|sub|mvn|sxt|cmp|ccmp|csel|dmb)"' header(f, triple, [feat], filter_args) - all_atomicrmw(f, datatypes, ops) + all_atomicrmw(f, datatypes, ops, feat.name) # Floating point atomics only supported for atomicrmw currently if feature.test_scope() == "atomicrmw": |