[clang] 3091b98 - [CIR] Add noundef to __cxx_global_array_dtor parameter (#191529)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 16 10:08:25 PDT 2026
Author: adams381
Date: 2026-04-16T12:08:19-05:00
New Revision: 3091b9811305b98cf45aaf6ed7b5c2c910b24a6f
URL: https://github.com/llvm/llvm-project/commit/3091b9811305b98cf45aaf6ed7b5c2c910b24a6f
DIFF: https://github.com/llvm/llvm-project/commit/3091b9811305b98cf45aaf6ed7b5c2c910b24a6f.diff
LOG: [CIR] Add noundef to __cxx_global_array_dtor parameter (#191529)
The synthetic __cxx_global_array_dtor helper created by
LoweringPrepare was missing noundef on its ptr parameter,
causing a mismatch with classic codegen.
Added:
Modified:
clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
clang/test/CIR/CodeGen/global-array-dtor.cpp
clang/test/CIR/CodeGen/global-init.cpp
Removed:
################################################################################
diff --git a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
index 9015fe483a7df..ec032a92591d7 100644
--- a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
@@ -910,6 +910,16 @@ cir::FuncOp LoweringPreparePass::getOrCreateDtorFunc(CIRBaseBuilderTy &builder,
cir::FuncOp dtorFunc =
buildRuntimeFunction(builder, fnName, op.getLoc(), fnType,
cir::GlobalLinkageKind::InternalLinkage);
+
+ SmallVector<mlir::NamedAttribute> paramAttrs;
+ paramAttrs.push_back(
+ builder.getNamedAttr("llvm.noundef", builder.getUnitAttr()));
+ SmallVector<mlir::Attribute> argAttrDicts;
+ argAttrDicts.push_back(
+ mlir::DictionaryAttr::get(builder.getContext(), paramAttrs));
+ dtorFunc.setArgAttrsAttr(
+ mlir::ArrayAttr::get(builder.getContext(), argAttrDicts));
+
mlir::Block *entryBB = dtorFunc.addEntryBlock();
// Move everything from the dtor region into the helper function.
diff --git a/clang/test/CIR/CodeGen/global-array-dtor.cpp b/clang/test/CIR/CodeGen/global-array-dtor.cpp
index 49c8e279c2678..ef2a313546fcd 100644
--- a/clang/test/CIR/CodeGen/global-array-dtor.cpp
+++ b/clang/test/CIR/CodeGen/global-array-dtor.cpp
@@ -55,7 +55,7 @@ ArrayDtor arrDtor[16];
// CIR: %[[HANDLE:.*]] = cir.get_global @__dso_handle : !cir.ptr<i8>
// CIR: cir.call @__cxa_atexit(%[[DTOR_CAST]], %[[ARR_CAST]], %[[HANDLE]]) : (!cir.ptr<!cir.func<(!cir.ptr<!void>)>>, !cir.ptr<!void>, !cir.ptr<i8>) -> ()
-// LLVM: define internal void @__cxx_global_array_dtor(ptr %[[ARR_ARG:.*]]) {
+// LLVM: define internal void @__cxx_global_array_dtor(ptr noundef %[[ARR_ARG:.*]]) {
// LLVM: %[[BEGIN:.*]] = getelementptr %struct.ArrayDtor, ptr %[[ARR_ARG]], i32 0
// LLVM: %[[END:.*]] = getelementptr %struct.ArrayDtor, ptr %[[BEGIN]], i64 16
// LLVM: %[[CUR_ADDR:.*]] = alloca ptr
diff --git a/clang/test/CIR/CodeGen/global-init.cpp b/clang/test/CIR/CodeGen/global-init.cpp
index 7ef21cab24940..47cad1bd724dd 100644
--- a/clang/test/CIR/CodeGen/global-init.cpp
+++ b/clang/test/CIR/CodeGen/global-init.cpp
@@ -216,7 +216,7 @@ ArrayDtor arrDtor[16];
// CIR: %[[HANDLE:.*]] = cir.get_global @__dso_handle : !cir.ptr<i8>
// CIR: cir.call @__cxa_atexit(%[[DTOR_CAST]], %[[ARR_CAST]], %[[HANDLE]]) : (!cir.ptr<!cir.func<(!cir.ptr<!void>)>>, !cir.ptr<!void>, !cir.ptr<i8>) -> ()
-// LLVM: define internal void @__cxx_global_array_dtor(ptr %[[ARR_ARG:.*]]) {
+// LLVM: define internal void @__cxx_global_array_dtor(ptr noundef %[[ARR_ARG:.*]]) {
// LLVM: %[[BEGIN:.*]] = getelementptr %struct.ArrayDtor, ptr %[[ARR_ARG]], i32 0
// LLVM: %[[END:.*]] = getelementptr %struct.ArrayDtor, ptr %[[BEGIN]], i64 16
// LLVM: %[[CUR_ADDR:.*]] = alloca ptr
More information about the cfe-commits
mailing list