https://github.com/woruyu created 
https://github.com/llvm/llvm-project/pull/179177

### Summary
This PR resolves https://github.com/llvm/llvm-project/issues/178317

>From 70e38884cf3accb78585390628d026b1f3b7ad4a Mon Sep 17 00:00:00 2001
From: woruyu <[email protected]>
Date: Mon, 2 Feb 2026 15:30:07 +0800
Subject: [PATCH] [Clang] Fixes builtin_bswapg builtin for bool type

---
 clang/lib/AST/ByteCode/InterpBuiltin.cpp      |  2 +-
 clang/lib/AST/ExprConstant.cpp                |  3 ++-
 clang/lib/Sema/SemaChecking.cpp               |  2 +-
 clang/test/AST/ByteCode/builtin-functions.cpp |  1 +
 clang/test/CodeGen/builtins.c                 |  1 +
 clang/test/CodeGenCXX/builtins.cpp            | 21 ++++++++++++++-----
 clang/test/Sema/constant-builtins-2.c         |  1 +
 clang/test/Sema/constant-builtins.c           |  1 +
 clang/test/SemaCXX/builtin-bswapg.cpp         |  1 +
 9 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp 
b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index 4cf6898df3692..1cdfa30e8301b 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -1048,7 +1048,7 @@ static bool interp__builtin_bswap(InterpState &S, CodePtr 
OpPC,
                                   const InterpFrame *Frame,
                                   const CallExpr *Call) {
   const APSInt &Val = popToAPSInt(S, Call->getArg(0));
-  if (Val.getBitWidth() == 8)
+  if (Val.getBitWidth() == 8 || Val.getBitWidth() == 1)
     pushInteger(S, Val, Call->getType());
   else
     pushInteger(S, Val.byteSwap(), Call->getType());
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 857688ed8039d..ed19335c83978 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -16170,7 +16170,8 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const 
CallExpr *E,
     APSInt Val;
     if (!EvaluateInteger(E->getArg(0), Val, Info))
       return false;
-    if (Val.getBitWidth() == 8)
+    // if (Val.getBitWidth() <= 8)
+    if (Val.getBitWidth() == 8 || Val.getBitWidth() == 1)
       return Success(Val, E);
 
     return Success(Val.byteSwap(), E);
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index e2e1b37572364..22a299f430a3a 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -2249,7 +2249,7 @@ static bool BuiltinBswapg(Sema &S, CallExpr *TheCall) {
     return true;
   }
   if (const auto *BT = dyn_cast<BitIntType>(ArgTy)) {
-    if (BT->getNumBits() % 16 != 0 && BT->getNumBits() != 8) {
+    if (BT->getNumBits() % 16 != 0 && BT->getNumBits() != 8 && 
BT->getNumBits() != 1) {
       S.Diag(Arg->getBeginLoc(), diag::err_bswapg_invalid_bit_width)
           << ArgTy << BT->getNumBits();
       return true;
diff --git a/clang/test/AST/ByteCode/builtin-functions.cpp 
b/clang/test/AST/ByteCode/builtin-functions.cpp
index b2f0213cfea05..10f7ff294ae00 100644
--- a/clang/test/AST/ByteCode/builtin-functions.cpp
+++ b/clang/test/AST/ByteCode/builtin-functions.cpp
@@ -841,6 +841,7 @@ namespace bswap {
   int h7 = __builtin_bswapg(0x1234) == 0x3412 ? 1 : f();
   int h8 = __builtin_bswapg(0x00001234) == 0x34120000 ? 1 : f();
   int h9 = __builtin_bswapg(0x0000000000001234) == 0x3412000000000000 ? 1 : 
f();
+  int h9a = __builtin_bswapg(true) == true ? 1 : f();
 #ifndef __AVR__
   int h10 = __builtin_bswapg((_BitInt(8))0x12) == (_BitInt(8))0x12 ? 1 : f();
   int h11 = __builtin_bswapg((_BitInt(16))0x1234) == (_BitInt(16))0x3412 ? 1 : 
f();
diff --git a/clang/test/CodeGen/builtins.c b/clang/test/CodeGen/builtins.c
index 3545588aec654..0d0104515235c 100644
--- a/clang/test/CodeGen/builtins.c
+++ b/clang/test/CodeGen/builtins.c
@@ -135,6 +135,7 @@ int main(void) {
   P(object_size, (s0, 3));
 
   // Whatever
+  P(bswapg, ((_Bool)N));
   P(bswapg, ((char)N));
   P(bswapg, ((short)N));
   P(bswapg, ((int)N));
diff --git a/clang/test/CodeGenCXX/builtins.cpp 
b/clang/test/CodeGenCXX/builtins.cpp
index ef30a25a17922..ad0d06cdb2637 100644
--- a/clang/test/CodeGenCXX/builtins.cpp
+++ b/clang/test/CodeGenCXX/builtins.cpp
@@ -120,17 +120,28 @@ void test_char_reference(char& a) {
 // CHECK-NOT: call i8 @llvm.bswap.i8
 // CHECK: ret void
 
+void test_bool_reference(bool& a) {
+  __builtin_bswapg(a);
+}
+// CHECK-LABEL: @_Z19test_bool_referenceRb
+// CHECK: store ptr %a, ptr
+// CHECK: load ptr, ptr
+// CHECK-NOT: call i8 @llvm.bswap.i8
+// CHECK: ret void
+
 void test_bitint() {
-  _BitInt(8) a = 0x12;
+  bool a = true;
   __builtin_bswapg(a);
-  _BitInt(16) b = 0x1234;
+  _BitInt(8) b = 0x12;
   __builtin_bswapg(b);
-  _BitInt(32) c = 0x00001234;
+  _BitInt(16) c = 0x1234;
   __builtin_bswapg(c);
-  _BitInt(64) d = 0x0000000000001234;
+  _BitInt(32) d = 0x00001234;
   __builtin_bswapg(d);
-  _BitInt(128) e = ~(_BitInt(128))0;
+  _BitInt(64) e = 0x0000000000001234;
   __builtin_bswapg(e);
+  _BitInt(128) f = ~(_BitInt(128))0;
+  __builtin_bswapg(f);
 }
 // CHECK-LABEL: @_Z11test_bitintv
 // CHECK-NOT: call i8 @llvm.bswap.i8
diff --git a/clang/test/Sema/constant-builtins-2.c 
b/clang/test/Sema/constant-builtins-2.c
index 9579052b1f76b..e875863e7fa91 100644
--- a/clang/test/Sema/constant-builtins-2.c
+++ b/clang/test/Sema/constant-builtins-2.c
@@ -479,6 +479,7 @@ int h0 = __builtin_types_compatible_p(int, float);
 int h3 = __builtin_bswap16(0x1234) == 0x3412 ? 1 : f();
 int h4 = __builtin_bswap32(0x1234) == 0x34120000 ? 1 : f();
 int h5 = __builtin_bswap64(0x1234) == 0x3412000000000000 ? 1 : f();
+int h5a = __builtin_bswapg((_Bool)(0x0)) == (_Bool)(0x0) ? 1 : f();
 int h6 = __builtin_bswapg((char)(0x12)) == (char)(0x12) ? 1 : f();
 int h7 = __builtin_bswapg((short)(0x1234)) == (short)(0x3412) ? 1 : f();
 int h8 = __builtin_bswapg(0x00001234) == 0x34120000 ? 1 : f();
diff --git a/clang/test/Sema/constant-builtins.c 
b/clang/test/Sema/constant-builtins.c
index 6c13fe96b6b4a..565547a16dde5 100644
--- a/clang/test/Sema/constant-builtins.c
+++ b/clang/test/Sema/constant-builtins.c
@@ -25,6 +25,7 @@ int h0 = __builtin_types_compatible_p(int,float);
 int h3 = __builtin_bswap16(0x1234) == 0x3412 ? 1 : f();
 int h4 = __builtin_bswap32(0x1234) == 0x34120000 ? 1 : f();
 int h5 = __builtin_bswap64(0x1234) == 0x3412000000000000 ? 1 : f();
+int h5a = __builtin_bswapg((_Bool)1) == (_Bool)1 ? 1 : f();
 int h6 = __builtin_bswapg((char)0x12) == (char)0x12 ? 1 : f();
 int h7 = __builtin_bswapg((short)(0x1234)) == (short)(0x3412) ? 1 : f();
 int h8 = __builtin_bswapg(0x00001234) == 0x34120000 ? 1 : f();
diff --git a/clang/test/SemaCXX/builtin-bswapg.cpp 
b/clang/test/SemaCXX/builtin-bswapg.cpp
index 539390fa9b606..815cc0085f89e 100644
--- a/clang/test/SemaCXX/builtin-bswapg.cpp
+++ b/clang/test/SemaCXX/builtin-bswapg.cpp
@@ -2,6 +2,7 @@
 // RUN: %clang_cc1 -fsyntax-only -verify 
-fexperimental-new-constant-interpreter %s
 
 void test_basic_type_checks() {
+  static_assert(__is_same(bool, decltype(__builtin_bswapg((bool)0))), "");
   static_assert(__is_same(char, decltype(__builtin_bswapg((char)0))), "");
   static_assert(__is_same(unsigned char, decltype(__builtin_bswapg((unsigned 
char)0))), "");
   static_assert(__is_same(short, decltype(__builtin_bswapg((short)0))), "");

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

Reply via email to