Skip to content

Commit 31ddaef

Browse files
authored
[CodeGen][NPM] Port UnreachableMachineBlockElim to NPM (#136127)
1 parent 1db03ca commit 31ddaef

10 files changed

+81
-20
lines changed

llvm/include/llvm/CodeGen/UnreachableBlockElim.h

+8
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#ifndef LLVM_CODEGEN_UNREACHABLEBLOCKELIM_H
2323
#define LLVM_CODEGEN_UNREACHABLEBLOCKELIM_H
2424

25+
#include "llvm/CodeGen/MachinePassManager.h"
2526
#include "llvm/IR/PassManager.h"
2627

2728
namespace llvm {
@@ -31,6 +32,13 @@ class UnreachableBlockElimPass
3132
public:
3233
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
3334
};
35+
36+
class UnreachableMachineBlockElimPass
37+
: public PassInfoMixin<UnreachableMachineBlockElimPass> {
38+
public:
39+
PreservedAnalyses run(MachineFunction &F, MachineFunctionAnalysisManager &AM);
40+
};
41+
3442
} // end namespace llvm
3543

3644
#endif // LLVM_CODEGEN_UNREACHABLEBLOCKELIM_H

llvm/include/llvm/InitializePasses.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ void initializeUniformityInfoWrapperPassPass(PassRegistry &);
315315
void initializeUnifyLoopExitsLegacyPassPass(PassRegistry &);
316316
void initializeUnpackMachineBundlesPass(PassRegistry &);
317317
void initializeUnreachableBlockElimLegacyPassPass(PassRegistry &);
318-
void initializeUnreachableMachineBlockElimPass(PassRegistry &);
318+
void initializeUnreachableMachineBlockElimLegacyPass(PassRegistry &);
319319
void initializeVerifierLegacyPassPass(PassRegistry &);
320320
void initializeVirtRegMapWrapperLegacyPass(PassRegistry &);
321321
void initializeVirtRegRewriterPass(PassRegistry &);

llvm/include/llvm/Passes/CodeGenPassBuilder.h

+15
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
#include "llvm/CodeGen/JMCInstrumenter.h"
4848
#include "llvm/CodeGen/LiveDebugValuesPass.h"
4949
#include "llvm/CodeGen/LiveIntervals.h"
50+
#include "llvm/CodeGen/LiveVariables.h"
5051
#include "llvm/CodeGen/LocalStackSlotAllocation.h"
5152
#include "llvm/CodeGen/LowerEmuTLS.h"
5253
#include "llvm/CodeGen/MIRPrinter.h"
@@ -1172,7 +1173,21 @@ void CodeGenPassBuilder<Derived, TargetMachineT>::addOptimizedRegAlloc(
11721173

11731174
addPass(ProcessImplicitDefsPass());
11741175

1176+
// LiveVariables currently requires pure SSA form.
1177+
//
1178+
// FIXME: Once TwoAddressInstruction pass no longer uses kill flags,
1179+
// LiveVariables can be removed completely, and LiveIntervals can be directly
1180+
// computed. (We still either need to regenerate kill flags after regalloc, or
1181+
// preferably fix the scavenger to not depend on them).
1182+
// FIXME: UnreachableMachineBlockElim is a dependant pass of LiveVariables.
1183+
// When LiveVariables is removed this has to be removed/moved either.
1184+
// Explicit addition of UnreachableMachineBlockElim allows stopping before or
1185+
// after it with -stop-before/-stop-after.
1186+
addPass(UnreachableMachineBlockElimPass());
1187+
addPass(RequireAnalysisPass<LiveVariablesAnalysis, MachineFunction>());
1188+
11751189
// Edge splitting is smarter with machine loop info.
1190+
addPass(RequireAnalysisPass<MachineLoopAnalysis, MachineFunction>());
11761191
addPass(PHIEliminationPass());
11771192

11781193
// Eventually, we want to run LiveIntervals before PHI elimination.

llvm/include/llvm/Passes/MachinePassRegistry.def

+2
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ MACHINE_FUNCTION_PASS("stack-slot-coloring", StackSlotColoringPass())
194194
MACHINE_FUNCTION_PASS("tailduplication", TailDuplicatePass())
195195
MACHINE_FUNCTION_PASS("trigger-verifier-error", TriggerVerifierErrorPass())
196196
MACHINE_FUNCTION_PASS("two-address-instruction", TwoAddressInstructionPass())
197+
MACHINE_FUNCTION_PASS("unreachable-mbb-elimination",
198+
UnreachableMachineBlockElimPass())
197199
MACHINE_FUNCTION_PASS("verify", MachineVerifierPass())
198200
MACHINE_FUNCTION_PASS("verify<machine-trace-metrics>", MachineTraceMetricsVerifierPass())
199201
MACHINE_FUNCTION_PASS("xray-instrumentation", XRayInstrumentationPass())

llvm/lib/CodeGen/CodeGen.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
140140
initializeTypePromotionLegacyPass(Registry);
141141
initializeUnpackMachineBundlesPass(Registry);
142142
initializeUnreachableBlockElimLegacyPassPass(Registry);
143-
initializeUnreachableMachineBlockElimPass(Registry);
143+
initializeUnreachableMachineBlockElimLegacyPass(Registry);
144144
initializeVirtRegMapWrapperLegacyPass(Registry);
145145
initializeVirtRegRewriterPass(Registry);
146146
initializeWasmEHPreparePass(Registry);

llvm/lib/CodeGen/LiveVariables.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ char LiveVariablesWrapperPass::ID = 0;
6161
char &llvm::LiveVariablesID = LiveVariablesWrapperPass::ID;
6262
INITIALIZE_PASS_BEGIN(LiveVariablesWrapperPass, "livevars",
6363
"Live Variable Analysis", false, false)
64-
INITIALIZE_PASS_DEPENDENCY(UnreachableMachineBlockElim)
64+
INITIALIZE_PASS_DEPENDENCY(UnreachableMachineBlockElimLegacy)
6565
INITIALIZE_PASS_END(LiveVariablesWrapperPass, "livevars",
6666
"Live Variable Analysis", false, false)
6767

llvm/lib/CodeGen/UnreachableBlockElim.cpp

+50-17
Original file line numberDiff line numberDiff line change
@@ -72,39 +72,72 @@ PreservedAnalyses UnreachableBlockElimPass::run(Function &F,
7272
}
7373

7474
namespace {
75-
class UnreachableMachineBlockElim : public MachineFunctionPass {
76-
bool runOnMachineFunction(MachineFunction &F) override;
77-
void getAnalysisUsage(AnalysisUsage &AU) const override;
78-
79-
public:
80-
static char ID; // Pass identification, replacement for typeid
81-
UnreachableMachineBlockElim() : MachineFunctionPass(ID) {}
82-
};
83-
}
84-
char UnreachableMachineBlockElim::ID = 0;
75+
class UnreachableMachineBlockElim {
76+
MachineDominatorTree *MDT;
77+
MachineLoopInfo *MLI;
78+
79+
public:
80+
UnreachableMachineBlockElim(MachineDominatorTree *MDT, MachineLoopInfo *MLI)
81+
: MDT(MDT), MLI(MLI) {}
82+
bool run(MachineFunction &MF);
83+
};
84+
85+
class UnreachableMachineBlockElimLegacy : public MachineFunctionPass {
86+
bool runOnMachineFunction(MachineFunction &F) override;
87+
void getAnalysisUsage(AnalysisUsage &AU) const override;
88+
89+
public:
90+
static char ID; // Pass identification, replacement for typeid
91+
UnreachableMachineBlockElimLegacy() : MachineFunctionPass(ID) {}
92+
};
93+
} // namespace
94+
95+
char UnreachableMachineBlockElimLegacy::ID = 0;
8596

86-
INITIALIZE_PASS(UnreachableMachineBlockElim, "unreachable-mbb-elimination",
87-
"Remove unreachable machine basic blocks", false, false)
97+
INITIALIZE_PASS(UnreachableMachineBlockElimLegacy,
98+
"unreachable-mbb-elimination",
99+
"Remove unreachable machine basic blocks", false, false)
88100

89-
char &llvm::UnreachableMachineBlockElimID = UnreachableMachineBlockElim::ID;
101+
char &llvm::UnreachableMachineBlockElimID =
102+
UnreachableMachineBlockElimLegacy::ID;
90103

91-
void UnreachableMachineBlockElim::getAnalysisUsage(AnalysisUsage &AU) const {
104+
void UnreachableMachineBlockElimLegacy::getAnalysisUsage(
105+
AnalysisUsage &AU) const {
92106
AU.addPreserved<MachineLoopInfoWrapperPass>();
93107
AU.addPreserved<MachineDominatorTreeWrapperPass>();
94108
MachineFunctionPass::getAnalysisUsage(AU);
95109
}
96110

97-
bool UnreachableMachineBlockElim::runOnMachineFunction(MachineFunction &F) {
98-
df_iterator_default_set<MachineBasicBlock*> Reachable;
99-
bool ModifiedPHI = false;
111+
PreservedAnalyses
112+
UnreachableMachineBlockElimPass::run(MachineFunction &MF,
113+
MachineFunctionAnalysisManager &AM) {
114+
auto *MDT = AM.getCachedResult<MachineDominatorTreeAnalysis>(MF);
115+
auto *MLI = AM.getCachedResult<MachineLoopAnalysis>(MF);
116+
117+
if (!UnreachableMachineBlockElim(MDT, MLI).run(MF))
118+
return PreservedAnalyses::all();
119+
120+
return getMachineFunctionPassPreservedAnalyses()
121+
.preserve<MachineLoopAnalysis>()
122+
.preserve<MachineDominatorTreeAnalysis>();
123+
}
100124

125+
bool UnreachableMachineBlockElimLegacy::runOnMachineFunction(
126+
MachineFunction &MF) {
101127
MachineDominatorTreeWrapperPass *MDTWrapper =
102128
getAnalysisIfAvailable<MachineDominatorTreeWrapperPass>();
103129
MachineDominatorTree *MDT = MDTWrapper ? &MDTWrapper->getDomTree() : nullptr;
104130
MachineLoopInfoWrapperPass *MLIWrapper =
105131
getAnalysisIfAvailable<MachineLoopInfoWrapperPass>();
106132
MachineLoopInfo *MLI = MLIWrapper ? &MLIWrapper->getLI() : nullptr;
107133

134+
return UnreachableMachineBlockElim(MDT, MLI).run(MF);
135+
}
136+
137+
bool UnreachableMachineBlockElim::run(MachineFunction &F) {
138+
df_iterator_default_set<MachineBasicBlock *> Reachable;
139+
bool ModifiedPHI = false;
140+
108141
// Mark all reachable blocks.
109142
for (MachineBasicBlock *BB : depth_first_ext(&F, Reachable))
110143
(void)BB/* Mark all reachable blocks */;

llvm/lib/Passes/PassBuilder.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@
167167
#include "llvm/CodeGen/TargetPassConfig.h"
168168
#include "llvm/CodeGen/TwoAddressInstructionPass.h"
169169
#include "llvm/CodeGen/TypePromotion.h"
170+
#include "llvm/CodeGen/UnreachableBlockElim.h"
170171
#include "llvm/CodeGen/VirtRegMap.h"
171172
#include "llvm/CodeGen/WasmEHPrepare.h"
172173
#include "llvm/CodeGen/WinEHPrepare.h"

llvm/test/CodeGen/Hexagon/unreachable-mbb-phi-subreg.mir

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# RUN: llc -mtriple=hexagon -run-pass unreachable-mbb-elimination %s -o - | FileCheck %s
2+
# RUN: llc -mtriple=hexagon -passes unreachable-mbb-elimination %s -o - | FileCheck %s
23

34
---
45
name: fred

llvm/test/DebugInfo/MIR/X86/unreachable-block-call-site.mir

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# RUN: llc -emit-call-site-info -mtriple=x86_64-pc-linux -run-pass=unreachable-mbb-elimination -o - %s | FileCheck %s
2+
# RUN: llc -emit-call-site-info -mtriple=x86_64-pc-linux -passes=unreachable-mbb-elimination -o - %s | FileCheck %s
23

34
# Verify that the call site information for the call residing in the eliminated
45
# block is removed. This test case would previously trigger an assertion when

0 commit comments

Comments
 (0)