Skip to content

[AArch64] Pre-commit tests for #125686 (NFC) #126643

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Feb 12, 2025

Conversation

jthackray
Copy link
Contributor

@jthackray jthackray commented Feb 11, 2025

Update the generate-tests.py script to create new tests for atomicrmw {fadd,fmin,fmax} and test these with half, float, bfloat and double.

Generate auto-tests to check both with and without +lsfe, so that when #125686 is merged, +lsfe will use a single atomic floating-point instruction.

@llvmbot
Copy link
Member

llvmbot commented Feb 11, 2025

@llvm/pr-subscribers-backend-aarch64

Author: Jonathan Thackray (jthackray)

Changes

Update the generate-tests.py script to create new tests for atomicrmw {fadd,fmin,fmax} and test these with half, float, bfloat and double.

Generate auto-tests to check both with and without +lsfe, so that when #125868 is merged, +lsfe will use a single atomic floating-point instruction.


Patch is 188.98 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/126643.diff

5 Files Affected:

  • (added) llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll (+2565)
  • (modified) llvm/test/CodeGen/AArch64/Atomics/aarch64-fence.ll (+2)
  • (added) llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll (+2625)
  • (modified) llvm/test/CodeGen/AArch64/Atomics/aarch64_be-fence.ll (+2)
  • (modified) llvm/test/CodeGen/AArch64/Atomics/generate-tests.py (+83-29)
diff --git a/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll b/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll
new file mode 100644
index 000000000000000..662f4fa8c4c3a64
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll
@@ -0,0 +1,2565 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --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)"
+; The base test file was generated by ./llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
+; 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
+; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64   | FileCheck %s --check-prefixes=CHECK-no-lsfe
+
+define dso_local half @atomicrmw_fadd_half_aligned_monotonic(ptr %ptr, half %value) {
+; -O0-LABEL: atomicrmw_fadd_half_aligned_monotonic:
+; -O0:    ldaxrh w0, [x9]
+; -O0:    cmp w0, w10, uxth
+; -O0:    stlxrh w8, w11, [x9]
+; -O0:    subs w8, w8, w0, uxth
+;
+; -O1-LABEL: atomicrmw_fadd_half_aligned_monotonic:
+; -O1:    ldxrh w8, [x0]
+; -O1:    stxrh w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_aligned_monotonic:
+; CHECK-no-lsfe:    ldxrh w8, [x0]
+; CHECK-no-lsfe:    stxrh w9, w8, [x0]
+    %r = atomicrmw fadd ptr %ptr, half %value monotonic, align 2
+    ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_aligned_acquire(ptr %ptr, half %value) {
+; -O0-LABEL: atomicrmw_fadd_half_aligned_acquire:
+; -O0:    ldaxrh w0, [x9]
+; -O0:    cmp w0, w10, uxth
+; -O0:    stlxrh w8, w11, [x9]
+; -O0:    subs w8, w8, w0, uxth
+;
+; -O1-LABEL: atomicrmw_fadd_half_aligned_acquire:
+; -O1:    ldaxrh w8, [x0]
+; -O1:    stxrh w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_aligned_acquire:
+; CHECK-no-lsfe:    ldaxrh w8, [x0]
+; CHECK-no-lsfe:    stxrh w9, w8, [x0]
+    %r = atomicrmw fadd ptr %ptr, half %value acquire, align 2
+    ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_aligned_release(ptr %ptr, half %value) {
+; -O0-LABEL: atomicrmw_fadd_half_aligned_release:
+; -O0:    ldaxrh w0, [x9]
+; -O0:    cmp w0, w10, uxth
+; -O0:    stlxrh w8, w11, [x9]
+; -O0:    subs w8, w8, w0, uxth
+;
+; -O1-LABEL: atomicrmw_fadd_half_aligned_release:
+; -O1:    ldxrh w8, [x0]
+; -O1:    stlxrh w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_aligned_release:
+; CHECK-no-lsfe:    ldxrh w8, [x0]
+; CHECK-no-lsfe:    stlxrh w9, w8, [x0]
+    %r = atomicrmw fadd ptr %ptr, half %value release, align 2
+    ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_aligned_acq_rel(ptr %ptr, half %value) {
+; -O0-LABEL: atomicrmw_fadd_half_aligned_acq_rel:
+; -O0:    ldaxrh w0, [x9]
+; -O0:    cmp w0, w10, uxth
+; -O0:    stlxrh w8, w11, [x9]
+; -O0:    subs w8, w8, w0, uxth
+;
+; -O1-LABEL: atomicrmw_fadd_half_aligned_acq_rel:
+; -O1:    ldaxrh w8, [x0]
+; -O1:    stlxrh w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_aligned_acq_rel:
+; CHECK-no-lsfe:    ldaxrh w8, [x0]
+; CHECK-no-lsfe:    stlxrh w9, w8, [x0]
+    %r = atomicrmw fadd ptr %ptr, half %value acq_rel, align 2
+    ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_aligned_seq_cst(ptr %ptr, half %value) {
+; -O0-LABEL: atomicrmw_fadd_half_aligned_seq_cst:
+; -O0:    ldaxrh w0, [x9]
+; -O0:    cmp w0, w10, uxth
+; -O0:    stlxrh w8, w11, [x9]
+; -O0:    subs w8, w8, w0, uxth
+;
+; -O1-LABEL: atomicrmw_fadd_half_aligned_seq_cst:
+; -O1:    ldaxrh w8, [x0]
+; -O1:    stlxrh w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_aligned_seq_cst:
+; CHECK-no-lsfe:    ldaxrh w8, [x0]
+; CHECK-no-lsfe:    stlxrh w9, w8, [x0]
+    %r = atomicrmw fadd ptr %ptr, half %value seq_cst, align 2
+    ret half %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_aligned_monotonic:
+; -O0:    add w8, w8, w9
+; -O0:    add w8, w8, w9
+; -O0:    ldaxrh w9, [x11]
+; -O0:    cmp w9, w8, uxth
+; -O0:    stlxrh w10, w12, [x11]
+; -O0:    subs w8, w9, w8, uxth
+; -O0:    subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_aligned_monotonic:
+; -O1:    ldxrh w9, [x0]
+; -O1:    add w9, w9, w8
+; -O1:    add w9, w10, w9
+; -O1:    stxrh w10, w9, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_aligned_monotonic:
+; CHECK-no-lsfe:    ldxrh w9, [x0]
+; CHECK-no-lsfe:    add w9, w9, w8
+; CHECK-no-lsfe:    add w9, w10, w9
+; CHECK-no-lsfe:    stxrh w10, w9, [x0]
+    %r = atomicrmw fadd ptr %ptr, bfloat %value monotonic, align 2
+    ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_aligned_acquire:
+; -O0:    add w8, w8, w9
+; -O0:    add w8, w8, w9
+; -O0:    ldaxrh w9, [x11]
+; -O0:    cmp w9, w8, uxth
+; -O0:    stlxrh w10, w12, [x11]
+; -O0:    subs w8, w9, w8, uxth
+; -O0:    subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_aligned_acquire:
+; -O1:    ldaxrh w9, [x0]
+; -O1:    add w9, w9, w8
+; -O1:    add w9, w10, w9
+; -O1:    stxrh w10, w9, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_aligned_acquire:
+; CHECK-no-lsfe:    ldaxrh w9, [x0]
+; CHECK-no-lsfe:    add w9, w9, w8
+; CHECK-no-lsfe:    add w9, w10, w9
+; CHECK-no-lsfe:    stxrh w10, w9, [x0]
+    %r = atomicrmw fadd ptr %ptr, bfloat %value acquire, align 2
+    ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_release(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_aligned_release:
+; -O0:    add w8, w8, w9
+; -O0:    add w8, w8, w9
+; -O0:    ldaxrh w9, [x11]
+; -O0:    cmp w9, w8, uxth
+; -O0:    stlxrh w10, w12, [x11]
+; -O0:    subs w8, w9, w8, uxth
+; -O0:    subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_aligned_release:
+; -O1:    ldxrh w9, [x0]
+; -O1:    add w9, w9, w8
+; -O1:    add w9, w10, w9
+; -O1:    stlxrh w10, w9, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_aligned_release:
+; CHECK-no-lsfe:    ldxrh w9, [x0]
+; CHECK-no-lsfe:    add w9, w9, w8
+; CHECK-no-lsfe:    add w9, w10, w9
+; CHECK-no-lsfe:    stlxrh w10, w9, [x0]
+    %r = atomicrmw fadd ptr %ptr, bfloat %value release, align 2
+    ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_aligned_acq_rel:
+; -O0:    add w8, w8, w9
+; -O0:    add w8, w8, w9
+; -O0:    ldaxrh w9, [x11]
+; -O0:    cmp w9, w8, uxth
+; -O0:    stlxrh w10, w12, [x11]
+; -O0:    subs w8, w9, w8, uxth
+; -O0:    subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_aligned_acq_rel:
+; -O1:    ldaxrh w9, [x0]
+; -O1:    add w9, w9, w8
+; -O1:    add w9, w10, w9
+; -O1:    stlxrh w10, w9, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_aligned_acq_rel:
+; CHECK-no-lsfe:    ldaxrh w9, [x0]
+; CHECK-no-lsfe:    add w9, w9, w8
+; CHECK-no-lsfe:    add w9, w10, w9
+; CHECK-no-lsfe:    stlxrh w10, w9, [x0]
+    %r = atomicrmw fadd ptr %ptr, bfloat %value acq_rel, align 2
+    ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_aligned_seq_cst:
+; -O0:    add w8, w8, w9
+; -O0:    add w8, w8, w9
+; -O0:    ldaxrh w9, [x11]
+; -O0:    cmp w9, w8, uxth
+; -O0:    stlxrh w10, w12, [x11]
+; -O0:    subs w8, w9, w8, uxth
+; -O0:    subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_aligned_seq_cst:
+; -O1:    ldaxrh w9, [x0]
+; -O1:    add w9, w9, w8
+; -O1:    add w9, w10, w9
+; -O1:    stlxrh w10, w9, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_aligned_seq_cst:
+; CHECK-no-lsfe:    ldaxrh w9, [x0]
+; CHECK-no-lsfe:    add w9, w9, w8
+; CHECK-no-lsfe:    add w9, w10, w9
+; CHECK-no-lsfe:    stlxrh w10, w9, [x0]
+    %r = atomicrmw fadd ptr %ptr, bfloat %value seq_cst, align 2
+    ret bfloat %r
+}
+
+define dso_local float @atomicrmw_fadd_float_aligned_monotonic(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fadd_float_aligned_monotonic:
+; -O0:    ldaxr w0, [x9]
+; -O0:    cmp w0, w10
+; -O0:    stlxr w8, w11, [x9]
+; -O0:    subs w8, w0, w8
+;
+; -O1-LABEL: atomicrmw_fadd_float_aligned_monotonic:
+; -O1:    ldxr w8, [x0]
+; -O1:    stxr w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_aligned_monotonic:
+; CHECK-no-lsfe:    ldxr w8, [x0]
+; CHECK-no-lsfe:    stxr w9, w8, [x0]
+    %r = atomicrmw fadd ptr %ptr, float %value monotonic, align 4
+    ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_aligned_acquire(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fadd_float_aligned_acquire:
+; -O0:    ldaxr w0, [x9]
+; -O0:    cmp w0, w10
+; -O0:    stlxr w8, w11, [x9]
+; -O0:    subs w8, w0, w8
+;
+; -O1-LABEL: atomicrmw_fadd_float_aligned_acquire:
+; -O1:    ldaxr w8, [x0]
+; -O1:    stxr w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_aligned_acquire:
+; CHECK-no-lsfe:    ldaxr w8, [x0]
+; CHECK-no-lsfe:    stxr w9, w8, [x0]
+    %r = atomicrmw fadd ptr %ptr, float %value acquire, align 4
+    ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_aligned_release(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fadd_float_aligned_release:
+; -O0:    ldaxr w0, [x9]
+; -O0:    cmp w0, w10
+; -O0:    stlxr w8, w11, [x9]
+; -O0:    subs w8, w0, w8
+;
+; -O1-LABEL: atomicrmw_fadd_float_aligned_release:
+; -O1:    ldxr w8, [x0]
+; -O1:    stlxr w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_aligned_release:
+; CHECK-no-lsfe:    ldxr w8, [x0]
+; CHECK-no-lsfe:    stlxr w9, w8, [x0]
+    %r = atomicrmw fadd ptr %ptr, float %value release, align 4
+    ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_aligned_acq_rel(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fadd_float_aligned_acq_rel:
+; -O0:    ldaxr w0, [x9]
+; -O0:    cmp w0, w10
+; -O0:    stlxr w8, w11, [x9]
+; -O0:    subs w8, w0, w8
+;
+; -O1-LABEL: atomicrmw_fadd_float_aligned_acq_rel:
+; -O1:    ldaxr w8, [x0]
+; -O1:    stlxr w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_aligned_acq_rel:
+; CHECK-no-lsfe:    ldaxr w8, [x0]
+; CHECK-no-lsfe:    stlxr w9, w8, [x0]
+    %r = atomicrmw fadd ptr %ptr, float %value acq_rel, align 4
+    ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_aligned_seq_cst(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fadd_float_aligned_seq_cst:
+; -O0:    ldaxr w0, [x9]
+; -O0:    cmp w0, w10
+; -O0:    stlxr w8, w11, [x9]
+; -O0:    subs w8, w0, w8
+;
+; -O1-LABEL: atomicrmw_fadd_float_aligned_seq_cst:
+; -O1:    ldaxr w8, [x0]
+; -O1:    stlxr w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_aligned_seq_cst:
+; CHECK-no-lsfe:    ldaxr w8, [x0]
+; CHECK-no-lsfe:    stlxr w9, w8, [x0]
+    %r = atomicrmw fadd ptr %ptr, float %value seq_cst, align 4
+    ret float %r
+}
+
+define dso_local double @atomicrmw_fadd_double_aligned_monotonic(ptr %ptr, double %value) {
+; -O0-LABEL: atomicrmw_fadd_double_aligned_monotonic:
+; -O0:    ldaxr x0, [x9]
+; -O0:    cmp x0, x10
+; -O0:    stlxr w8, x11, [x9]
+; -O0:    subs x8, x0, x8
+;
+; -O1-LABEL: atomicrmw_fadd_double_aligned_monotonic:
+; -O1:    ldxr x8, [x0]
+; -O1:    stxr w9, x8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_aligned_monotonic:
+; CHECK-no-lsfe:    ldxr x8, [x0]
+; CHECK-no-lsfe:    stxr w9, x8, [x0]
+    %r = atomicrmw fadd ptr %ptr, double %value monotonic, align 8
+    ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_aligned_acquire(ptr %ptr, double %value) {
+; -O0-LABEL: atomicrmw_fadd_double_aligned_acquire:
+; -O0:    ldaxr x0, [x9]
+; -O0:    cmp x0, x10
+; -O0:    stlxr w8, x11, [x9]
+; -O0:    subs x8, x0, x8
+;
+; -O1-LABEL: atomicrmw_fadd_double_aligned_acquire:
+; -O1:    ldaxr x8, [x0]
+; -O1:    stxr w9, x8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_aligned_acquire:
+; CHECK-no-lsfe:    ldaxr x8, [x0]
+; CHECK-no-lsfe:    stxr w9, x8, [x0]
+    %r = atomicrmw fadd ptr %ptr, double %value acquire, align 8
+    ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_aligned_release(ptr %ptr, double %value) {
+; -O0-LABEL: atomicrmw_fadd_double_aligned_release:
+; -O0:    ldaxr x0, [x9]
+; -O0:    cmp x0, x10
+; -O0:    stlxr w8, x11, [x9]
+; -O0:    subs x8, x0, x8
+;
+; -O1-LABEL: atomicrmw_fadd_double_aligned_release:
+; -O1:    ldxr x8, [x0]
+; -O1:    stlxr w9, x8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_aligned_release:
+; CHECK-no-lsfe:    ldxr x8, [x0]
+; CHECK-no-lsfe:    stlxr w9, x8, [x0]
+    %r = atomicrmw fadd ptr %ptr, double %value release, align 8
+    ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_aligned_acq_rel(ptr %ptr, double %value) {
+; -O0-LABEL: atomicrmw_fadd_double_aligned_acq_rel:
+; -O0:    ldaxr x0, [x9]
+; -O0:    cmp x0, x10
+; -O0:    stlxr w8, x11, [x9]
+; -O0:    subs x8, x0, x8
+;
+; -O1-LABEL: atomicrmw_fadd_double_aligned_acq_rel:
+; -O1:    ldaxr x8, [x0]
+; -O1:    stlxr w9, x8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_aligned_acq_rel:
+; CHECK-no-lsfe:    ldaxr x8, [x0]
+; CHECK-no-lsfe:    stlxr w9, x8, [x0]
+    %r = atomicrmw fadd ptr %ptr, double %value acq_rel, align 8
+    ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_aligned_seq_cst(ptr %ptr, double %value) {
+; -O0-LABEL: atomicrmw_fadd_double_aligned_seq_cst:
+; -O0:    ldaxr x0, [x9]
+; -O0:    cmp x0, x10
+; -O0:    stlxr w8, x11, [x9]
+; -O0:    subs x8, x0, x8
+;
+; -O1-LABEL: atomicrmw_fadd_double_aligned_seq_cst:
+; -O1:    ldaxr x8, [x0]
+; -O1:    stlxr w9, x8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_aligned_seq_cst:
+; CHECK-no-lsfe:    ldaxr x8, [x0]
+; CHECK-no-lsfe:    stlxr w9, x8, [x0]
+    %r = atomicrmw fadd ptr %ptr, double %value seq_cst, align 8
+    ret double %r
+}
+
+define dso_local half @atomicrmw_fadd_half_unaligned_monotonic(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_unaligned_monotonic:
+; CHECK:    bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_unaligned_monotonic:
+; CHECK-no-lsfe:    bl __atomic_compare_exchange
+    %r = atomicrmw fadd ptr %ptr, half %value monotonic, align 1
+    ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_unaligned_acquire(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_unaligned_acquire:
+; CHECK:    bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_unaligned_acquire:
+; CHECK-no-lsfe:    bl __atomic_compare_exchange
+    %r = atomicrmw fadd ptr %ptr, half %value acquire, align 1
+    ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_unaligned_release(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_unaligned_release:
+; CHECK:    bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_unaligned_release:
+; CHECK-no-lsfe:    bl __atomic_compare_exchange
+    %r = atomicrmw fadd ptr %ptr, half %value release, align 1
+    ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_unaligned_acq_rel(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_unaligned_acq_rel:
+; CHECK:    bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_unaligned_acq_rel:
+; CHECK-no-lsfe:    bl __atomic_compare_exchange
+    %r = atomicrmw fadd ptr %ptr, half %value acq_rel, align 1
+    ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_unaligned_seq_cst(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_unaligned_seq_cst:
+; CHECK:    bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_unaligned_seq_cst:
+; CHECK-no-lsfe:    bl __atomic_compare_exchange
+    %r = atomicrmw fadd ptr %ptr, half %value seq_cst, align 1
+    ret half %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_monotonic(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_unaligned_monotonic:
+; -O0:    add w8, w8, w9
+; -O0:    add w8, w8, w9
+; -O0:    bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_unaligned_monotonic:
+; -O1:    add w8, w8, w20
+; -O1:    add w8, w9, w8
+; -O1:    bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_unaligned_monotonic:
+; CHECK-no-lsfe:    add w8, w8, w20
+; CHECK-no-lsfe:    add w8, w9, w8
+; CHECK-no-lsfe:    bl __atomic_compare_exchange
+    %r = atomicrmw fadd ptr %ptr, bfloat %value monotonic, align 1
+    ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_acquire(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_unaligned_acquire:
+; -O0:    add w8, w8, w9
+; -O0:    add w8, w8, w9
+; -O0:    bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_unaligned_acquire:
+; -O1:    add w8, w8, w20
+; -O1:    add w8, w9, w8
+; -O1:    bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_unaligned_acquire:
+; CHECK-no-lsfe:    add w8, w8, w20
+; CHECK-no-lsfe:    add w8, w9, w8
+; CHECK-no-lsfe:    bl __atomic_compare_exchange
+    %r = atomicrmw fadd ptr %ptr, bfloat %value acquire, align 1
+    ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_release(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_unaligned_release:
+; -O0:    add w8, w8, w9
+; -O0:    add w8, w8, w9
+; -O0:    bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_unaligned_release:
+; -O1:    add w8, w8, w20
+; -O1:    add w8, w9, w8
+; -O1:    bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_unaligned_release:
+; CHECK-no-lsfe:    add w8, w8, w20
+; CHECK-no-lsfe:    add w8, w9, w8
+; CHECK-no-lsfe:    bl __atomic_compare_exchange
+    %r = atomicrmw fadd ptr %ptr, bfloat %value release, align 1
+    ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_acq_rel(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_unaligned_acq_rel:
+; -O0:    add w8, w8, w9
+; -O0:    add w8, w8, w9
+; -O0:    bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_unaligned_acq_rel:
+; -O1:    add w8, w8, w20
+; -O1:    add w8, w9, w8
+; -O1:    bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_unaligned_acq_rel:
+; CHECK-no-lsfe:    add w8, w8, w20
+; CHECK-no-lsfe:    add w8, w9, w8
+; CHECK-no-lsfe:    bl __atomic_compare_exchange
+    %r = atomicrmw fadd ptr %ptr, bfloat %value acq_rel, align 1
+    ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_seq_cst(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_unaligned_seq_cst:
+; -O0:    add w8, w8, w9
+; -O0:    add w8, w8, w9
+; -O0:    bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_unaligned_seq_cst:
+; -O1:    add w8, w8, w20
+; -O1:    add w8, w9, w8
+; -O1:    bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_unaligned_seq_cst:
+; CHECK-no-lsfe:    add w8, w8, w20
+; CHECK-no-lsfe:    add w8, w9, w8
+; CHECK-no-lsfe:    bl __atomic_compare_exchange
+    %r = atomicrmw fadd ptr %ptr, bfloat %value seq_cst, align 1
+    ret bfloat %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_monotonic:
+; CHECK:    bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_unaligned_monotonic:
+; CHECK-no-lsfe:    bl __atomic_compare_exchange
+    %r = atomicrmw fadd ptr %ptr, float %value monotonic, align 1
+    ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_acquire:
+; CHECK:    bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_unaligned_acquire:
+; CHECK-no-lsfe:    bl __atomic_compare_exchange
+    %r = atomicrmw fadd ptr %ptr, float %value acquire, align 1
+    ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_release:
+; CHECK:    bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_unaligned_release:
+; CHECK-no-lsfe:    bl __atomic_compare_exchange
+    %r = atomicrmw fadd ptr %ptr, float %value release, align 1
+    ret float %r
+}
+
+define dso_local float @atomicrmw_...
[truncated]

Copy link

github-actions bot commented Feb 11, 2025

✅ With the latest revision this PR passed the Python code formatter.

Update the `generate-tests.py` script to create new tests for
`atomicrmw {fadd,fmin,fmax}` and test these with `half`, `float`,
`bfloat` and `double`.

Generate auto-tests to check both with and without `+lsfe`, so
that when llvm#125868 is merged, `+lsfe` will use a single atomic
floating-point instruction.
@jthackray jthackray merged commit 036f543 into llvm:main Feb 12, 2025
8 checks passed
@jthackray jthackray deleted the pre-commit-tests branch February 12, 2025 13:14
flovent pushed a commit to flovent/llvm-project that referenced this pull request Feb 13, 2025
Update the `generate-tests.py` script to create new tests for `atomicrmw
{fadd,fmin,fmax}` and test these with `half`, `float`, `bfloat` and
`double`.

Generate fp auto-tests to check both with and without `+lsfe`, so that when
llvm#125686 is merged, `+lsfe` will use a single atomic floating-point
instruction.
joaosaffran pushed a commit to joaosaffran/llvm-project that referenced this pull request Feb 14, 2025
Update the `generate-tests.py` script to create new tests for `atomicrmw
{fadd,fmin,fmax}` and test these with `half`, `float`, `bfloat` and
`double`.

Generate fp auto-tests to check both with and without `+lsfe`, so that when
llvm#125686 is merged, `+lsfe` will use a single atomic floating-point
instruction.
sivan-shani pushed a commit to sivan-shani/llvm-project that referenced this pull request Feb 24, 2025
Update the `generate-tests.py` script to create new tests for `atomicrmw
{fadd,fmin,fmax}` and test these with `half`, `float`, `bfloat` and
`double`.

Generate fp auto-tests to check both with and without `+lsfe`, so that when
llvm#125686 is merged, `+lsfe` will use a single atomic floating-point
instruction.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants