https://github.com/benshi001 created 
https://github.com/llvm/llvm-project/pull/237887

fixes https://github.com/llvm/llvm-project/issues/236067

>From ef7e75625befa01099c12ad487b498a509d6e73b Mon Sep 17 00:00:00 2001
From: Ben Shi <[email protected]>
Date: Mon, 2 Nov 2026 17:01:10 +0800
Subject: [PATCH] [clang][CodeGen] Fix casting 'AddrLabelExpr' to a differernt
 addrspace

fixes https://github.com/llvm/llvm-project/issues/236067
---
 clang/docs/ReleaseNotes.md            |  2 ++
 clang/lib/CodeGen/CGExprScalar.cpp    |  4 +++-
 clang/test/CodeGen/avr/issue-236067.c | 10 ++++++++++
 3 files changed, 15 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/CodeGen/avr/issue-236067.c

diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index e769ad6a24e6bf..9354edd7eb841d 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -1221,6 +1221,8 @@ documentation](CIR/index.md) for more information 
regarding ClangIR's status and
   type. (#GH88592)
 - Fixed an assertion when emitting base destructor as alias on targets (such
   as AVR) which have different address spaces for code and data. (#GH236285)
+- Fixed an assertion when casting 'AddrLabelExpr' on targets (such as AVR)
+  which which have different address spaces for code and data. (#GH236067)
 
 ### OpenACC Specific Changes
 
diff --git a/clang/lib/CodeGen/CGExprScalar.cpp 
b/clang/lib/CodeGen/CGExprScalar.cpp
index 0e2e29f0745d27..fe2a9bfd002e12 100644
--- a/clang/lib/CodeGen/CGExprScalar.cpp
+++ b/clang/lib/CodeGen/CGExprScalar.cpp
@@ -582,7 +582,9 @@ class ScalarExprEmitter
   Value *VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E);
   Value *VisitAddrLabelExpr(const AddrLabelExpr *E) {
     llvm::Value *V = CGF.GetAddrOfLabel(E->getLabel());
-    return Builder.CreateBitCast(V, ConvertType(E->getType()));
+    // For some targets (such as AVR), code and data have different addrspaces.
+    return Builder.CreatePointerBitCastOrAddrSpaceCast(
+        V, ConvertType(E->getType()));
   }
 
   Value *VisitSizeOfPackExpr(SizeOfPackExpr *E) {
diff --git a/clang/test/CodeGen/avr/issue-236067.c 
b/clang/test/CodeGen/avr/issue-236067.c
new file mode 100644
index 00000000000000..78c6b798273d46
--- /dev/null
+++ b/clang/test/CodeGen/avr/issue-236067.c
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -triple avr -emit-llvm < %s | FileCheck %s
+
+// This test case verifies https://github.com/llvm/llvm-project/issues/236067 .
+
+void foo() {
+  void *bar = &&label;
+label:
+}
+
+// CHECK: store ptr addrspacecast (ptr addrspace(1) blockaddress(@foo, %label) 
to ptr), ptr %bar, align 1

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

Reply via email to