llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Andy Kaylor (andykaylor)

<details>
<summary>Changes</summary>

This synchronizes the CIR atomic expression handling with changes that were 
made in https://github.com/llvm/llvm-project/pull/183853

---
Full diff: https://github.com/llvm/llvm-project/pull/184416.diff


2 Files Affected:

- (modified) clang/lib/CIR/CodeGen/CIRGenAtomic.cpp (+3-3) 
- (modified) clang/test/CIR/CodeGen/atomic-thread-fence.c (+14-20) 


``````````diff
diff --git a/clang/lib/CIR/CodeGen/CIRGenAtomic.cpp 
b/clang/lib/CIR/CodeGen/CIRGenAtomic.cpp
index c2d1a031a7e53..1b55c317e0e81 100644
--- a/clang/lib/CIR/CodeGen/CIRGenAtomic.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenAtomic.cpp
@@ -895,8 +895,6 @@ RValue CIRGenFunction::emitAtomicExpr(AtomicExpr *e) {
       e->getScopeModel() && e->getScope()->EvaluateAsInt(eval, getContext()))
     scopeConst.emplace(std::move(eval));
 
-  bool shouldCastToIntPtrTy = true;
-
   switch (e->getOp()) {
   default:
     cgm.errorNYI(e->getSourceRange(), "atomic op NYI");
@@ -974,7 +972,6 @@ RValue CIRGenFunction::emitAtomicExpr(AtomicExpr *e) {
   case AtomicExpr::AO__scoped_atomic_max_fetch:
   case AtomicExpr::AO__scoped_atomic_min_fetch:
   case AtomicExpr::AO__scoped_atomic_sub_fetch:
-    shouldCastToIntPtrTy = !memTy->isFloatingType();
     [[fallthrough]];
 
   case AtomicExpr::AO__atomic_fetch_and:
@@ -1009,6 +1006,9 @@ RValue CIRGenFunction::emitAtomicExpr(AtomicExpr *e) {
 
   QualType resultTy = e->getType().getUnqualifiedType();
 
+  bool shouldCastToIntPtrTy =
+      shouldCastToInt(convertTypeForMem(memTy), e->isCmpXChg());
+
   // The inlined atomics only function on iN types, where N is a power of 2. We
   // need to make sure (via temporaries if necessary) that all incoming values
   // are compatible.
diff --git a/clang/test/CIR/CodeGen/atomic-thread-fence.c 
b/clang/test/CIR/CodeGen/atomic-thread-fence.c
index 7aac256af562a..eced95b1e6e59 100644
--- a/clang/test/CIR/CodeGen/atomic-thread-fence.c
+++ b/clang/test/CIR/CodeGen/atomic-thread-fence.c
@@ -109,12 +109,9 @@ void loadWithThreadFence(DataPtr d) {
   // CIR:    cir.atomic.fence syncscope(system) seq_cst
   // CIR:    %[[LOAD_DATA:.*]] = cir.load{{.*}} %[[DATA]] : 
!cir.ptr<!cir.ptr<!rec_Data>>, !cir.ptr<!rec_Data>
   // CIR:    %[[DATA_VALUE:.*]] = cir.get_member %[[LOAD_DATA]][1] {name = 
"ptr"} : !cir.ptr<!rec_Data> -> !cir.ptr<!cir.ptr<!void>>
-  // CIR:    %[[CASTED_DATA_VALUE:.*]] = cir.cast bitcast %[[DATA_VALUE]] : 
!cir.ptr<!cir.ptr<!void>> -> !cir.ptr<!u64i>
-  // CIR:    %[[CASTED_ATOMIC_TEMP:.*]] = cir.cast bitcast %[[ATOMIC_TEMP]] : 
!cir.ptr<!cir.ptr<!void>> -> !cir.ptr<!u64i>
-  // CIR:    %[[ATOMIC_LOAD:.*]] = cir.load{{.*}} atomic(seq_cst) 
%[[CASTED_DATA_VALUE]] : !cir.ptr<!u64i>, !u64i
-  // CIR:    cir.store{{.*}} %[[ATOMIC_LOAD]], %[[CASTED_ATOMIC_TEMP]] : 
!u64i, !cir.ptr<!u64i>
-  // CIR:    %[[DOUBLE_CASTED_ATOMIC_TEMP:.*]] = cir.cast bitcast 
%[[CASTED_ATOMIC_TEMP]] : !cir.ptr<!u64i> -> !cir.ptr<!cir.ptr<!void>>
-  // CIR:    %[[ATOMIC_LOAD_PTR:.*]] = cir.load{{.*}} 
%[[DOUBLE_CASTED_ATOMIC_TEMP]] : !cir.ptr<!cir.ptr<!void>>, !cir.ptr<!void>
+  // CIR:    %[[ATOMIC_LOAD:.*]] = cir.load{{.*}} atomic(seq_cst) 
%[[DATA_VALUE]] : !cir.ptr<!cir.ptr<!void>>, !cir.ptr<!void>
+  // CIR:    cir.store{{.*}} %[[ATOMIC_LOAD]], %[[ATOMIC_TEMP]] : 
!cir.ptr<!void>, !cir.ptr<!cir.ptr<!void>>
+  // CIR:    %[[ATOMIC_LOAD_PTR:.*]] = cir.load{{.*}} %[[ATOMIC_TEMP]] : 
!cir.ptr<!cir.ptr<!void>>, !cir.ptr<!void>
   // CIR:    cir.return
 
   // LLVM-LABEL: @loadWithThreadFence
@@ -123,8 +120,8 @@ void loadWithThreadFence(DataPtr d) {
   // LLVM:    fence seq_cst
   // LLVM:    %[[DATA_PTR:.*]] = load ptr, ptr %[[DATA]], align 8
   // LLVM:    %[[DATA_VALUE:.*]] = getelementptr %struct.Data, ptr 
%[[DATA_PTR]], i32 0, i32 1
-  // LLVM:    %[[ATOMIC_LOAD:.*]] = load atomic i64, ptr %[[DATA_VALUE]] 
seq_cst, align 8
-  // LLVM:    store i64 %[[ATOMIC_LOAD]], ptr %[[DATA_TEMP]], align 8
+  // LLVM:    %[[ATOMIC_LOAD:.*]] = load atomic ptr, ptr %[[DATA_VALUE]] 
seq_cst, align 8
+  // LLVM:    store ptr %[[ATOMIC_LOAD]], ptr %[[DATA_TEMP]], align 8
   // LLVM:    %[[DATA_TEMP_LOAD:.*]] = load ptr, ptr %[[DATA_TEMP]], align 8
   // LLVM:    ret void
 
@@ -134,8 +131,8 @@ void loadWithThreadFence(DataPtr d) {
   // OGCG:    fence seq_cst
   // OGCG:    %[[DATA_PTR:.*]] = load ptr, ptr %[[DATA]], align 8
   // OGCG:    %[[DATA_VALUE:.*]] = getelementptr inbounds nuw %struct.Data, 
ptr %[[DATA_PTR]], i32 0, i32 1
-  // OGCG:    %[[ATOMIC_LOAD:.*]] = load atomic i64, ptr %[[DATA_VALUE]] 
seq_cst, align 8
-  // OGCG:    store i64 %[[ATOMIC_LOAD]], ptr %[[DATA_TEMP]], align 8
+  // OGCG:    %[[ATOMIC_LOAD:.*]] = load atomic ptr, ptr %[[DATA_VALUE]] 
seq_cst, align 8
+  // OGCG:    store ptr %[[ATOMIC_LOAD]], ptr %[[DATA_TEMP]], align 8
   // OGCG:    %[[DATA_TEMP_LOAD:.*]] = load ptr, ptr %[[DATA_TEMP]], align 8
   // OGCG:    ret void
 }
@@ -149,12 +146,9 @@ void loadWithSignalFence(DataPtr d) {
   // CIR:    cir.atomic.fence syncscope(single_thread) seq_cst
   // CIR:    %[[LOAD_DATA:.*]] = cir.load{{.*}} %[[DATA]] : 
!cir.ptr<!cir.ptr<!rec_Data>>, !cir.ptr<!rec_Data>
   // CIR:    %[[DATA_PTR:.*]] = cir.get_member %[[LOAD_DATA]][1] {name = 
"ptr"} : !cir.ptr<!rec_Data> -> !cir.ptr<!cir.ptr<!void>>
-  // CIR:    %[[CASTED_DATA_PTR:.*]] = cir.cast bitcast %[[DATA_PTR]] : 
!cir.ptr<!cir.ptr<!void>> -> !cir.ptr<!u64i>
-  // CIR:    %[[CASTED_ATOMIC_TEMP:.*]] = cir.cast bitcast %[[ATOMIC_TEMP]] : 
!cir.ptr<!cir.ptr<!void>> -> !cir.ptr<!u64i>
-  // CIR:    %[[ATOMIC_LOAD:.*]] = cir.load{{.*}} atomic(seq_cst) 
%[[CASTED_DATA_PTR]] : !cir.ptr<!u64i>, !u64i
-  // CIR:    cir.store{{.*}} %[[ATOMIC_LOAD]], %[[CASTED_ATOMIC_TEMP]] : 
!u64i, !cir.ptr<!u64i>
-  // CIR:    %[[DOUBLE_CASTED_ATOMIC_TEMP:.*]] = cir.cast bitcast 
%[[CASTED_ATOMIC_TEMP]] : !cir.ptr<!u64i> -> !cir.ptr<!cir.ptr<!void>>
-  // CIR:    %[[LOAD_ATOMIC_TEMP:.*]] = cir.load{{.*}} 
%[[DOUBLE_CASTED_ATOMIC_TEMP]] : !cir.ptr<!cir.ptr<!void>>, !cir.ptr<!void>
+  // CIR:    %[[ATOMIC_LOAD:.*]] = cir.load{{.*}} atomic(seq_cst) 
%[[DATA_PTR]] : !cir.ptr<!cir.ptr<!void>>, !cir.ptr<!void>
+  // CIR:    cir.store{{.*}} %[[ATOMIC_LOAD]], %[[ATOMIC_TEMP]] : 
!cir.ptr<!void>, !cir.ptr<!cir.ptr<!void>>
+  // CIR:    %[[LOAD_ATOMIC_TEMP:.*]] = cir.load{{.*}} %[[ATOMIC_TEMP]] : 
!cir.ptr<!cir.ptr<!void>>, !cir.ptr<!void>
   // CIR:    cir.return
 
   // LLVM-LABEL: @loadWithSignalFence
@@ -163,8 +157,8 @@ void loadWithSignalFence(DataPtr d) {
   // LLVM:    fence syncscope("singlethread") seq_cst
   // LLVM:    %[[DATA_PTR:.*]] = load ptr, ptr %[[DATA]], align 8
   // LLVM:    %[[DATA_VALUE:.*]] = getelementptr %struct.Data, ptr 
%[[DATA_PTR]], i32 0, i32 1
-  // LLVM:    %[[ATOMIC_LOAD:.*]] = load atomic i64, ptr %[[DATA_VALUE]] 
seq_cst, align 8
-  // LLVM:    store i64 %[[ATOMIC_LOAD]], ptr %[[DATA_TEMP]], align 8
+  // LLVM:    %[[ATOMIC_LOAD:.*]] = load atomic ptr, ptr %[[DATA_VALUE]] 
seq_cst, align 8
+  // LLVM:    store ptr %[[ATOMIC_LOAD]], ptr %[[DATA_TEMP]], align 8
   // LLVM:    %[[DATA_TEMP_LOAD]] = load ptr, ptr %[[DATA_TEMP]], align 8
   // LLVM:    ret void
 
@@ -174,8 +168,8 @@ void loadWithSignalFence(DataPtr d) {
   // OGCG:    fence syncscope("singlethread") seq_cst
   // OGCG:    %[[DATA_PTR:.*]] = load ptr, ptr %[[DATA]], align 8
   // OGCG:    %[[DATA_VALUE:.*]] = getelementptr inbounds nuw %struct.Data, 
ptr %[[DATA_PTR]], i32 0, i32 1
-  // OGCG:    %[[ATOMIC_LOAD:.*]] = load atomic i64, ptr %[[DATA_VALUE]] 
seq_cst, align 8
-  // OGCG:    store i64 %[[ATOMIC_LOAD]], ptr %[[DATA_TEMP]], align 8
+  // OGCG:    %[[ATOMIC_LOAD:.*]] = load atomic ptr, ptr %[[DATA_VALUE]] 
seq_cst, align 8
+  // OGCG:    store ptr %[[ATOMIC_LOAD]], ptr %[[DATA_TEMP]], align 8
   // OGCG:    %[[DATA_TEMP_LOAD]] = load ptr, ptr %[[DATA_TEMP]], align 8
   // OGCG:    ret void
 }

``````````

</details>


https://github.com/llvm/llvm-project/pull/184416
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to