[clang] [Clang] Fix atomic boolean compound assignment (#33210) (PR #178220)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 27 06:59:41 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-codegen
@llvm/pr-subscribers-clang
Author: Kiran (kiran-isaac)
<details>
<summary>Changes</summary>
Fixes #<!-- -->33210
---
Full diff: https://github.com/llvm/llvm-project/pull/178220.diff
2 Files Affected:
- (modified) clang/lib/CodeGen/CGExprScalar.cpp (+7)
- (added) clang/test/CodeGen/compound-assign-atomic-bool.c (+33)
``````````diff
diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp
index 11af497390671..0d92be12959a9 100644
--- a/clang/lib/CodeGen/CGExprScalar.cpp
+++ b/clang/lib/CodeGen/CGExprScalar.cpp
@@ -1591,6 +1591,13 @@ Value *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType,
if (DstType->isBooleanType())
return EmitConversionToBool(Src, SrcType);
+ // Also handle conversions to atomic bools
+ if (const AtomicType *atomicType = DstType->getAs<AtomicType>()) {
+ QualType ValueType = atomicType->getValueType();
+ if (ValueType->isBooleanType())
+ return EmitConversionToBool(Src, ValueType);
+ }
+
llvm::Type *DstTy = ConvertType(DstType);
// Cast from half through float if half isn't a native type.
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..8a39a76788e66
--- /dev/null
+++ b/clang/test/CodeGen/compound-assign-atomic-bool.c
@@ -0,0 +1,33 @@
+// 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.
+
+#include <stdatomic.h>
+#include <stdbool.h>
+
+
+// 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;
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/178220
More information about the cfe-commits
mailing list