Skip to content

Commit

Permalink
Use PassGate from LLVMContext if any otherwise global one
Browse files Browse the repository at this point in the history
Differential Revision: https://reviews.llvm.org/D137149
  • Loading branch information
Evgeniy Brevnov committed Nov 25, 2022
1 parent 8e3545a commit 721f975
Show file tree
Hide file tree
Showing 17 changed files with 82 additions and 66 deletions.
7 changes: 4 additions & 3 deletions clang/lib/CodeGen/BackendUtil.cpp
Expand Up @@ -851,9 +851,10 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
PrintPassOptions PrintPassOpts;
PrintPassOpts.Indent = DebugPassStructure;
PrintPassOpts.SkipAnalyses = DebugPassStructure;
StandardInstrumentations SI(CodeGenOpts.DebugPassManager ||
DebugPassStructure,
/*VerifyEach*/ false, PrintPassOpts);
StandardInstrumentations SI(
TheModule->getContext(),
(CodeGenOpts.DebugPassManager || DebugPassStructure),
/*VerifyEach*/ false, PrintPassOpts);
SI.registerCallbacks(PIC, &FAM);
PassBuilder PB(TM.get(), PTO, PGOOpt, &PIC);

Expand Down
3 changes: 2 additions & 1 deletion flang/lib/Frontend/FrontendActions.cpp
Expand Up @@ -694,7 +694,8 @@ void CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) {
llvm::PassInstrumentationCallbacks pic;
llvm::PipelineTuningOptions pto;
llvm::Optional<llvm::PGOOptions> pgoOpt;
llvm::StandardInstrumentations si(opts.DebugPassManager);
llvm::StandardInstrumentations si(
llvmModule->getContext(), opts.DebugPassManager);
si.registerCallbacks(pic, &fam);
llvm::PassBuilder pb(tm.get(), pto, pgoOpt, &pic);

Expand Down
8 changes: 5 additions & 3 deletions llvm/include/llvm/IR/OptBisect.h
Expand Up @@ -29,7 +29,8 @@ class OptPassGate {

/// IRDescription is a textual description of the IR unit the pass is running
/// over.
virtual bool shouldRunPass(const Pass *P, StringRef IRDescription) {
virtual bool shouldRunPass(const StringRef PassName,
StringRef IRDescription) {
return true;
}

Expand All @@ -55,7 +56,8 @@ class OptBisect : public OptPassGate {
/// Checks the bisect limit to determine if the specified pass should run.
///
/// This forwards to checkPass().
bool shouldRunPass(const Pass *P, StringRef IRDescription) override;
bool shouldRunPass(const StringRef PassName,
StringRef IRDescription) override;

/// isEnabled() should return true before calling shouldRunPass().
bool isEnabled() const override { return BisectLimit != Disabled; }
Expand Down Expand Up @@ -89,7 +91,7 @@ class OptBisect : public OptPassGate {

/// Singleton instance of the OptBisect class, so multiple pass managers don't
/// need to coordinate their uses of OptBisect.
OptBisect &getOptBisector();
OptPassGate &getGlobalPassGate();

} // end namespace llvm

Expand Down
12 changes: 7 additions & 5 deletions llvm/include/llvm/Passes/StandardInstrumentations.h
Expand Up @@ -74,11 +74,12 @@ class OptNoneInstrumentation {
bool shouldRun(StringRef PassID, Any IR);
};

class OptBisectInstrumentation {
class OptPassGateInstrumentation {
LLVMContext &Context;
bool HasWrittenIR = false;

public:
OptBisectInstrumentation() = default;
OptPassGateInstrumentation(LLVMContext &Context) : Context(Context) {}
bool shouldRun(StringRef PassName, Any IR);
void registerCallbacks(PassInstrumentationCallbacks &PIC);
};

Expand Down Expand Up @@ -528,7 +529,7 @@ class StandardInstrumentations {
TimePassesHandler TimePasses;
TimeProfilingPassesHandler TimeProfilingPasses;
OptNoneInstrumentation OptNone;
OptBisectInstrumentation OptBisect;
OptPassGateInstrumentation OptPassGate;
PreservedCFGCheckerInstrumentation PreservedCFGChecker;
IRChangedPrinter PrintChangedIR;
PseudoProbeVerifier PseudoProbeVerification;
Expand All @@ -540,7 +541,8 @@ class StandardInstrumentations {
bool VerifyEach;

public:
StandardInstrumentations(bool DebugLogging, bool VerifyEach = false,
StandardInstrumentations(LLVMContext &Context, bool DebugLogging,
bool VerifyEach = false,
PrintPassOptions PrintPassOpts = PrintPassOptions());

// Register all the standard instrumentation callbacks. If \p FAM is nullptr
Expand Down
3 changes: 2 additions & 1 deletion llvm/lib/Analysis/CallGraphSCCPass.cpp
Expand Up @@ -751,7 +751,8 @@ static std::string getDescription(const CallGraphSCC &SCC) {
bool CallGraphSCCPass::skipSCC(CallGraphSCC &SCC) const {
OptPassGate &Gate =
SCC.getCallGraph().getModule().getContext().getOptPassGate();
return Gate.isEnabled() && !Gate.shouldRunPass(this, getDescription(SCC));
return Gate.isEnabled() &&
!Gate.shouldRunPass(this->getPassName(), getDescription(SCC));
}

char DummyCGSCCPass::ID = 0;
Expand Down
3 changes: 2 additions & 1 deletion llvm/lib/Analysis/LoopPass.cpp
Expand Up @@ -373,7 +373,8 @@ bool LoopPass::skipLoop(const Loop *L) const {
return false;
// Check the opt bisect limit.
OptPassGate &Gate = F->getContext().getOptPassGate();
if (Gate.isEnabled() && !Gate.shouldRunPass(this, getDescription(*L)))
if (Gate.isEnabled() &&
!Gate.shouldRunPass(this->getPassName(), getDescription(*L)))
return true;
// Check for the OptimizeNone attribute.
if (F->hasOptNone()) {
Expand Down
3 changes: 2 additions & 1 deletion llvm/lib/Analysis/RegionPass.cpp
Expand Up @@ -283,7 +283,8 @@ static std::string getDescription(const Region &R) {
bool RegionPass::skipRegion(Region &R) const {
Function &F = *R.getEntry()->getParent();
OptPassGate &Gate = F.getContext().getOptPassGate();
if (Gate.isEnabled() && !Gate.shouldRunPass(this, getDescription(R)))
if (Gate.isEnabled() &&
!Gate.shouldRunPass(this->getPassName(), getDescription(R)))
return true;

if (F.hasOptNone()) {
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/IR/LLVMContextImpl.cpp
Expand Up @@ -240,7 +240,7 @@ void LLVMContextImpl::getSyncScopeNames(
/// singleton OptBisect if not explicitly set.
OptPassGate &LLVMContextImpl::getOptPassGate() const {
if (!OPG)
OPG = &getOptBisector();
OPG = &getGlobalPassGate();
return *OPG;
}

Expand Down
24 changes: 10 additions & 14 deletions llvm/lib/IR/OptBisect.cpp
Expand Up @@ -20,10 +20,15 @@

using namespace llvm;

static OptBisect &getOptBisector() {
static OptBisect OptBisector;
return OptBisector;
}

static cl::opt<int> OptBisectLimit("opt-bisect-limit", cl::Hidden,
cl::init(OptBisect::Disabled), cl::Optional,
cl::cb<void, int>([](int Limit) {
llvm::getOptBisector().setLimit(Limit);
getOptBisector().setLimit(Limit);
}),
cl::desc("Maximum optimization to perform"));

Expand All @@ -34,25 +39,16 @@ static void printPassMessage(const StringRef &Name, int PassNum,
<< "(" << PassNum << ") " << Name << " on " << TargetDesc << "\n";
}

bool OptBisect::shouldRunPass(const Pass *P, StringRef IRDescription) {
assert(isEnabled());

return checkPass(P->getPassName(), IRDescription);
}

bool OptBisect::checkPass(const StringRef PassName,
const StringRef TargetDesc) {
bool OptBisect::shouldRunPass(const StringRef PassName,
StringRef IRDescription) {
assert(isEnabled());

int CurBisectNum = ++LastBisectNum;
bool ShouldRun = (BisectLimit == -1 || CurBisectNum <= BisectLimit);
printPassMessage(PassName, CurBisectNum, TargetDesc, ShouldRun);
printPassMessage(PassName, CurBisectNum, IRDescription, ShouldRun);
return ShouldRun;
}

const int OptBisect::Disabled;

OptBisect &llvm::getOptBisector() {
static OptBisect OptBisector;
return OptBisector;
}
OptPassGate &llvm::getGlobalPassGate() { return getOptBisector(); }
6 changes: 4 additions & 2 deletions llvm/lib/IR/Pass.cpp
Expand Up @@ -62,7 +62,8 @@ static std::string getDescription(const Module &M) {

bool ModulePass::skipModule(Module &M) const {
OptPassGate &Gate = M.getContext().getOptPassGate();
return Gate.isEnabled() && !Gate.shouldRunPass(this, getDescription(M));
return Gate.isEnabled() &&
!Gate.shouldRunPass(this->getPassName(), getDescription(M));
}

bool Pass::mustPreserveAnalysisID(char &AID) const {
Expand Down Expand Up @@ -172,7 +173,8 @@ static std::string getDescription(const Function &F) {

bool FunctionPass::skipFunction(const Function &F) const {
OptPassGate &Gate = F.getContext().getOptPassGate();
if (Gate.isEnabled() && !Gate.shouldRunPass(this, getDescription(F)))
if (Gate.isEnabled() &&
!Gate.shouldRunPass(this->getPassName(), getDescription(F)))
return true;

if (F.hasOptNone()) {
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/LTO/LTOBackend.cpp
Expand Up @@ -256,7 +256,7 @@ static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM,
ModuleAnalysisManager MAM;

PassInstrumentationCallbacks PIC;
StandardInstrumentations SI(Conf.DebugPassManager);
StandardInstrumentations SI(Mod.getContext(), Conf.DebugPassManager);
SI.registerCallbacks(PIC, &FAM);
PassBuilder PB(TM, Conf.PTO, PGOOpt, &PIC);

Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/LTO/ThinLTOCodeGenerator.cpp
Expand Up @@ -244,7 +244,7 @@ static void optimizeModule(Module &TheModule, TargetMachine &TM,
ModuleAnalysisManager MAM;

PassInstrumentationCallbacks PIC;
StandardInstrumentations SI(DebugPassManager);
StandardInstrumentations SI(TheModule.getContext(), DebugPassManager);
SI.registerCallbacks(PIC, &FAM);
PipelineTuningOptions PTO;
PTO.LoopVectorization = true;
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Passes/PassBuilderBindings.cpp
Expand Up @@ -65,7 +65,7 @@ LLVMErrorRef LLVMRunPasses(LLVMModuleRef M, const char *Passes,
PB.registerModuleAnalyses(MAM);
PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);

StandardInstrumentations SI(Debug, VerifyEach);
StandardInstrumentations SI(Mod->getContext(), Debug, VerifyEach);
SI.registerCallbacks(PIC, &FAM);
ModulePassManager MPM;
if (VerifyEach) {
Expand Down
55 changes: 33 additions & 22 deletions llvm/lib/Passes/StandardInstrumentations.cpp
Expand Up @@ -767,27 +767,35 @@ bool OptNoneInstrumentation::shouldRun(StringRef PassID, Any IR) {
return ShouldRun;
}

void OptBisectInstrumentation::registerCallbacks(
bool OptPassGateInstrumentation::shouldRun(StringRef PassName, Any IR) {
if (isIgnored(PassName))
return true;

bool ShouldRun =
Context.getOptPassGate().shouldRunPass(PassName, getIRName(IR));
if (!ShouldRun && !this->HasWrittenIR && !OptBisectPrintIRPath.empty()) {
// FIXME: print IR if limit is higher than number of opt-bisect
// invocations
this->HasWrittenIR = true;
const Module *M = unwrapModule(IR, /*Force=*/true);
assert((M && &M->getContext() == &Context) && "Missing/Mismatching Module");
std::error_code EC;
raw_fd_ostream OS(OptBisectPrintIRPath, EC);
if (EC)
report_fatal_error(errorCodeToError(EC));
M->print(OS, nullptr);
}
return ShouldRun;
}

void OptPassGateInstrumentation::registerCallbacks(
PassInstrumentationCallbacks &PIC) {
if (!getOptBisector().isEnabled())
OptPassGate &PassGate = Context.getOptPassGate();
if (!PassGate.isEnabled())
return;
PIC.registerShouldRunOptionalPassCallback([this](StringRef PassID, Any IR) {
if (isIgnored(PassID))
return true;
bool ShouldRun = getOptBisector().checkPass(PassID, getIRName(IR));
if (!ShouldRun && !this->HasWrittenIR && !OptBisectPrintIRPath.empty()) {
// FIXME: print IR if limit is higher than number of opt-bisect
// invocations
this->HasWrittenIR = true;
const Module *M = unwrapModule(IR, /*Force=*/true);
assert(M && "expected Module");
std::error_code EC;
raw_fd_ostream OS(OptBisectPrintIRPath, EC);
if (EC)
report_fatal_error(errorCodeToError(EC));
M->print(OS, nullptr);
}
return ShouldRun;

PIC.registerShouldRunOptionalPassCallback([this](StringRef PassName, Any IR) {
return this->shouldRun(PassName, IR);
});
}

Expand Down Expand Up @@ -2037,8 +2045,11 @@ void DotCfgChangeReporter::registerCallbacks(
}

StandardInstrumentations::StandardInstrumentations(
bool DebugLogging, bool VerifyEach, PrintPassOptions PrintPassOpts)
: PrintPass(DebugLogging, PrintPassOpts), OptNone(DebugLogging),
LLVMContext &Context, bool DebugLogging, bool VerifyEach,
PrintPassOptions PrintPassOpts)
: PrintPass(DebugLogging, PrintPassOpts),
OptNone(DebugLogging),
OptPassGate(Context),
PrintChangedIR(PrintChanged == ChangePrinter::Verbose),
PrintChangedDiff(PrintChanged == ChangePrinter::DiffVerbose ||
PrintChanged == ChangePrinter::ColourDiffVerbose,
Expand Down Expand Up @@ -2099,7 +2110,7 @@ void StandardInstrumentations::registerCallbacks(
PrintPass.registerCallbacks(PIC);
TimePasses.registerCallbacks(PIC);
OptNone.registerCallbacks(PIC);
OptBisect.registerCallbacks(PIC);
OptPassGate.registerCallbacks(PIC);
if (FAM)
PreservedCFGChecker.registerCallbacks(PIC, *FAM);
PrintChangedIR.registerCallbacks(PIC);
Expand Down
4 changes: 2 additions & 2 deletions llvm/tools/opt/NewPMDriver.cpp
Expand Up @@ -354,8 +354,8 @@ bool llvm::runPassPipeline(StringRef Arg0, Module &M, TargetMachine *TM,
PrintPassOptions PrintPassOpts;
PrintPassOpts.Verbose = DebugPM == DebugLogging::Verbose;
PrintPassOpts.SkipAnalyses = DebugPM == DebugLogging::Quiet;
StandardInstrumentations SI(DebugPM != DebugLogging::None, VerifyEachPass,
PrintPassOpts);
StandardInstrumentations SI(M.getContext(), DebugPM != DebugLogging::None,
VerifyEachPass, PrintPassOpts);
SI.registerCallbacks(PIC, &FAM);
DebugifyEachInstrumentation Debugify;
DebugifyStatsMap DIStatsMap;
Expand Down
6 changes: 2 additions & 4 deletions llvm/unittests/IR/LegacyPassManagerTest.cpp
Expand Up @@ -359,10 +359,8 @@ namespace llvm {
struct CustomOptPassGate : public OptPassGate {
bool Skip;
CustomOptPassGate(bool Skip) : Skip(Skip) { }
bool shouldRunPass(const Pass *P, StringRef IRDescription) override {
if (P->getPassKind() == PT_Module)
return !Skip;
return OptPassGate::shouldRunPass(P, IRDescription);
bool shouldRunPass(const StringRef PassName, StringRef IRDescription) override {
return !Skip;
}
bool isEnabled() const override { return true; }
};
Expand Down
6 changes: 3 additions & 3 deletions llvm/unittests/IR/PassManagerTest.cpp
Expand Up @@ -826,7 +826,7 @@ TEST_F(PassManagerTest, FunctionPassCFGChecker) {
FunctionAnalysisManager FAM;
FunctionPassManager FPM;
PassInstrumentationCallbacks PIC;
StandardInstrumentations SI(/*DebugLogging*/ true);
StandardInstrumentations SI(M->getContext(), /*DebugLogging*/ true);
SI.registerCallbacks(PIC, &FAM);
FAM.registerPass([&] { return PassInstrumentationAnalysis(&PIC); });
FAM.registerPass([&] { return DominatorTreeAnalysis(); });
Expand Down Expand Up @@ -872,7 +872,7 @@ TEST_F(PassManagerTest, FunctionPassCFGCheckerInvalidateAnalysis) {
FunctionAnalysisManager FAM;
FunctionPassManager FPM;
PassInstrumentationCallbacks PIC;
StandardInstrumentations SI(/*DebugLogging*/ true);
StandardInstrumentations SI(M->getContext(), /*DebugLogging*/ true);
SI.registerCallbacks(PIC, &FAM);
FAM.registerPass([&] { return PassInstrumentationAnalysis(&PIC); });
FAM.registerPass([&] { return DominatorTreeAnalysis(); });
Expand Down Expand Up @@ -937,7 +937,7 @@ TEST_F(PassManagerTest, FunctionPassCFGCheckerWrapped) {
FunctionAnalysisManager FAM;
FunctionPassManager FPM;
PassInstrumentationCallbacks PIC;
StandardInstrumentations SI(/*DebugLogging*/ true);
StandardInstrumentations SI(M->getContext(), /*DebugLogging*/ true);
SI.registerCallbacks(PIC, &FAM);
FAM.registerPass([&] { return PassInstrumentationAnalysis(&PIC); });
FAM.registerPass([&] { return DominatorTreeAnalysis(); });
Expand Down

0 comments on commit 721f975

Please sign in to comment.