[Mlir-commits] [mlir] 183168a - [OpenMP][OMPIRBuilder] Convert cmpxchg memory order to C ABI constants (#193536)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Thu Apr 23 08:12:58 PDT 2026
Author: Chi-Chun, Chen
Date: 2026-04-23T10:12:52-05:00
New Revision: 183168aa5035a4ab59baa61e245f0bc178d2dfb3
URL: https://github.com/llvm/llvm-project/commit/183168aa5035a4ab59baa61e245f0bc178d2dfb3
DIFF: https://github.com/llvm/llvm-project/commit/183168aa5035a4ab59baa61e245f0bc178d2dfb3.diff
LOG: [OpenMP][OMPIRBuilder] Convert cmpxchg memory order to C ABI constants (#193536)
`EmitAtomicCompareExchangeLibcall` passed LLVM AtomicOrdering enum
values directly as the success/failure ordering arguments to
`__atomic_compare_exchange`. However, the C ABI expects the `__ATOMIC_*`
constants instead.
`EmitAtomicLoadLibcall` and `EmitAtomicStoreLibcall` already use
`toCABI()` for this conversion. Apply the same conversion in
`EmitAtomicCompareExchangeLibcall`.
This PR is a reland of #191857 which was closed incorrectly due to
parent branch deleted.
Added:
Modified:
llvm/lib/Frontend/Atomic/Atomic.cpp
mlir/test/Target/LLVMIR/openmp-llvm.mlir
Removed:
################################################################################
diff --git a/llvm/lib/Frontend/Atomic/Atomic.cpp b/llvm/lib/Frontend/Atomic/Atomic.cpp
index 2e2d4a22b24f5..3c853f8f73390 100644
--- a/llvm/lib/Frontend/Atomic/Atomic.cpp
+++ b/llvm/lib/Frontend/Atomic/Atomic.cpp
@@ -75,10 +75,12 @@ std::pair<Value *, Value *> AtomicInfo::EmitAtomicCompareExchangeLibcall(
ExpectedVal,
DesiredVal,
Constant::getIntegerValue(IntegerType::get(ctx, IntBits),
- APInt(IntBits, static_cast<uint64_t>(Success),
+ APInt(IntBits,
+ static_cast<uint64_t>(toCABI(Success)),
/*signed=*/true)),
Constant::getIntegerValue(IntegerType::get(ctx, IntBits),
- APInt(IntBits, static_cast<uint64_t>(Failure),
+ APInt(IntBits,
+ static_cast<uint64_t>(toCABI(Failure)),
/*signed=*/true)),
};
auto Result = EmitAtomicLibcall("__atomic_compare_exchange",
diff --git a/mlir/test/Target/LLVMIR/openmp-llvm.mlir b/mlir/test/Target/LLVMIR/openmp-llvm.mlir
index 66909072a420c..64e0b188a0639 100644
--- a/mlir/test/Target/LLVMIR/openmp-llvm.mlir
+++ b/mlir/test/Target/LLVMIR/openmp-llvm.mlir
@@ -1673,7 +1673,7 @@ llvm.func @omp_atomic_write() {
//CHECK: %[[VAL_9:.*]] = insertvalue { float, float } undef, float %[[VAL_7]], 0
//CHECK: %[[VAL_10:.*]] = insertvalue { float, float } %[[VAL_9]], float %[[VAL_8]], 1
//CHECK: store { float, float } %[[VAL_10]], ptr %[[X_NEW_VAL]], align 4
-//CHECK: %[[VAL_11:.*]] = call i1 @__atomic_compare_exchange(i64 8, ptr %[[ORIG_VAL]], ptr %[[ATOMIC_TEMP_LOAD]], ptr %[[X_NEW_VAL]], i32 2, i32 2)
+//CHECK: %[[VAL_11:.*]] = call i1 @__atomic_compare_exchange(i64 8, ptr %[[ORIG_VAL]], ptr %[[ATOMIC_TEMP_LOAD]], ptr %[[X_NEW_VAL]], i32 0, i32 0)
//CHECK: %[[VAL_12:.*]] = load { float, float }, ptr %[[ATOMIC_TEMP_LOAD]], align 4
//CHECK: br i1 %[[VAL_11]], label %.atomic.exit, label %.atomic.cont
@@ -1725,7 +1725,7 @@ llvm.func @_QPomp_atomic_update_complex() {
//CHECK: %[[VAL_9:.*]] = insertvalue { float, float } undef, float %[[VAL_7]], 0
//CHECK: %[[VAL_10:.*]] = insertvalue { float, float } %[[VAL_9]], float %[[VAL_8]], 1
//CHECK: store { float, float } %[[VAL_10]], ptr %[[X_NEW_VAL]], align 4
-//CHECK: %[[VAL_11:.*]] = call i1 @__atomic_compare_exchange(i64 8, ptr %[[ORIG_VAL]], ptr %[[ATOMIC_TEMP_LOAD]], ptr %[[X_NEW_VAL]], i32 2, i32 2)
+//CHECK: %[[VAL_11:.*]] = call i1 @__atomic_compare_exchange(i64 8, ptr %[[ORIG_VAL]], ptr %[[ATOMIC_TEMP_LOAD]], ptr %[[X_NEW_VAL]], i32 0, i32 0)
//CHECK: %[[VAL_12:.*]] = load { float, float }, ptr %[[ATOMIC_TEMP_LOAD]], align 4
//CHECK: br i1 %[[VAL_11]], label %.atomic.exit, label %.atomic.cont
//CHECK: .atomic.exit
@@ -1816,7 +1816,7 @@ llvm.func @omp_atomic_capture_complex_swap(%x_arg: !llvm.ptr, %v_arg: !llvm.ptr)
// CHECK: call void @__atomic_load(i64 8, ptr %{{.*}}, ptr %[[ATOMIC_TEMP_LOAD]], i32 0)
// CHECK: %[[PHI:.*]] = phi { float, float }
// CHECK: store { float, float } { float 1.000000e+00, float 1.000000e+00 }, ptr %[[X_NEW_VAL]], align 4
- // CHECK: call i1 @__atomic_compare_exchange(i64 8, ptr %{{.*}}, ptr %[[ATOMIC_TEMP_LOAD]], ptr %[[X_NEW_VAL]], i32 2, i32 2)
+ // CHECK: call i1 @__atomic_compare_exchange(i64 8, ptr %{{.*}}, ptr %[[ATOMIC_TEMP_LOAD]], ptr %[[X_NEW_VAL]], i32 0, i32 0)
// CHECK: store { float, float } %[[PHI]], ptr %{{.*}}, align 4
%0 = llvm.mlir.constant(1.000000e+00 : f32) : f32
%1 = llvm.mlir.undef : !llvm.struct<(f32, f32)>
@@ -1838,7 +1838,7 @@ llvm.func @omp_atomic_capture_complex8_swap(%x_arg: !llvm.ptr, %v_arg: !llvm.ptr
// CHECK: call void @__atomic_load(i64 16, ptr %{{.*}}, ptr %[[ATOMIC_TEMP_LOAD]], i32 0)
// CHECK: %[[PHI:.*]] = phi { double, double }
// CHECK: store { double, double } { double 1.000000e+00, double 1.000000e+00 }, ptr %[[X_NEW_VAL]], align 8
- // CHECK: call i1 @__atomic_compare_exchange(i64 16, ptr %{{.*}}, ptr %[[ATOMIC_TEMP_LOAD]], ptr %[[X_NEW_VAL]], i32 2, i32 2)
+ // CHECK: call i1 @__atomic_compare_exchange(i64 16, ptr %{{.*}}, ptr %[[ATOMIC_TEMP_LOAD]], ptr %[[X_NEW_VAL]], i32 0, i32 0)
// CHECK: store { double, double } %[[PHI]], ptr %{{.*}}, align 8
%0 = llvm.mlir.constant(1.000000e+00 : f64) : f64
%1 = llvm.mlir.undef : !llvm.struct<(f64, f64)>
@@ -1853,6 +1853,26 @@ llvm.func @omp_atomic_capture_complex8_swap(%x_arg: !llvm.ptr, %v_arg: !llvm.ptr
// -----
+// Test that seq_cst ordering is correctly converted to CABI constant (5)
+// in __atomic_compare_exchange, not the raw LLVM enum value (7).
+//
+// CHECK-LABEL: define void @omp_atomic_capture_complex_swap_seq_cst
+// CHECK: call void @__atomic_load(i64 8, ptr %{{.*}}, ptr %{{.*}}, i32 5)
+// CHECK: call i1 @__atomic_compare_exchange(i64 8, ptr %{{.*}}, ptr %{{.*}}, ptr %{{.*}}, i32 5, i32 5)
+llvm.func @omp_atomic_capture_complex_swap_seq_cst(%x_arg: !llvm.ptr, %v_arg: !llvm.ptr) {
+ %0 = llvm.mlir.constant(1.000000e+00 : f32) : f32
+ %1 = llvm.mlir.undef : !llvm.struct<(f32, f32)>
+ %2 = llvm.insertvalue %0, %1[0] : !llvm.struct<(f32, f32)>
+ %3 = llvm.insertvalue %0, %2[1] : !llvm.struct<(f32, f32)>
+ omp.atomic.capture memory_order(seq_cst) {
+ omp.atomic.read %v_arg = %x_arg : !llvm.ptr, !llvm.ptr, !llvm.struct<(f32, f32)>
+ omp.atomic.write %x_arg = %3 : !llvm.ptr, !llvm.struct<(f32, f32)>
+ }
+ llvm.return
+}
+
+// -----
+
// CHECK-LABEL: define void @omp_atomic_read_complex() {
llvm.func @omp_atomic_read_complex(){
More information about the Mlir-commits
mailing list