Skip to content

Commit a48c1bd

Browse files
authored
Revert "[CodeGen] Support start/stop in CodeGenPassBuilder" (#78567)
Reverts #70912. This breaks some bazel tests.
1 parent d12dffa commit a48c1bd

File tree

5 files changed

+21
-206
lines changed

5 files changed

+21
-206
lines changed

llvm/include/llvm/CodeGen/CodeGenPassBuilder.h

+20-113
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
#include "llvm/CodeGen/ShadowStackGCLowering.h"
4545
#include "llvm/CodeGen/SjLjEHPrepare.h"
4646
#include "llvm/CodeGen/StackProtector.h"
47-
#include "llvm/CodeGen/TargetPassConfig.h"
4847
#include "llvm/CodeGen/UnreachableBlockElim.h"
4948
#include "llvm/CodeGen/WasmEHPrepare.h"
5049
#include "llvm/CodeGen/WinEHPrepare.h"
@@ -177,80 +176,73 @@ template <typename DerivedT> class CodeGenPassBuilder {
177176
// Function object to maintain state while adding codegen IR passes.
178177
class AddIRPass {
179178
public:
180-
AddIRPass(ModulePassManager &MPM, const DerivedT &PB) : MPM(MPM), PB(PB) {}
179+
AddIRPass(ModulePassManager &MPM) : MPM(MPM) {}
181180
~AddIRPass() {
182181
if (!FPM.isEmpty())
183182
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
184183
}
185184

186-
template <typename PassT>
187-
void operator()(PassT &&Pass, StringRef Name = PassT::name()) {
185+
template <typename PassT> void operator()(PassT &&Pass) {
188186
static_assert((is_detected<is_function_pass_t, PassT>::value ||
189187
is_detected<is_module_pass_t, PassT>::value) &&
190188
"Only module pass and function pass are supported.");
191189

192-
if (!PB.runBeforeAdding(Name))
193-
return;
194-
195190
// Add Function Pass
196191
if constexpr (is_detected<is_function_pass_t, PassT>::value) {
197192
FPM.addPass(std::forward<PassT>(Pass));
198-
199-
for (auto &C : PB.AfterCallbacks)
200-
C(Name);
201193
} else {
202194
// Add Module Pass
203195
if (!FPM.isEmpty()) {
204196
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
205197
FPM = FunctionPassManager();
206198
}
207-
208199
MPM.addPass(std::forward<PassT>(Pass));
209-
210-
for (auto &C : PB.AfterCallbacks)
211-
C(Name);
212200
}
213201
}
214202

215203
private:
216204
ModulePassManager &MPM;
217205
FunctionPassManager FPM;
218-
const DerivedT &PB;
219206
};
220207

221208
// Function object to maintain state while adding codegen machine passes.
222209
class AddMachinePass {
223210
public:
224-
AddMachinePass(MachineFunctionPassManager &PM, const DerivedT &PB)
225-
: PM(PM), PB(PB) {}
211+
AddMachinePass(MachineFunctionPassManager &PM) : PM(PM) {}
226212

227213
template <typename PassT> void operator()(PassT &&Pass) {
228214
static_assert(
229215
is_detected<has_key_t, PassT>::value,
230216
"Machine function pass must define a static member variable `Key`.");
231-
232-
if (!PB.runBeforeAdding(PassT::name()))
233-
return;
234-
217+
for (auto &C : BeforeCallbacks)
218+
if (!C(&PassT::Key))
219+
return;
235220
PM.addPass(std::forward<PassT>(Pass));
236-
237-
for (auto &C : PB.AfterCallbacks)
238-
C(PassT::name());
221+
for (auto &C : AfterCallbacks)
222+
C(&PassT::Key);
239223
}
240224

241225
template <typename PassT> void insertPass(MachinePassKey *ID, PassT Pass) {
242-
PB.AfterCallbacks.emplace_back(
226+
AfterCallbacks.emplace_back(
243227
[this, ID, Pass = std::move(Pass)](MachinePassKey *PassID) {
244228
if (PassID == ID)
245229
this->PM.addPass(std::move(Pass));
246230
});
247231
}
248232

233+
void disablePass(MachinePassKey *ID) {
234+
BeforeCallbacks.emplace_back(
235+
[ID](MachinePassKey *PassID) { return PassID != ID; });
236+
}
237+
249238
MachineFunctionPassManager releasePM() { return std::move(PM); }
250239

251240
private:
252241
MachineFunctionPassManager &PM;
253-
const DerivedT &PB;
242+
SmallVector<llvm::unique_function<bool(MachinePassKey *)>, 4>
243+
BeforeCallbacks;
244+
SmallVector<llvm::unique_function<void(MachinePassKey *)>, 4>
245+
AfterCallbacks;
254246
};
255247

256248
LLVMTargetMachine &TM;
@@ -481,43 +473,20 @@ template <typename DerivedT> class CodeGenPassBuilder {
481473
const DerivedT &derived() const {
482474
return static_cast<const DerivedT &>(*this);
483475
}
484-
485-
bool runBeforeAdding(StringRef Name) const {
486-
bool ShouldAdd = true;
487-
for (auto &C : BeforeCallbacks)
488-
ShouldAdd &= C(Name);
489-
return ShouldAdd;
490-
}
491-
492-
void setStartStopPasses(const TargetPassConfig::StartStopInfo &Info) const;
493-
494-
Error verifyStartStop(const TargetPassConfig::StartStopInfo &Info) const;
495-
496-
mutable SmallVector<llvm::unique_function<bool(StringRef)>, 4>
497-
BeforeCallbacks;
498-
mutable SmallVector<llvm::unique_function<void(StringRef)>, 4> AfterCallbacks;
499-
500-
/// Helper variable for `-start-before/-start-after/-stop-before/-stop-after`
501-
mutable bool Started = true;
502-
mutable bool Stopped = true;
503476
};
504477

505478
template <typename Derived>
506479
Error CodeGenPassBuilder<Derived>::buildPipeline(
507480
ModulePassManager &MPM, MachineFunctionPassManager &MFPM,
508481
raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
509482
CodeGenFileType FileType) const {
510-
auto StartStopInfo = TargetPassConfig::getStartStopInfo(*PIC);
511-
if (!StartStopInfo)
512-
return StartStopInfo.takeError();
513-
setStartStopPasses(*StartStopInfo);
514-
AddIRPass addIRPass(MPM, derived());
483+
AddIRPass addIRPass(MPM);
515484
// `ProfileSummaryInfo` is always valid.
516485
addIRPass(RequireAnalysisPass<ProfileSummaryAnalysis, Module>());
517486
addIRPass(RequireAnalysisPass<CollectorMetadataAnalysis, Module>());
518487
addISelPasses(addIRPass);
519488

520-
AddMachinePass addPass(MFPM, derived());
489+
AddMachinePass addPass(MFPM);
521490
if (auto Err = addCoreISelPasses(addPass))
522491
return std::move(Err);
523492

@@ -530,68 +499,6 @@ Error CodeGenPassBuilder<Derived>::buildPipeline(
530499
});
531500

532501
addPass(FreeMachineFunctionPass());
533-
return verifyStartStop(*StartStopInfo);
534-
}
535-
536-
template <typename Derived>
537-
void CodeGenPassBuilder<Derived>::setStartStopPasses(
538-
const TargetPassConfig::StartStopInfo &Info) const {
539-
if (!Info.StartPass.empty()) {
540-
Started = false;
541-
BeforeCallbacks.emplace_back([this, &Info, AfterFlag = Info.StartAfter,
542-
Count = 0u](StringRef ClassName) mutable {
543-
if (Count == Info.StartInstanceNum) {
544-
if (AfterFlag) {
545-
AfterFlag = false;
546-
Started = true;
547-
}
548-
return Started;
549-
}
550-
551-
auto PassName = PIC->getPassNameForClassName(ClassName);
552-
if (Info.StartPass == PassName && ++Count == Info.StartInstanceNum)
553-
Started = !Info.StartAfter;
554-
555-
return Started;
556-
});
557-
}
558-
559-
if (!Info.StopPass.empty()) {
560-
Stopped = false;
561-
BeforeCallbacks.emplace_back([this, &Info, AfterFlag = Info.StopAfter,
562-
Count = 0u](StringRef ClassName) mutable {
563-
if (Count == Info.StopInstanceNum) {
564-
if (AfterFlag) {
565-
AfterFlag = false;
566-
Stopped = true;
567-
}
568-
return !Stopped;
569-
}
570-
571-
auto PassName = PIC->getPassNameForClassName(ClassName);
572-
if (Info.StopPass == PassName && ++Count == Info.StopInstanceNum)
573-
Stopped = !Info.StopAfter;
574-
return !Stopped;
575-
});
576-
}
577-
}
578-
579-
template <typename Derived>
580-
Error CodeGenPassBuilder<Derived>::verifyStartStop(
581-
const TargetPassConfig::StartStopInfo &Info) const {
582-
if (Started && Stopped)
583-
return Error::success();
584-
585-
if (!Started)
586-
return make_error<StringError>(
587-
"Can't find start pass \"" +
588-
PIC->getPassNameForClassName(Info.StartPass) + "\".",
589-
std::make_error_code(std::errc::invalid_argument));
590-
if (!Stopped)
591-
return make_error<StringError>(
592-
"Can't find stop pass \"" +
593-
PIC->getPassNameForClassName(Info.StopPass) + "\".",
594-
std::make_error_code(std::errc::invalid_argument));
595502
return Error::success();
596503
}
597504

llvm/include/llvm/CodeGen/TargetPassConfig.h

-15
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
#include "llvm/Pass.h"
1717
#include "llvm/Support/CodeGen.h"
18-
#include "llvm/Support/Error.h"
1918
#include <cassert>
2019
#include <string>
2120

@@ -177,20 +176,6 @@ class TargetPassConfig : public ImmutablePass {
177176
static std::string
178177
getLimitedCodeGenPipelineReason(const char *Separator = "/");
179178

180-
struct StartStopInfo {
181-
bool StartAfter;
182-
bool StopAfter;
183-
unsigned StartInstanceNum;
184-
unsigned StopInstanceNum;
185-
StringRef StartPass;
186-
StringRef StopPass;
187-
};
188-
189-
/// Returns pass name in `-stop-before` or `-stop-after`
190-
/// NOTE: New pass manager migration only
191-
static Expected<StartStopInfo>
192-
getStartStopInfo(PassInstrumentationCallbacks &PIC);
193-
194179
void setDisableVerify(bool Disable) { setOpt(DisableVerify, Disable); }
195180

196181
bool getEnableTailMerge() const { return EnableTailMerge; }

llvm/lib/CodeGen/TargetPassConfig.cpp

-34
Original file line numberDiff line numberDiff line change
@@ -609,40 +609,6 @@ void llvm::registerCodeGenCallback(PassInstrumentationCallbacks &PIC,
609609
registerPartialPipelineCallback(PIC, LLVMTM);
610610
}
611611

612-
Expected<TargetPassConfig::StartStopInfo>
613-
TargetPassConfig::getStartStopInfo(PassInstrumentationCallbacks &PIC) {
614-
auto [StartBefore, StartBeforeInstanceNum] =
615-
getPassNameAndInstanceNum(StartBeforeOpt);
616-
auto [StartAfter, StartAfterInstanceNum] =
617-
getPassNameAndInstanceNum(StartAfterOpt);
618-
auto [StopBefore, StopBeforeInstanceNum] =
619-
getPassNameAndInstanceNum(StopBeforeOpt);
620-
auto [StopAfter, StopAfterInstanceNum] =
621-
getPassNameAndInstanceNum(StopAfterOpt);
622-
623-
if (!StartBefore.empty() && !StartAfter.empty())
624-
return make_error<StringError>(
625-
Twine(StartBeforeOptName) + " and " + StartAfterOptName + " specified!",
626-
std::make_error_code(std::errc::invalid_argument));
627-
if (!StopBefore.empty() && !StopAfter.empty())
628-
return make_error<StringError>(
629-
Twine(StopBeforeOptName) + " and " + StopAfterOptName + " specified!",
630-
std::make_error_code(std::errc::invalid_argument));
631-
632-
StartStopInfo Result;
633-
Result.StartPass = StartBefore.empty() ? StartAfter : StartBefore;
634-
Result.StopPass = StopBefore.empty() ? StopAfter : StopBefore;
635-
Result.StartInstanceNum =
636-
StartBefore.empty() ? StartAfterInstanceNum : StartBeforeInstanceNum;
637-
Result.StopInstanceNum =
638-
StopBefore.empty() ? StopAfterInstanceNum : StopBeforeInstanceNum;
639-
Result.StartAfter = !StartAfter.empty();
640-
Result.StopAfter = !StopAfter.empty();
641-
Result.StartInstanceNum += Result.StartInstanceNum == 0;
642-
Result.StopInstanceNum += Result.StopInstanceNum == 0;
643-
return Result;
644-
}
645-
646612
// Out of line constructor provides default values for pass options and
647613
// registers all common codegen passes.
648614
TargetPassConfig::TargetPassConfig(LLVMTargetMachine &TM, PassManagerBase &pm)

llvm/lib/Passes/PassBuilder.cpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@
9393
#include "llvm/CodeGen/ShadowStackGCLowering.h"
9494
#include "llvm/CodeGen/SjLjEHPrepare.h"
9595
#include "llvm/CodeGen/StackProtector.h"
96-
#include "llvm/CodeGen/TargetPassConfig.h"
9796
#include "llvm/CodeGen/TypePromotion.h"
9897
#include "llvm/CodeGen/WasmEHPrepare.h"
9998
#include "llvm/CodeGen/WinEHPrepare.h"
@@ -317,8 +316,7 @@ namespace {
317316
/// We currently only use this for --print-before/after.
318317
bool shouldPopulateClassToPassNames() {
319318
return PrintPipelinePasses || !printBeforePasses().empty() ||
320-
!printAfterPasses().empty() || !isFilterPassesEmpty() ||
321-
TargetPassConfig::hasLimitedCodeGenPipeline();
319+
!printAfterPasses().empty() || !isFilterPassesEmpty();
322320
}
323321

324322
// A pass for testing -print-on-crash.

llvm/unittests/CodeGen/CodeGenPassBuilderTest.cpp

-41
Original file line numberDiff line numberDiff line change
@@ -138,45 +138,4 @@ TEST_F(CodeGenPassBuilderTest, basic) {
138138
EXPECT_EQ(MIRPipeline, ExpectedMIRPipeline);
139139
}
140140

141-
// TODO: Move this to lit test when llc support new pm.
142-
TEST_F(CodeGenPassBuilderTest, start_stop) {
143-
static const char *argv[] = {
144-
"test",
145-
"-start-after=no-op-module",
146-
"-stop-before=no-op-function,2",
147-
};
148-
int argc = std::size(argv);
149-
cl::ParseCommandLineOptions(argc, argv);
150-
151-
LoopAnalysisManager LAM;
152-
FunctionAnalysisManager FAM;
153-
CGSCCAnalysisManager CGAM;
154-
ModuleAnalysisManager MAM;
155-
156-
PassInstrumentationCallbacks PIC;
157-
DummyCodeGenPassBuilder CGPB(*TM, getCGPassBuilderOption(), &PIC);
158-
PipelineTuningOptions PTO;
159-
PassBuilder PB(TM.get(), PTO, std::nullopt, &PIC);
160-
161-
PB.registerModuleAnalyses(MAM);
162-
PB.registerCGSCCAnalyses(CGAM);
163-
PB.registerFunctionAnalyses(FAM);
164-
PB.registerLoopAnalyses(LAM);
165-
PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
166-
167-
ModulePassManager MPM;
168-
MachineFunctionPassManager MFPM;
169-
170-
Error Err =
171-
CGPB.buildPipeline(MPM, MFPM, outs(), nullptr, CodeGenFileType::Null);
172-
EXPECT_FALSE(Err);
173-
std::string IRPipeline;
174-
raw_string_ostream IROS(IRPipeline);
175-
MPM.printPipeline(IROS, [&PIC](StringRef Name) {
176-
auto PassName = PIC.getPassNameForClassName(Name);
177-
return PassName.empty() ? Name : PassName;
178-
});
179-
EXPECT_EQ(IRPipeline, "function(no-op-function)");
180-
}
181-
182141
} // namespace

0 commit comments

Comments
 (0)