llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clangir Author: Erich Keane (erichkeane) <details> <summary>Changes</summary> We have logic in CIRGenAtomic to handle 'cast float to an int', which works for most of our atomics. However, compare-exchange uses a second 'val' value, which was not getting cast, which caused a verification error. This patch ensures that the correct cast is generated for 'val2' as well. --- Full diff: https://github.com/llvm/llvm-project/pull/198924.diff 2 Files Affected: - (modified) clang/lib/CIR/CodeGen/CIRGenAtomic.cpp (+2) - (modified) clang/test/CIR/CodeGen/atomic.c (+29) ``````````diff diff --git a/clang/lib/CIR/CodeGen/CIRGenAtomic.cpp b/clang/lib/CIR/CodeGen/CIRGenAtomic.cpp index 7a81771de6e92..06616c432d9b1 100644 --- a/clang/lib/CIR/CodeGen/CIRGenAtomic.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenAtomic.cpp @@ -1219,6 +1219,8 @@ RValue CIRGenFunction::emitAtomicExpr(AtomicExpr *e) { ptr = atomics.castToAtomicIntPointer(ptr); if (val1.isValid()) val1 = atomics.convertToAtomicIntPointer(val1); + if (val2.isValid()) + val2 = atomics.convertToAtomicIntPointer(val2); } if (dest.isValid()) { if (shouldCastToIntPtrTy) diff --git a/clang/test/CIR/CodeGen/atomic.c b/clang/test/CIR/CodeGen/atomic.c index a6330173494a6..c3270e0632127 100644 --- a/clang/test/CIR/CodeGen/atomic.c +++ b/clang/test/CIR/CodeGen/atomic.c @@ -600,6 +600,35 @@ void atomic_cmpxchg(int *ptr, int *expected, int *desired, int failure) { // OGCG: cmpxchg weak ptr %{{.+}}, i32 %{{.+}}, i32 %{{.+}} seq_cst seq_cst } +void atomic_cmpxchg_fp_to_int_cast(float *ptr, float *expected, float *desired) { + // CIR-LABEL: @atomic_cmpxchg_fp_to_int_cast + // LLVM-LABEL: @atomic_cmpxchg_fp_to_int_cast + // OGCG-LABEL: @atomic_cmpxchg_fp_to_int_cast + + __atomic_compare_exchange(ptr, expected, desired, 0, __ATOMIC_SEQ_CST, + __ATOMIC_SEQ_CST); + // CIR: %[[PTR_CAST:.*]] = cir.cast bitcast %{{.*}} : !cir.ptr<!cir.float> -> !cir.ptr<!u32i> + // CIR: %[[EXP_CAST:.*]] = cir.cast bitcast %{{.*}} : !cir.ptr<!cir.float> -> !cir.ptr<!u32i> + // CIR: %[[DES_CAST:.*]] = cir.cast bitcast %{{.*}} : !cir.ptr<!cir.float> -> !cir.ptr<!u32i> + // CIR: %[[EXP_DEREF:.*]] = cir.load align(4) %[[EXP_CAST]] : !cir.ptr<!u32i>, !u32i + // CIR: %[[DES_DEREF:.*]] = cir.load align(4) %[[DES_CAST]] : !cir.ptr<!u32i>, !u32i + // CIR: cir.atomic.cmpxchg success(seq_cst) failure(seq_cst) syncscope(system) %[[PTR_CAST]], %[[EXP_DEREF]], %[[DES_DEREF]] align(4) : (!cir.ptr<!u32i>, !u32i, !u32i) -> (!u32i, !cir.bool) + + // LLVM: %[[PTR_LOAD:.*]] = load ptr, ptr %{{.*}} + // LLVM: %[[EXP_LOAD:.*]] = load ptr, ptr %{{.*}} + // LLVM: %[[DES_LOAD:.*]] = load ptr, ptr %{{.*}} + // LLVM: %[[EXP_DEREF:.*]] = load i32, ptr %[[EXP_LOAD]] + // LLVM: %[[DES_DEREF:.*]] = load i32, ptr %[[DES_LOAD]] + // LLVM: cmpxchg ptr %[[PTR_LOAD]], i32 %[[EXP_DEREF]], i32 %[[DES_DEREF]] seq_cst seq_cst, align 4 + + // OGCG: %[[PTR_LOAD:.*]] = load ptr, ptr %{{.*}} + // OGCG: %[[EXP_LOAD:.*]] = load ptr, ptr %{{.*}} + // OGCG: %[[DES_LOAD:.*]] = load ptr, ptr %{{.*}} + // OGCG: %[[EXP_DEREF:.*]] = load i32, ptr %[[EXP_LOAD]] + // OGCG: %[[DES_DEREF:.*]] = load i32, ptr %[[DES_LOAD]] + // OGCG: cmpxchg ptr %[[PTR_LOAD]], i32 %[[EXP_DEREF]], i32 %[[DES_DEREF]] seq_cst seq_cst, align 4 +} + void atomic_cmpxchg_n(int *ptr, int *expected, int desired, int failure) { // CIR-LABEL: @atomic_cmpxchg_n // LLVM-LABEL: @atomic_cmpxchg_n `````````` </details> https://github.com/llvm/llvm-project/pull/198924 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
