[clang] [CIR] Correct 2 lowering bugs of atomic cmp-xchng builtins (PR #227054)

Erich Keane via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 28 10:48:22 PDT 2026


================
@@ -506,30 +506,41 @@ static void emitAtomicCmpXchg(CIRGenFunction &cgf, AtomicExpr *e, bool isWeak,
   cmpxchg.setWeak(isWeak);
 
   mlir::Value failed = builder.createNot(cmpxchg.getSuccess());
-  cir::IfOp::create(builder, loc, failed, /*withElseRegion=*/false,
-                    [&](mlir::OpBuilder &, mlir::Location) {
-                      auto ptrTy = mlir::cast<cir::PointerType>(
-                          val1.getPointer().getType());
-                      if (val1.getElementType() != ptrTy.getPointee()) {
-                        val1 = val1.withPointer(builder.createPtrBitcast(
-                            val1.getPointer(), val1.getElementType()));
-                      }
-                      builder.createStore(loc, cmpxchg.getOld(), val1);
-                      builder.createYield(loc);
-                    });
+  cir::IfOp::create(
+      builder, loc, failed, /*withElseRegion=*/false,
+      [&](mlir::OpBuilder &, mlir::Location) {
+        uint64_t expectedSizeInBytes = cgf.cgm.getDataLayout().getTypeStoreSize(
+            expectedResult.getElementType());
+
+        if (expectedSizeInBytes == size) {
+          Address storeAddr = expectedResult.withElementType(
+              builder, cmpxchg.getOld().getType());
+          builder.createStore(loc, cmpxchg.getOld(), storeAddr);
----------------
erichkeane wrote:

OH! Thats what that was about!  I'll add a couple of missing-features marks.

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


More information about the cfe-commits mailing list