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

>From e9a48062a4207736cd3da24bd442ccee710c5edf Mon Sep 17 00:00:00 2001
From: Kiran Sturt <[email protected]>
Date: Tue, 30 Dec 2025 18:05:53 +0000
Subject: [PATCH 1/6] [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 d21e017bd2b56..984215e563894 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;
+}

>From 851fd8224198a25aec9250c9979e939505fb24cd Mon Sep 17 00:00:00 2001
From: Kiran Sturt <[email protected]>
Date: Thu, 5 Feb 2026 15:54:56 +0000
Subject: [PATCH 2/6] Style changes, add release notes

Change-Id: I98669a9543f0c93a08fa939655ebd12a2f321ae5
---
 clang/docs/ReleaseNotes.rst                      | 3 +++
 clang/lib/CodeGen/CGExprScalar.cpp               | 4 ++--
 clang/test/CodeGen/compound-assign-atomic-bool.c | 8 ++------
 3 files changed, 7 insertions(+), 8 deletions(-)

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 984215e563894..32fc394a5d959 100644
--- a/clang/lib/CodeGen/CGExprScalar.cpp
+++ b/clang/lib/CodeGen/CGExprScalar.cpp
@@ -1592,8 +1592,8 @@ Value *ScalarExprEmitter::EmitScalarConversion(Value 
*Src, QualType SrcType,
     return EmitConversionToBool(Src, SrcType);
 
   // Also handle conversions to atomic bools
-  if (const AtomicType *atomicType = DstType->getAs<AtomicType>()) {
-    QualType ValueType = atomicType->getValueType();
+  if (const auto *DstAsAtomic = DstType->getAs<AtomicType>()) {
+    QualType ValueType = DstAsAtomic->getValueType();
     if (ValueType->isBooleanType())
       return EmitConversionToBool(Src, ValueType);
   }
diff --git a/clang/test/CodeGen/compound-assign-atomic-bool.c 
b/clang/test/CodeGen/compound-assign-atomic-bool.c
index 8a39a76788e66..4e8f351b49b81 100644
--- a/clang/test/CodeGen/compound-assign-atomic-bool.c
+++ b/clang/test/CodeGen/compound-assign-atomic-bool.c
@@ -4,13 +4,9 @@
 // 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;
+    _Atomic _Bool b;
 
     b += 2;
     // CHECK: add
@@ -22,7 +18,7 @@ int compund_assign_add(void) {
 
 // CHECK: @compund_assign_minus
 int compund_assign_minus(void) {
-    atomic_bool b;
+    _Atomic _Bool b;
 
     b -= 2;
     // CHECK: sub

>From cc6cf37b9e53070c3359606548b945260d1d62c7 Mon Sep 17 00:00:00 2001
From: Kiran Sturt <[email protected]>
Date: Thu, 5 Feb 2026 16:15:52 +0000
Subject: [PATCH 3/6] Lift the conversion from EmitScalerConversion to
 EmitCompoundAssignLValue.

Atomics aren't really scaler, are they.

Change-Id: Ida3cc76eecde6b426c0f29ac52034b89b45f6816
---
 clang/lib/CodeGen/CGExprScalar.cpp | 16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/clang/lib/CodeGen/CGExprScalar.cpp 
b/clang/lib/CodeGen/CGExprScalar.cpp
index 32fc394a5d959..5ffff5ee588c2 100644
--- a/clang/lib/CodeGen/CGExprScalar.cpp
+++ b/clang/lib/CodeGen/CGExprScalar.cpp
@@ -1591,13 +1591,6 @@ Value *ScalarExprEmitter::EmitScalarConversion(Value 
*Src, QualType SrcType,
   if (DstType->isBooleanType())
     return EmitConversionToBool(Src, SrcType);
 
-  // Also handle conversions to atomic bools
-  if (const auto *DstAsAtomic = DstType->getAs<AtomicType>()) {
-    QualType ValueType = DstAsAtomic->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.
@@ -4042,10 +4035,15 @@ 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();
     llvm::BasicBlock *contBB = CGF.createBasicBlock("atomic_cont", CGF.CurFn);

>From a3d4218a954a1b58441b14f2fd6f71003bfaf13d Mon Sep 17 00:00:00 2001
From: Kiran Sturt <[email protected]>
Date: Thu, 5 Feb 2026 16:36:53 +0000
Subject: [PATCH 4/6] Reformat

Change-Id: I561a5ac983f5abdc5dfeca1d179e7df2d9b6a49c
---
 clang/lib/CodeGen/CGExprScalar.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/clang/lib/CodeGen/CGExprScalar.cpp 
b/clang/lib/CodeGen/CGExprScalar.cpp
index 5ffff5ee588c2..1f9389660e127 100644
--- a/clang/lib/CodeGen/CGExprScalar.cpp
+++ b/clang/lib/CodeGen/CGExprScalar.cpp
@@ -4036,14 +4036,14 @@ LValue ScalarExprEmitter::EmitCompoundAssignLValue(
     Previous = Result;
     Result = EmitScalarConversion(Result, PromotionTypeCR, LHSTy, Loc);
   } else if (const auto *atomicTy = LHSTy->getAs<AtomicType>()) {
-    Result = EmitScalarConversion(Result, PromotionTypeCR,
-                                  atomicTy->getValueType(), Loc,
-                                  ScalarConversionOpts(CGF.SanOpts));
+    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();
     llvm::BasicBlock *contBB = CGF.createBasicBlock("atomic_cont", CGF.CurFn);

>From 5dc7278c4c4de4eecf3c7d9f023b474b48657bb4 Mon Sep 17 00:00:00 2001
From: Kiran Sturt <[email protected]>
Date: Fri, 6 Feb 2026 13:34:16 +0000
Subject: [PATCH 5/6] Make the test more general;  avoid test failures on
 targets that handle atomics differently

Change-Id: I9cde53604b42d2def3e4d5c726c6499d1f8c4a1c
---
 .../test/CodeGen/compound-assign-atomic-bool.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/clang/test/CodeGen/compound-assign-atomic-bool.c 
b/clang/test/CodeGen/compound-assign-atomic-bool.c
index 4e8f351b49b81..b4cbfac123070 100644
--- a/clang/test/CodeGen/compound-assign-atomic-bool.c
+++ b/clang/test/CodeGen/compound-assign-atomic-bool.c
@@ -4,26 +4,26 @@
 // correctly handle the conversion from integer to boolean, by comparing
 // with zero rather than truncating.
 
-// CHECK: @compund_assign_add
+// CHECK-LABEL: @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
+    // CHECK: icmp ne
+    // CHECK-NOT: trunc
+    // CHECK: {{cmpxchg|call.*__atomic_compare_exchange}}
     return b;
 }
 
-// CHECK: @compund_assign_minus
+// CHECK-LABEL: @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
+    // CHECK: icmp ne
+    // CHECK-NOT: trunc
+    // CHECK: {{cmpxchg|call.*__atomic_compare_exchange}}
     return b;
-}
+}
\ No newline at end of file

>From 25a261c7b8d9a6fd5f91bd44519b5ddf873dc297 Mon Sep 17 00:00:00 2001
From: Kiran Sturt <[email protected]>
Date: Fri, 6 Feb 2026 14:03:49 +0000
Subject: [PATCH 6/6] Multiple targets

Change-Id: Ic6d66f208dde1ff27ce0b4918c5269837eeb57df
---
 clang/test/CodeGen/compound-assign-atomic-bool.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/clang/test/CodeGen/compound-assign-atomic-bool.c 
b/clang/test/CodeGen/compound-assign-atomic-bool.c
index b4cbfac123070..fd99f09d640ad 100644
--- a/clang/test/CodeGen/compound-assign-atomic-bool.c
+++ b/clang/test/CodeGen/compound-assign-atomic-bool.c
@@ -1,4 +1,6 @@
-// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -o - %s | 
FileCheck %s
+// RUN: %clang_cc1 -triple riscv64-unknown-linux-gnu -emit-llvm -o - %s | 
FileCheck %s
+// RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -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

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

Reply via email to