[clang] 4af27b0 - [Clang] Fix atomic boolean compound assignment (#178220)

via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 6 01:42:01 PST 2026


Author: Kiran
Date: 2026-02-06T09:41:57Z
New Revision: 4af27b06f517cec52b14e72a30a8a9185b662086

URL: https://github.com/llvm/llvm-project/commit/4af27b06f517cec52b14e72a30a8a9185b662086
DIFF: https://github.com/llvm/llvm-project/commit/4af27b06f517cec52b14e72a30a8a9185b662086.diff

LOG: [Clang] Fix atomic boolean compound assignment (#178220)

Fixes #33210

Added: 
    clang/test/CodeGen/compound-assign-atomic-bool.c

Modified: 
    clang/docs/ReleaseNotes.rst
    clang/lib/CodeGen/CGExprScalar.cpp

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 24d4e07ca68b3..1f925419432bb 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -223,6 +223,9 @@ Improvements to Coverage Mapping
 
 Bug Fixes in This Version
 -------------------------
+
+- Fixed atomic boolean compound assignment; the conversion back to atomic bool would be miscompiled. (#GH33210)
+
 - Fixed a failed assertion in the preprocessor when ``__has_embed`` parameters are missing parentheses. (#GH175088)
 
 - Fix lifetime extension of temporaries in for-range-initializers in templates. (#GH165182)

diff  --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp
index d21e017bd2b56..1f9389660e127 100644
--- a/clang/lib/CodeGen/CGExprScalar.cpp
+++ b/clang/lib/CodeGen/CGExprScalar.cpp
@@ -4035,9 +4035,14 @@ LValue ScalarExprEmitter::EmitCompoundAssignLValue(
   if (LHSLV.isBitField()) {
     Previous = Result;
     Result = EmitScalarConversion(Result, PromotionTypeCR, LHSTy, Loc);
-  } else
+  } else if (const auto *atomicTy = LHSTy->getAs<AtomicType>()) {
+    Result =
+        EmitScalarConversion(Result, PromotionTypeCR, atomicTy->getValueType(),
+                             Loc, ScalarConversionOpts(CGF.SanOpts));
+  } else {
     Result = EmitScalarConversion(Result, PromotionTypeCR, LHSTy, Loc,
                                   ScalarConversionOpts(CGF.SanOpts));
+  }
 
   if (atomicPHI) {
     llvm::BasicBlock *curBlock = Builder.GetInsertBlock();

diff  --git a/clang/test/CodeGen/compound-assign-atomic-bool.c b/clang/test/CodeGen/compound-assign-atomic-bool.c
new file mode 100644
index 0000000000000..4e8f351b49b81
--- /dev/null
+++ b/clang/test/CodeGen/compound-assign-atomic-bool.c
@@ -0,0 +1,29 @@
+// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s
+
+// When performing compound assignment on atomic_bool, ensure that we
+// correctly handle the conversion from integer to boolean, by comparing
+// with zero rather than truncating.
+
+// CHECK: @compund_assign_add
+int compund_assign_add(void) {
+    _Atomic _Bool b;
+
+    b += 2;
+    // CHECK: add
+    // CHECK-NEXT: icmp ne
+    // CHECK-NEXT: zext
+    // CHECK-NEXT: cmpxchg
+    return b;
+}
+
+// CHECK: @compund_assign_minus
+int compund_assign_minus(void) {
+    _Atomic _Bool b;
+
+    b -= 2;
+    // CHECK: sub
+    // CHECK-NEXT: icmp ne
+    // CHECK-NEXT: zext
+    // CHECK-NEXT: cmpxchg
+    return b;
+}


        


More information about the cfe-commits mailing list