forked from OSchip/llvm-project
[NewPM] Separate out alias analysis passes in opt
Summary: This somewhat matches the --aa-pipeline option, which separates out any AA analyses to make sure they run before other passes. Makes check-llvm failures under new PM go from 2356 -> 2303. AA passes are not handled by PassBuilder::parsePassPipeline() but rather PassBuilder::parseAAPipeline(), which is why this fixes some failures. Reviewers: asbirlea, hans, ychen, leonardchan Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D82488
This commit is contained in:
parent
16501782c8
commit
85ff5b524e
|
@ -515,6 +515,9 @@ public:
|
||||||
/// returns false.
|
/// returns false.
|
||||||
Error parseAAPipeline(AAManager &AA, StringRef PipelineText);
|
Error parseAAPipeline(AAManager &AA, StringRef PipelineText);
|
||||||
|
|
||||||
|
/// Returns true if the pass name is the name of an alias analysis pass.
|
||||||
|
bool isAAPassName(StringRef PassName);
|
||||||
|
|
||||||
/// Register a callback for a default optimizer pipeline extension
|
/// Register a callback for a default optimizer pipeline extension
|
||||||
/// point
|
/// point
|
||||||
///
|
///
|
||||||
|
|
|
@ -2657,3 +2657,11 @@ Error PassBuilder::parseAAPipeline(AAManager &AA, StringRef PipelineText) {
|
||||||
|
|
||||||
return Error::success();
|
return Error::success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool PassBuilder::isAAPassName(StringRef PassName) {
|
||||||
|
#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
|
||||||
|
if (PassName == NAME) \
|
||||||
|
return true;
|
||||||
|
#include "PassRegistry.def"
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include "NewPMDriver.h"
|
#include "NewPMDriver.h"
|
||||||
#include "PassPrinters.h"
|
#include "PassPrinters.h"
|
||||||
|
#include "llvm/ADT/SmallVector.h"
|
||||||
#include "llvm/ADT/StringRef.h"
|
#include "llvm/ADT/StringRef.h"
|
||||||
#include "llvm/Analysis/AliasAnalysis.h"
|
#include "llvm/Analysis/AliasAnalysis.h"
|
||||||
#include "llvm/Analysis/CGSCCPassManager.h"
|
#include "llvm/Analysis/CGSCCPassManager.h"
|
||||||
|
@ -306,9 +307,26 @@ bool llvm::runPassPipeline(StringRef Arg0, Module &M, TargetMachine *TM,
|
||||||
// Specially handle the alias analysis manager so that we can register
|
// Specially handle the alias analysis manager so that we can register
|
||||||
// a custom pipeline of AA passes with it.
|
// a custom pipeline of AA passes with it.
|
||||||
AAManager AA;
|
AAManager AA;
|
||||||
if (auto Err = PB.parseAAPipeline(AA, AAPipeline)) {
|
if (!AAPipeline.empty()) {
|
||||||
errs() << Arg0 << ": " << toString(std::move(Err)) << "\n";
|
assert(Passes.empty() &&
|
||||||
return false;
|
"--aa-pipeline and -foo-pass should not both be specified");
|
||||||
|
if (auto Err = PB.parseAAPipeline(AA, AAPipeline)) {
|
||||||
|
errs() << Arg0 << ": " << toString(std::move(Err)) << "\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// For compatibility with legacy pass manager.
|
||||||
|
// Alias analyses are not specially specified when using the legacy PM.
|
||||||
|
SmallVector<StringRef, 4> NonAAPasses;
|
||||||
|
for (auto PassName : Passes) {
|
||||||
|
if (PB.isAAPassName(PassName)) {
|
||||||
|
if (auto Err = PB.parseAAPipeline(AA, PassName)) {
|
||||||
|
errs() << Arg0 << ": " << toString(std::move(Err)) << "\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
NonAAPasses.push_back(PassName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LoopAnalysisManager LAM(DebugPM);
|
LoopAnalysisManager LAM(DebugPM);
|
||||||
|
@ -341,7 +359,7 @@ bool llvm::runPassPipeline(StringRef Arg0, Module &M, TargetMachine *TM,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (auto PassName : Passes) {
|
for (auto PassName : NonAAPasses) {
|
||||||
if (auto Err =
|
if (auto Err =
|
||||||
PB.parsePassPipeline(MPM, PassName, VerifyEachPass, DebugPM)) {
|
PB.parsePassPipeline(MPM, PassName, VerifyEachPass, DebugPM)) {
|
||||||
errs() << Arg0 << ": " << toString(std::move(Err)) << "\n";
|
errs() << Arg0 << ": " << toString(std::move(Err)) << "\n";
|
||||||
|
|
Loading…
Reference in New Issue