Skip to content

Commit 0bb1af4

Browse files
kmpengfarzonl
andauthored
[DirectX] Add GlobalDCE pass after finalize linkage pass in DirectX backend (#151071)
Fixes #139023. This PR essentially removes unused global variables: - Restores the `GlobalDCE` Legacy pass and adds it to the DirectX backend after the finalize linkage pass - Converts external global variables with no usage to internal linkage in the finalize linkage pass - (so they can be removed by `GlobalDCE`) - Makes the `dxil-finalize-linkage` pass usable using the new pass manager flag syntax - Adds tests to `finalize_linkage.ll` that make sure unused global variables are removed - Adds a use for variable `@CBV` in `opaque-value_as_metadata.ll` so it isn't removed - Changes the `scalar-data.ll` run command to avoid removing its global variables --------- Co-authored-by: Farzon Lotfi <[email protected]>
1 parent 069f812 commit 0bb1af4

File tree

12 files changed

+72
-6
lines changed

12 files changed

+72
-6
lines changed

llvm/include/llvm/InitializePasses.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ LLVM_ABI void initializeGCEmptyBasicBlocksPass(PassRegistry &);
128128
LLVM_ABI void initializeGCMachineCodeAnalysisPass(PassRegistry &);
129129
LLVM_ABI void initializeGCModuleInfoPass(PassRegistry &);
130130
LLVM_ABI void initializeGVNLegacyPassPass(PassRegistry &);
131+
LLVM_ABI void initializeGlobalDCELegacyPassPass(PassRegistry &);
131132
LLVM_ABI void initializeGlobalMergeFuncPassWrapperPass(PassRegistry &);
132133
LLVM_ABI void initializeGlobalMergePass(PassRegistry &);
133134
LLVM_ABI void initializeGlobalsAAWrapperPassPass(PassRegistry &);

llvm/include/llvm/LinkAllPasses.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "llvm/Support/Valgrind.h"
3939
#include "llvm/Transforms/IPO.h"
4040
#include "llvm/Transforms/IPO/AlwaysInliner.h"
41+
#include "llvm/Transforms/IPO/GlobalDCE.h"
4142
#include "llvm/Transforms/InstCombine/InstCombine.h"
4243
#include "llvm/Transforms/ObjCARC.h"
4344
#include "llvm/Transforms/Scalar.h"
@@ -84,6 +85,7 @@ struct ForcePassLinking {
8485
(void)llvm::createDomOnlyViewerWrapperPassPass();
8586
(void)llvm::createDomViewerWrapperPassPass();
8687
(void)llvm::createAlwaysInlinerLegacyPass();
88+
(void)llvm::createGlobalDCEPass();
8789
(void)llvm::createGlobalMergeFuncPass();
8890
(void)llvm::createGlobalsAAWrapperPass();
8991
(void)llvm::createInstSimplifyLegacyPass();

llvm/include/llvm/Transforms/IPO/GlobalDCE.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class GlobalVariable;
3232
class Metadata;
3333
class Module;
3434
class Value;
35+
class ModulePass;
3536

3637
/// Pass to remove unused function declarations.
3738
class GlobalDCEPass : public PassInfoMixin<GlobalDCEPass> {
@@ -80,6 +81,7 @@ class GlobalDCEPass : public PassInfoMixin<GlobalDCEPass> {
8081
void ComputeDependencies(Value *V, SmallPtrSetImpl<GlobalValue *> &U);
8182
};
8283

84+
ModulePass *createGlobalDCEPass();
8385
}
8486

8587
#endif // LLVM_TRANSFORMS_IPO_GLOBALDCE_H

llvm/lib/Target/DirectX/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ add_llvm_target(DirectXCodeGen
4949
DirectXInfo
5050
DirectXPointerTypeAnalysis
5151
FrontendHLSL
52+
IPO
5253
MC
5354
ScalarOpts
5455
SelectionDAG

llvm/lib/Target/DirectX/DXILFinalizeLinkage.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ using namespace llvm;
2020
static bool finalizeLinkage(Module &M) {
2121
bool MadeChange = false;
2222

23-
// Convert private global variables to internal linkage.
24-
for (GlobalVariable &GV : M.globals()) {
25-
if (GV.hasPrivateLinkage()) {
23+
// Convert private globals and external globals with no usage to internal
24+
// linkage.
25+
for (GlobalVariable &GV : M.globals())
26+
if (GV.hasPrivateLinkage() || (GV.hasExternalLinkage() && GV.use_empty())) {
2627
GV.setLinkage(GlobalValue::InternalLinkage);
2728
MadeChange = true;
2829
}
29-
}
3030

3131
SmallVector<Function *> Funcs;
3232

llvm/lib/Target/DirectX/DirectXPassRegistry.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ MODULE_ANALYSIS("dxil-root-signature-analysis", dxil::RootSignatureAnalysis())
2424
#define MODULE_PASS(NAME, CREATE_PASS)
2525
#endif
2626
MODULE_PASS("dxil-cbuffer-access", DXILCBufferAccess())
27+
MODULE_PASS("dxil-finalize-linkage", DXILFinalizeLinkage())
2728
MODULE_PASS("dxil-data-scalarization", DXILDataScalarization())
2829
MODULE_PASS("dxil-flatten-arrays", DXILFlattenArrays())
2930
MODULE_PASS("dxil-intrinsic-expansion", DXILIntrinsicExpansion())

llvm/lib/Target/DirectX/DirectXTargetMachine.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "DirectXTargetMachine.h"
1515
#include "DXILCBufferAccess.h"
1616
#include "DXILDataScalarization.h"
17+
#include "DXILFinalizeLinkage.h"
1718
#include "DXILFlattenArrays.h"
1819
#include "DXILForwardHandleAccesses.h"
1920
#include "DXILIntrinsicExpansion.h"
@@ -45,6 +46,7 @@
4546
#include "llvm/Support/Compiler.h"
4647
#include "llvm/Support/ErrorHandling.h"
4748
#include "llvm/Target/TargetLoweringObjectFile.h"
49+
#include "llvm/Transforms/IPO/GlobalDCE.h"
4850
#include "llvm/Transforms/Scalar.h"
4951
#include "llvm/Transforms/Scalar/Scalarizer.h"
5052
#include <optional>
@@ -63,6 +65,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeDirectXTarget() {
6365
initializeEmbedDXILPassPass(*PR);
6466
initializeWriteDXILPassPass(*PR);
6567
initializeDXContainerGlobalsPass(*PR);
68+
initializeGlobalDCELegacyPassPass(*PR);
6669
initializeDXILOpLoweringLegacyPass(*PR);
6770
initializeDXILResourceAccessLegacyPass(*PR);
6871
initializeDXILResourceImplicitBindingLegacyPass(*PR);
@@ -105,6 +108,7 @@ class DirectXPassConfig : public TargetPassConfig {
105108
FunctionPass *createTargetRegisterAllocator(bool) override { return nullptr; }
106109
void addCodeGenPrepare() override {
107110
addPass(createDXILFinalizeLinkageLegacyPass());
111+
addPass(createGlobalDCEPass());
108112
addPass(createDXILResourceAccessLegacyPass());
109113
addPass(createDXILIntrinsicExpansionLegacyPass());
110114
addPass(createDXILCBufferAccessLegacyPass());

llvm/lib/Transforms/IPO/GlobalDCE.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#include "llvm/IR/Instructions.h"
2222
#include "llvm/IR/IntrinsicInst.h"
2323
#include "llvm/IR/Module.h"
24+
#include "llvm/InitializePasses.h"
25+
#include "llvm/Pass.h"
2426
#include "llvm/Support/CommandLine.h"
2527
#include "llvm/Transforms/IPO.h"
2628
#include "llvm/Transforms/Utils/CtorUtils.h"
@@ -30,6 +32,35 @@ using namespace llvm;
3032

3133
#define DEBUG_TYPE "globaldce"
3234

35+
namespace {
36+
class GlobalDCELegacyPass : public ModulePass {
37+
public:
38+
static char ID; // Pass identification, replacement for typeid
39+
GlobalDCELegacyPass() : ModulePass(ID) {
40+
initializeGlobalDCELegacyPassPass(*PassRegistry::getPassRegistry());
41+
}
42+
bool runOnModule(Module &M) override {
43+
if (skipModule(M))
44+
return false;
45+
// Note: GlobalDCEPass does not use any analyses, so we're safe to call the
46+
// new-pm style pass with a default-initialized analysis manager here
47+
ModuleAnalysisManager MAM;
48+
auto PA = Impl.run(M, MAM);
49+
return !PA.areAllPreserved();
50+
}
51+
52+
private:
53+
GlobalDCEPass Impl;
54+
};
55+
} // namespace
56+
57+
char GlobalDCELegacyPass::ID = 0;
58+
INITIALIZE_PASS(GlobalDCELegacyPass, "globaldce", "Dead Global Elimination",
59+
false, false)
60+
61+
// Public interface to the GlobalDCEPass.
62+
ModulePass *llvm::createGlobalDCEPass() { return new GlobalDCELegacyPass(); }
63+
3364
static cl::opt<bool>
3465
ClEnableVFE("enable-vfe", cl::Hidden, cl::init(true),
3566
cl::desc("Enable virtual function elimination"));

llvm/test/CodeGen/DirectX/finalize_linkage.ll

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
target triple = "dxilv1.5-pc-shadermodel6.5-compute"
55

66
; DXILFinalizeLinkage changes linkage of all functions that are hidden to
7-
; internal, and converts private global variables to internal linkage.
7+
; internal, converts private globals to internal linkage, and converts external globals
8+
; with no usage to internal linkage.
89

910
; CHECK: @switch.table = internal unnamed_addr constant [4 x i32]
1011
@switch.table = private unnamed_addr constant [4 x i32] [i32 1, i32 257, i32 65793, i32 16843009], align 4
@@ -27,6 +28,27 @@ target triple = "dxilv1.5-pc-shadermodel6.5-compute"
2728
; CHECK: @hidden_var = hidden global i32
2829
@hidden_var = hidden global i32 1, align 4
2930

31+
; Running the whole pipeline should remove unused global variables
32+
33+
; CHECK: @aTile = internal addrspace(3) global
34+
; CHECK-LLC-NOT: @aTile
35+
@aTile = hidden addrspace(3) global [4 x [1 x i32]] zeroinitializer, align 4
36+
37+
; CHECK: @bTile = internal addrspace(3) global
38+
; CHECK-LLC-NOT: @bTile
39+
@bTile = hidden addrspace(3) global [1 x [1 x i32]] zeroinitializer, align 4
40+
41+
define void @anchor_function() #0 {
42+
entry:
43+
%0 = load i32, ptr @switch.table, align 4
44+
%1 = load [3 x float], ptr @private_array, align 4
45+
%2 = load i32, ptr @private_var, align 4
46+
%3 = load i32, ptr @internal_var, align 4
47+
%4 = load i32, ptr @external_var, align 4
48+
%5 = load i32, ptr @hidden_var, align 4
49+
ret void
50+
}
51+
3052
; CHECK-NOT: define internal void @"?f1@@YAXXZ"()
3153
define void @"?f1@@YAXXZ"() #0 {
3254
entry:

llvm/test/CodeGen/DirectX/llc-pipeline.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
; CHECK-NEXT: ModulePass Manager
1616
; CHECK-NEXT: DXIL Finalize Linkage
17+
; CHECK-NEXT: Dead Global Elimination
1718
; CHECK-NEXT: FunctionPass Manager
1819
; CHECK-NEXT: DXIL Resource Access
1920
; CHECK-NEXT: DXIL Intrinsic Expansion

0 commit comments

Comments
 (0)