Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
171 changes: 171 additions & 0 deletions llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,23 @@
; 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]
%r = atomicrmw fadd ptr %ptr, half %value monotonic, align 2
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]
Expand All @@ -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]
Expand All @@ -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]
Expand All @@ -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]
Expand All @@ -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]
Expand All @@ -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]
Expand All @@ -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]
Expand All @@ -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]
Expand Down Expand Up @@ -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]
Expand All @@ -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]
Expand All @@ -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]
Expand All @@ -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]
Expand All @@ -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]
Expand All @@ -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]
Expand All @@ -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]
Expand All @@ -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]
Expand Down Expand Up @@ -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]
Expand All @@ -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]
Expand All @@ -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]
Expand All @@ -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]
Expand All @@ -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]
Expand All @@ -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]
Expand All @@ -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]
Expand All @@ -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]
Expand Down
Loading
Loading