[clang] [compiler-rt] [llvm] [clang] builtins for atomicrmw fminmax/_num (PR #187139)

via llvm-commits llvm-commits at lists.llvm.org
Fri May 1 11:44:38 PDT 2026


================
@@ -115,3 +115,62 @@ void test_minmax_postop(float *f32, _Float16 *f16, __bf16 *bf16, double *f64) {
   *f16  = __atomic_min_fetch(f16,  42.1, memory_order_release);
   *bf16 = __atomic_min_fetch(bf16, 42.1, memory_order_release);
 }
+
+// CHECK-LABEL: define dso_local void @test_fminimum_fmaximum_postop(
+// CHECK-SAME: ptr noundef [[F32:%.*]], ptr noundef [[F16:%.*]], ptr noundef [[BF16:%.*]], ptr noundef [[F64:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-NEXT:  [[ENTRY:.*:]]
+// CHECK:    [[TMP0:%.*]] = load ptr, ptr [[F64_ADDR]], align 8
+// CHECK:    store double 4.210000e+01, ptr [[DOTATOMICTMP]], align 8
+// CHECK:    [[TMP1:%.*]] = load double, ptr [[DOTATOMICTMP]], align 8
+// CHECK:    [[TMP2:%.*]] = atomicrmw fmaximum ptr [[TMP0]], double [[TMP1]] release, align 8
+// CHECK:    [[NEWVAL:%.*]] = call double @llvm.maximum.f64(double [[TMP2]], double [[TMP1]])
+// CHECK:    store double [[NEWVAL]], ptr [[ATOMIC_TEMP]], align 8
+// CHECK:    [[TMP3:%.*]] = load double, ptr [[ATOMIC_TEMP]], align 8
+// CHECK:    [[TMP4:%.*]] = load ptr, ptr [[F64_ADDR]], align 8
+// CHECK:    store double [[TMP3]], ptr [[TMP4]], align 8
+void test_fminimum_fmaximum_postop(float *f32, _Float16 *f16, __bf16 *bf16, double *f64) {
+  *f64  = __atomic_fmaximum_fetch(f64,  42.1, memory_order_release);
+  *f32  = __atomic_fmaximum_fetch(f32,  42.1, memory_order_release);
+  *f16  = __atomic_fmaximum_fetch(f16,  42.1, memory_order_release);
+  *bf16 = __atomic_fmaximum_fetch(bf16, 42.1, memory_order_release);
+  *f64  = __atomic_fminimum_fetch(f64,  42.1, memory_order_release);
+  *f32  = __atomic_fminimum_fetch(f32,  42.1, memory_order_release);
+  *f16  = __atomic_fminimum_fetch(f16,  42.1, memory_order_release);
+  *bf16 = __atomic_fminimum_fetch(bf16, 42.1, memory_order_release);
+}
+
+// CHECK-LABEL: define dso_local void @test_fminimumnum_fmaximumnum_postop(
+// CHECK-SAME: ptr noundef [[F32:%.*]], ptr noundef [[F16:%.*]], ptr noundef [[BF16:%.*]], ptr noundef [[F64:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-NEXT:  [[ENTRY:.*:]]
+// CHECK:    [[TMP0:%.*]] = load ptr, ptr [[F64_ADDR]], align 8
+// CHECK:    store double 4.210000e+01, ptr [[DOTATOMICTMP]], align 8
+// CHECK:    [[TMP1:%.*]] = load double, ptr [[DOTATOMICTMP]], align 8
+// CHECK:    [[TMP2:%.*]] = atomicrmw fmaximumnum ptr [[TMP0]], double [[TMP1]] release, align 8
+// CHECK:    [[NEWVAL:%.*]] = call double @llvm.maximumnum.f64(double [[TMP2]], double [[TMP1]])
+// CHECK:    store double [[NEWVAL]], ptr [[ATOMIC_TEMP]], align 8
+// CHECK:    [[TMP3:%.*]] = load double, ptr [[ATOMIC_TEMP]], align 8
+// CHECK:    [[TMP4:%.*]] = load ptr, ptr [[F64_ADDR]], align 8
+// CHECK:    store double [[TMP3]], ptr [[TMP4]], align 8
+void test_fminimumnum_fmaximumnum_postop(float *f32, _Float16 *f16, __bf16 *bf16, double *f64) {
+  *f64  = __atomic_fmaximum_num_fetch(f64,  42.1, memory_order_release);
+  *f32  = __atomic_fmaximum_num_fetch(f32,  42.1, memory_order_release);
+  *f16  = __atomic_fmaximum_num_fetch(f16,  42.1, memory_order_release);
+  *bf16 = __atomic_fmaximum_num_fetch(bf16, 42.1, memory_order_release);
+  *f64  = __atomic_fminimum_num_fetch(f64,  42.1, memory_order_release);
+  *f32  = __atomic_fminimum_num_fetch(f32,  42.1, memory_order_release);
+  *f16  = __atomic_fminimum_num_fetch(f16,  42.1, memory_order_release);
+  *bf16 = __atomic_fminimum_num_fetch(bf16, 42.1, memory_order_release);
+}
+
+// CHECK-LABEL: define dso_local void @test_fetch_variants(
+// CHECK-SAME: ptr noundef [[F64:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK:    [[TMP0:%.*]] = atomicrmw fminimum ptr {{%.*}}, double {{%.*}} release, align 8
+// CHECK:    [[TMP1:%.*]] = atomicrmw fmaximum ptr {{%.*}}, double {{%.*}} release, align 8
----------------
gonzalobg wrote:

I've added a few tests for these calls. Let me know if you meant something different.

https://github.com/llvm/llvm-project/pull/187139


More information about the llvm-commits mailing list