Skip to content

Commit 61066f9

Browse files
committed
Add pass to legacy PM.
1 parent ec3276b commit 61066f9

File tree

9 files changed

+103
-52
lines changed

9 files changed

+103
-52
lines changed

llvm/include/llvm/CodeGen/Passes.h

+2
Original file line numberDiff line numberDiff line change
@@ -617,6 +617,8 @@ namespace llvm {
617617

618618
/// Lowers KCFI operand bundles for indirect calls.
619619
FunctionPass *createKCFIPass();
620+
621+
FunctionPass *createTargetVerifierLegacyPass();
620622
} // End llvm namespace
621623

622624
#endif

llvm/include/llvm/InitializePasses.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,7 @@ void initializeTailDuplicateLegacyPass(PassRegistry &);
307307
void initializeTargetLibraryInfoWrapperPassPass(PassRegistry &);
308308
void initializeTargetPassConfigPass(PassRegistry &);
309309
void initializeTargetTransformInfoWrapperPassPass(PassRegistry &);
310+
void initializeTargetVerifierLegacyPassPass(PassRegistry &);
310311
void initializeTwoAddressInstructionLegacyPassPass(PassRegistry &);
311312
void initializeTypeBasedAAWrapperPassPass(PassRegistry &);
312313
void initializeTypePromotionLegacyPass(PassRegistry &);
@@ -317,7 +318,6 @@ void initializeUnpackMachineBundlesPass(PassRegistry &);
317318
void initializeUnreachableBlockElimLegacyPassPass(PassRegistry &);
318319
void initializeUnreachableMachineBlockElimLegacyPass(PassRegistry &);
319320
void initializeVerifierLegacyPassPass(PassRegistry &);
320-
void initializeAMDGPUTargetVerifierLegacyPassPass(PassRegistry &);
321321
void initializeVirtRegMapWrapperLegacyPass(PassRegistry &);
322322
void initializeVirtRegRewriterPass(PassRegistry &);
323323
void initializeWasmEHPreparePass(PassRegistry &);

llvm/include/llvm/Target/TargetVerifier.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class Function;
3030

3131
class TargetVerifierPass : public PassInfoMixin<TargetVerifierPass> {
3232
public:
33-
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM) {}
33+
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
3434
};
3535

3636
class TargetVerify {
@@ -76,8 +76,8 @@ class TargetVerify {
7676
: Mod(Mod), TT(Mod->getTargetTriple()),
7777
MessagesStr(Messages) {}
7878

79-
void run(Function &F) {};
80-
void run(Function &F, FunctionAnalysisManager &AM);
79+
bool run(Function &F);
80+
bool run(Function &F, FunctionAnalysisManager &AM);
8181
};
8282

8383
} // namespace llvm

llvm/lib/Target/AMDGPU/AMDGPUPassRegistry.def

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ FUNCTION_ALIAS_ANALYSIS("amdgpu-aa", AMDGPUAA())
8888
#define VERIFIER_FUNCTION_ANALYSIS(NAME, CREATE_PASS)
8989
#endif
9090
VERIFIER_MODULE_ANALYSIS("verifier", VerifierPass())
91-
VERIFIER_FUNCTION_ANALYSIS("amdgpu-tgtverifier", AMDGPUTargetVerifierPass())
91+
VERIFIER_FUNCTION_ANALYSIS("tgtverifier", TargetVerifierPass())
9292
#undef VERIFIER_MODULE_ANALYSIS
9393
#undef VERIFIER_FUNCTION_ANALYSIS
9494

llvm/lib/Target/AMDGPU/AMDGPUTargetVerifier.cpp

-45
Original file line numberDiff line numberDiff line change
@@ -132,49 +132,4 @@ PreservedAnalyses AMDGPUTargetVerifierPass::run(Function &F, FunctionAnalysisMan
132132
return PreservedAnalyses::all();
133133
}
134134

135-
struct AMDGPUTargetVerifierLegacyPass : public FunctionPass {
136-
static char ID;
137-
138-
std::unique_ptr<AMDGPUTargetVerify> TV;
139-
bool FatalErrors = true;
140-
141-
AMDGPUTargetVerifierLegacyPass() : FunctionPass(ID) {
142-
initializeAMDGPUTargetVerifierLegacyPassPass(*PassRegistry::getPassRegistry());
143-
}
144-
AMDGPUTargetVerifierLegacyPass(bool FatalErrors)
145-
: FunctionPass(ID),
146-
FatalErrors(FatalErrors) {
147-
initializeAMDGPUTargetVerifierLegacyPassPass(*PassRegistry::getPassRegistry());
148-
}
149-
150-
bool doInitialization(Module &M) override {
151-
TV = std::make_unique<AMDGPUTargetVerify>(&M);
152-
return false;
153-
}
154-
155-
bool runOnFunction(Function &F) override {
156-
if (!TV->run(F) && FatalErrors) {
157-
errs() << "in function " << F.getName() << '\n';
158-
report_fatal_error("Broken function found, compilation aborted!");
159-
}
160-
return false;
161-
}
162-
163-
bool doFinalization(Module &M) override {
164-
bool IsValid = true;
165-
for (Function &F : M)
166-
if (F.isDeclaration())
167-
IsValid &= TV->run(F);
168-
169-
if (FatalErrors && !IsValid)
170-
report_fatal_error("Broken module found, compilation aborted!");
171-
return false;
172-
}
173-
174-
void getAnalysisUsage(AnalysisUsage &AU) const override {
175-
AU.setPreservesAll();
176-
}
177-
};
178-
char AMDGPUTargetVerifierLegacyPass::ID = 0;
179135
} // namespace llvm
180-
INITIALIZE_PASS(AMDGPUTargetVerifierLegacyPass, "amdgpu-tgtverify", "AMDGPU Target Verifier", false, false)

llvm/lib/Target/TargetVerifier.cpp

+86-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "llvm/Target/TargetVerifier.h"
2121
#include "llvm/Target/TargetVerify/AMDGPUTargetVerifier.h"
2222

23+
#include "llvm/InitializePasses.h"
2324
#include "llvm/Analysis/UniformityAnalysis.h"
2425
#include "llvm/Analysis/PostDominators.h"
2526
#include "llvm/Support/Debug.h"
@@ -32,7 +33,22 @@
3233

3334
namespace llvm {
3435

35-
void TargetVerify::run(Function &F, FunctionAnalysisManager &AM) {
36+
bool TargetVerify::run(Function &F) {
37+
if (TT.isAMDGPU()) {
38+
AMDGPUTargetVerify TV(Mod);
39+
TV.run(F);
40+
41+
dbgs() << TV.MessagesStr.str();
42+
if (!TV.MessagesStr.str().empty()) {
43+
TV.IsValid = false;
44+
return false;
45+
}
46+
return true;
47+
}
48+
report_fatal_error("Target has no verification method\n");
49+
}
50+
51+
bool TargetVerify::run(Function &F, FunctionAnalysisManager &AM) {
3652
if (TT.isAMDGPU()) {
3753
auto *UA = &AM.getResult<UniformityInfoAnalysis>(F);
3854
auto *DT = &AM.getResult<DominatorTreeAnalysis>(F);
@@ -44,8 +60,77 @@ void TargetVerify::run(Function &F, FunctionAnalysisManager &AM) {
4460
dbgs() << TV.MessagesStr.str();
4561
if (!TV.MessagesStr.str().empty()) {
4662
TV.IsValid = false;
63+
return false;
64+
}
65+
return true;
66+
}
67+
report_fatal_error("Target has no verification method\n");
68+
}
69+
70+
PreservedAnalyses TargetVerifierPass::run(Function &F, FunctionAnalysisManager &AM) {
71+
auto TT = F.getParent()->getTargetTriple();
72+
73+
if (TT.isAMDGPU()) {
74+
auto *Mod = F.getParent();
75+
76+
auto UA = &AM.getResult<UniformityInfoAnalysis>(F);
77+
auto *DT = &AM.getResult<DominatorTreeAnalysis>(F);
78+
auto *PDT = &AM.getResult<PostDominatorTreeAnalysis>(F);
79+
80+
AMDGPUTargetVerify TV(Mod, DT, PDT, UA);
81+
TV.run(F);
82+
83+
dbgs() << TV.MessagesStr.str();
84+
if (!TV.MessagesStr.str().empty()) {
85+
TV.IsValid = false;
86+
return PreservedAnalyses::none();
4787
}
88+
return PreservedAnalyses::all();
4889
}
90+
report_fatal_error("Target has no verification method\n");
4991
}
5092

93+
struct TargetVerifierLegacyPass : public FunctionPass {
94+
static char ID;
95+
96+
std::unique_ptr<TargetVerify> TV;
97+
98+
TargetVerifierLegacyPass() : FunctionPass(ID) {
99+
initializeTargetVerifierLegacyPassPass(*PassRegistry::getPassRegistry());
100+
}
101+
102+
bool doInitialization(Module &M) override {
103+
TV = std::make_unique<TargetVerify>(&M);
104+
return false;
105+
}
106+
107+
bool runOnFunction(Function &F) override {
108+
if (!TV->run(F)) {
109+
errs() << "in function " << F.getName() << '\n';
110+
report_fatal_error("broken function found, compilation aborted!");
111+
}
112+
return false;
113+
}
114+
115+
bool doFinalization(Module &M) override {
116+
bool IsValid = true;
117+
for (Function &F : M)
118+
if (F.isDeclaration())
119+
IsValid &= TV->run(F);
120+
121+
if (!IsValid)
122+
report_fatal_error("broken module found, compilation aborted!");
123+
return false;
124+
}
125+
126+
void getAnalysisUsage(AnalysisUsage &AU) const override {
127+
AU.setPreservesAll();
128+
}
129+
};
130+
char TargetVerifierLegacyPass::ID = 0;
131+
FunctionPass *createTargetVerifierLegacyPass() {
132+
return new TargetVerifierLegacyPass();
133+
}
51134
} // namespace llvm
135+
using namespace llvm;
136+
INITIALIZE_PASS(TargetVerifierLegacyPass, "tgtverifier", "Target Verifier", false, false)

llvm/tools/llc/NewPMDriver.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ static cl::opt<bool>
5757
DebugPM("debug-pass-manager", cl::Hidden,
5858
cl::desc("Print pass management debugging information"));
5959

60+
static cl::opt<bool> VerifyTarget("verify-tgt-new-pm",
61+
cl::desc("Verify the target"));
62+
6063
bool LLCDiagnosticHandler::handleDiagnostics(const DiagnosticInfo &DI) {
6164
DiagnosticHandler::handleDiagnostics(DI);
6265
if (DI.getKind() == llvm::DK_SrcMgr) {
@@ -127,7 +130,8 @@ int llvm::compileModuleWithNewPM(
127130
PB.registerFunctionAnalyses(FAM);
128131
PB.registerLoopAnalyses(LAM);
129132
PB.registerMachineFunctionAnalyses(MFAM);
130-
PB.registerVerifierPasses(MPM, FPM);
133+
if (VerifyTarget)
134+
PB.registerVerifierPasses(MPM, FPM);
131135
PB.crossRegisterProxies(LAM, FAM, CGAM, MAM, &MFAM);
132136
SI.registerCallbacks(PIC, &MAM, &FAM);
133137

llvm/tools/llc/llc.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,8 @@ static cl::opt<std::string> PassPipeline(
209209
static cl::alias PassPipeline2("p", cl::aliasopt(PassPipeline),
210210
cl::desc("Alias for -passes"));
211211

212+
static cl::opt<bool> VerifyTarget("verify-tgt", cl::desc("Verify the target"));
213+
212214
namespace {
213215

214216
std::vector<std::string> &getRunPassNames() {
@@ -658,6 +660,8 @@ static int compileModule(char **argv, LLVMContext &Context) {
658660

659661
// Build up all of the passes that we want to do to the module.
660662
legacy::PassManager PM;
663+
if (VerifyTarget)
664+
PM.add(createTargetVerifierLegacyPass());
661665
PM.add(new TargetLibraryInfoWrapperPass(TLII));
662666

663667
{

llvm/tools/llvm-tgt-verify/llvm-tgt-verify.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ int main(int argc, char **argv) {
141141
ModuleAnalysisManager MAM;
142142
PassBuilder PB(TM.get(), PipelineTuningOptions(), std::nullopt, &PIC);
143143
PB.registerModuleAnalyses(MAM);
144+
//PB.registerVerifierPasses(MPM, FPM);
144145
PB.registerCGSCCAnalyses(CGAM);
145146
PB.registerFunctionAnalyses(FAM);
146147
PB.registerLoopAnalyses(LAM);

0 commit comments

Comments
 (0)