[llvm] [DirectX] Convert private global variables to internal linkage during Finalize Linkage pass (PR #146406)
Kaitlin Peng via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 2 11:40:04 PDT 2025
https://github.com/kmpeng updated https://github.com/llvm/llvm-project/pull/146406
>From 6a3aedc006a26e29908c731f3a4407b3b629169d Mon Sep 17 00:00:00 2001
From: kmpeng <kaitlinpeng at microsoft.com>
Date: Mon, 30 Jun 2025 11:30:50 -0700
Subject: [PATCH 1/2] fix switch.table.* bug - convert private global variables
to internal linkage
---
.../Target/DirectX/DXILFinalizeLinkage.cpp | 20 ++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILFinalizeLinkage.cpp b/llvm/lib/Target/DirectX/DXILFinalizeLinkage.cpp
index 94b2dbe78c4f7..5f331dbd2d826 100644
--- a/llvm/lib/Target/DirectX/DXILFinalizeLinkage.cpp
+++ b/llvm/lib/Target/DirectX/DXILFinalizeLinkage.cpp
@@ -18,6 +18,16 @@
using namespace llvm;
static bool finalizeLinkage(Module &M) {
+ bool MadeChange = false;
+
+ // Convert private global variables to internal linkage.
+ for (GlobalVariable &GV : M.globals()) {
+ if (GV.hasPrivateLinkage()) {
+ GV.setLinkage(GlobalValue::InternalLinkage);
+ MadeChange = true;
+ }
+ }
+
SmallVector<Function *> Funcs;
// Collect non-entry and non-exported functions to set to internal linkage.
@@ -32,13 +42,17 @@ static bool finalizeLinkage(Module &M) {
}
for (Function *F : Funcs) {
- if (F->getLinkage() == GlobalValue::ExternalLinkage)
+ if (F->getLinkage() == GlobalValue::ExternalLinkage) {
F->setLinkage(GlobalValue::InternalLinkage);
- if (F->isDefTriviallyDead())
+ MadeChange = true;
+ }
+ if (F->isDefTriviallyDead()) {
M.getFunctionList().erase(F);
+ MadeChange = true;
+ }
}
- return false;
+ return MadeChange;
}
PreservedAnalyses DXILFinalizeLinkage::run(Module &M,
>From 52b874bda6ad2eaee11ebaa7b23b14d7b4df7df6 Mon Sep 17 00:00:00 2001
From: kmpeng <kaitlinpeng at microsoft.com>
Date: Wed, 2 Jul 2025 11:39:54 -0700
Subject: [PATCH 2/2] add tests
---
llvm/test/CodeGen/DirectX/finalize_linkage.ll | 23 ++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/llvm/test/CodeGen/DirectX/finalize_linkage.ll b/llvm/test/CodeGen/DirectX/finalize_linkage.ll
index df691db5cff36..dc1140f1c9160 100644
--- a/llvm/test/CodeGen/DirectX/finalize_linkage.ll
+++ b/llvm/test/CodeGen/DirectX/finalize_linkage.ll
@@ -4,7 +4,28 @@
target triple = "dxilv1.5-pc-shadermodel6.5-compute"
; DXILFinalizeLinkage changes linkage of all functions that are hidden to
-; internal.
+; internal, and converts private global variables to internal linkage.
+
+; CHECK: @switch.table = internal unnamed_addr constant [4 x i32]
+ at switch.table = private unnamed_addr constant [4 x i32] [i32 1, i32 257, i32 65793, i32 16843009], align 4
+
+; CHECK: @private_array = internal constant [3 x float]
+ at private_array = private constant [3 x float] [float 1.0, float 2.0, float 3.0], align 4
+
+; CHECK: @private_var = internal global i32
+ at private_var = private global i32 1, align 4
+
+; Internal global should remain internal
+; CHECK: @internal_var = internal global i32
+ at internal_var = internal global i32 1, align 4
+
+; External global should remain external
+; CHECK: @external_var = external global i32
+ at external_var = external global i32, align 4
+
+; Hidden global should remain hidden
+; CHECK: @hidden_var = hidden global i32
+ at hidden_var = hidden global i32 1, align 4
; CHECK-NOT: define internal void @"?f1@@YAXXZ"()
define void @"?f1@@YAXXZ"() #0 {
More information about the llvm-commits
mailing list