https://github.com/kiran-isaac updated 
https://github.com/llvm/llvm-project/pull/178220

>From f1583f9e09febf7b3c2d9cec69df52514b30cd41 Mon Sep 17 00:00:00 2001
From: Kiran Sturt <[email protected]>
Date: Tue, 30 Dec 2025 18:05:53 +0000
Subject: [PATCH] [Clang] Fix atomic boolean compound assignment (#33210)

---
 clang/lib/CodeGen/CGExprScalar.cpp            |  7 ++++
 .../CodeGen/compound-assign-atomic-bool.c     | 33 +++++++++++++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 clang/test/CodeGen/compound-assign-atomic-bool.c

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;
+}

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

Reply via email to