Skip to content

Commit 496de32

Browse files
authored
[NewPM] Remove MachinePassInfoMixin (#88243)
Unify the inheritance paths of IR and machine function.
1 parent b109477 commit 496de32

File tree

8 files changed

+49
-79
lines changed

8 files changed

+49
-79
lines changed

llvm/include/llvm/CodeGen/DeadMachineInstructionElim.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
namespace llvm {
1515

1616
class DeadMachineInstructionElimPass
17-
: public MachinePassInfoMixin<DeadMachineInstructionElimPass> {
17+
: public PassInfoMixin<DeadMachineInstructionElimPass> {
1818
public:
1919
PreservedAnalyses run(MachineFunction &MF,
2020
MachineFunctionAnalysisManager &MFAM);

llvm/include/llvm/CodeGen/FreeMachineFunction.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@
1313

1414
namespace llvm {
1515

16-
class FreeMachineFunctionPass
17-
: public MachinePassInfoMixin<FreeMachineFunctionPass> {
16+
class FreeMachineFunctionPass : public PassInfoMixin<FreeMachineFunctionPass> {
1817
public:
1918
PreservedAnalyses run(MachineFunction &MF,
2019
MachineFunctionAnalysisManager &MFAM);

llvm/include/llvm/CodeGen/MIRPrinter.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@ class MachineFunction;
2424
class Module;
2525
template <typename T> class SmallVectorImpl;
2626

27-
class PrintMIRPreparePass : public MachinePassInfoMixin<PrintMIRPreparePass> {
27+
class PrintMIRPreparePass : public PassInfoMixin<PrintMIRPreparePass> {
2828
raw_ostream &OS;
2929

3030
public:
3131
PrintMIRPreparePass(raw_ostream &OS = errs()) : OS(OS) {}
3232
PreservedAnalyses run(Module &M, ModuleAnalysisManager &MFAM);
3333
};
3434

35-
class PrintMIRPass : public MachinePassInfoMixin<PrintMIRPass> {
35+
class PrintMIRPass : public PassInfoMixin<PrintMIRPass> {
3636
raw_ostream &OS;
3737

3838
public:

llvm/include/llvm/CodeGen/MachinePassManager.h

Lines changed: 40 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -36,65 +36,6 @@ class MachineFunction;
3636
extern template class AnalysisManager<MachineFunction>;
3737
using MachineFunctionAnalysisManager = AnalysisManager<MachineFunction>;
3838

39-
/// A CRTP mix-in that provides informational APIs needed for machine passes.
40-
///
41-
/// This provides some boilerplate for types that are machine passes. It
42-
/// automatically mixes in \c PassInfoMixin.
43-
template <typename DerivedT>
44-
struct MachinePassInfoMixin : public PassInfoMixin<DerivedT> {
45-
protected:
46-
class PropertyChanger {
47-
MachineFunction &MF;
48-
49-
template <typename T>
50-
using has_get_required_properties_t =
51-
decltype(std::declval<T &>().getRequiredProperties());
52-
53-
template <typename T>
54-
using has_get_set_properties_t =
55-
decltype(std::declval<T &>().getSetProperties());
56-
57-
template <typename T>
58-
using has_get_cleared_properties_t =
59-
decltype(std::declval<T &>().getClearedProperties());
60-
61-
public:
62-
PropertyChanger(MachineFunction &MF) : MF(MF) {
63-
#ifndef NDEBUG
64-
if constexpr (is_detected<has_get_required_properties_t,
65-
DerivedT>::value) {
66-
auto &MFProps = MF.getProperties();
67-
auto RequiredProperties = DerivedT::getRequiredProperties();
68-
if (!MFProps.verifyRequiredProperties(RequiredProperties)) {
69-
errs() << "MachineFunctionProperties required by " << DerivedT::name()
70-
<< " pass are not met by function " << MF.getName() << ".\n"
71-
<< "Required properties: ";
72-
RequiredProperties.print(errs());
73-
errs() << "\nCurrent properties: ";
74-
MFProps.print(errs());
75-
errs() << '\n';
76-
report_fatal_error("MachineFunctionProperties check failed");
77-
}
78-
}
79-
#endif
80-
}
81-
82-
~PropertyChanger() {
83-
if constexpr (is_detected<has_get_set_properties_t, DerivedT>::value)
84-
MF.getProperties().set(DerivedT::getSetProperties());
85-
if constexpr (is_detected<has_get_cleared_properties_t, DerivedT>::value)
86-
MF.getProperties().reset(DerivedT::getClearedProperties());
87-
}
88-
};
89-
90-
public:
91-
PreservedAnalyses runImpl(MachineFunction &MF,
92-
MachineFunctionAnalysisManager &MFAM) {
93-
PropertyChanger PC(MF);
94-
return static_cast<DerivedT *>(this)->run(MF, MFAM);
95-
}
96-
};
97-
9839
namespace detail {
9940

10041
template <typename PassT>
@@ -117,8 +58,44 @@ struct MachinePassModel
11758
MachinePassModel &operator=(const MachinePassModel &) = delete;
11859
PreservedAnalyses run(MachineFunction &IR,
11960
MachineFunctionAnalysisManager &AM) override {
120-
return this->Pass.runImpl(IR, AM);
61+
#ifndef NDEBUG
62+
if constexpr (is_detected<has_get_required_properties_t, PassT>::value) {
63+
auto &MFProps = IR.getProperties();
64+
auto RequiredProperties = PassT::getRequiredProperties();
65+
if (!MFProps.verifyRequiredProperties(RequiredProperties)) {
66+
errs() << "MachineFunctionProperties required by " << PassT::name()
67+
<< " pass are not met by function " << IR.getName() << ".\n"
68+
<< "Required properties: ";
69+
RequiredProperties.print(errs());
70+
errs() << "\nCurrent properties: ";
71+
MFProps.print(errs());
72+
errs() << '\n';
73+
report_fatal_error("MachineFunctionProperties check failed");
74+
}
75+
}
76+
#endif
77+
78+
auto PA = this->Pass.run(IR, AM);
79+
80+
if constexpr (is_detected<has_get_set_properties_t, PassT>::value)
81+
IR.getProperties().set(PassT::getSetProperties());
82+
if constexpr (is_detected<has_get_cleared_properties_t, PassT>::value)
83+
IR.getProperties().reset(PassT::getClearedProperties());
84+
return PA;
12185
}
86+
87+
private:
88+
template <typename T>
89+
using has_get_required_properties_t =
90+
decltype(std::declval<T &>().getRequiredProperties());
91+
92+
template <typename T>
93+
using has_get_set_properties_t =
94+
decltype(std::declval<T &>().getSetProperties());
95+
96+
template <typename T>
97+
using has_get_cleared_properties_t =
98+
decltype(std::declval<T &>().getClearedProperties());
12299
};
123100
} // namespace detail
124101

@@ -246,20 +223,15 @@ createModuleToMachineFunctionPassAdaptor(MachineFunctionPassT &&Pass) {
246223
template <>
247224
template <typename PassT>
248225
void PassManager<MachineFunction>::addPass(PassT &&Pass) {
249-
using PassModelT =
250-
detail::PassModel<MachineFunction, PassT, MachineFunctionAnalysisManager>;
251226
using MachinePassModelT = detail::MachinePassModel<PassT>;
252227
// Do not use make_unique or emplace_back, they cause too many template
253228
// instantiations, causing terrible compile times.
254-
if constexpr (std::is_base_of_v<MachinePassInfoMixin<PassT>, PassT>) {
255-
Passes.push_back(std::unique_ptr<PassConceptT>(
256-
new MachinePassModelT(std::forward<PassT>(Pass))));
257-
} else if constexpr (std::is_same_v<PassT, PassManager<MachineFunction>>) {
229+
if constexpr (std::is_same_v<PassT, PassManager<MachineFunction>>) {
258230
for (auto &P : Pass.Passes)
259231
Passes.push_back(std::move(P));
260232
} else {
261-
Passes.push_back(std::unique_ptr<PassConceptT>(
262-
new PassModelT(std::forward<PassT>(Pass))));
233+
Passes.push_back(std::unique_ptr<MachinePassModelT>(
234+
new MachinePassModelT(std::forward<PassT>(Pass))));
263235
}
264236
}
265237

llvm/include/llvm/Passes/CodeGenPassBuilder.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,14 @@ namespace llvm {
8787
} \
8888
};
8989
#define DUMMY_MACHINE_MODULE_PASS(NAME, PASS_NAME) \
90-
struct PASS_NAME : public MachinePassInfoMixin<PASS_NAME> { \
90+
struct PASS_NAME : public PassInfoMixin<PASS_NAME> { \
9191
template <typename... Ts> PASS_NAME(Ts &&...) {} \
9292
PreservedAnalyses run(Module &, ModuleAnalysisManager &) { \
9393
return PreservedAnalyses::all(); \
9494
} \
9595
};
9696
#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME) \
97-
struct PASS_NAME : public MachinePassInfoMixin<PASS_NAME> { \
97+
struct PASS_NAME : public PassInfoMixin<PASS_NAME> { \
9898
template <typename... Ts> PASS_NAME(Ts &&...) {} \
9999
PreservedAnalyses run(MachineFunction &, \
100100
MachineFunctionAnalysisManager &) { \

llvm/include/llvm/Passes/PassBuilder.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -909,8 +909,7 @@ struct NoOpLoopPass : PassInfoMixin<NoOpLoopPass> {
909909
};
910910

911911
/// No-op machine function pass which does nothing.
912-
struct NoOpMachineFunctionPass
913-
: public MachinePassInfoMixin<NoOpMachineFunctionPass> {
912+
struct NoOpMachineFunctionPass : public PassInfoMixin<NoOpMachineFunctionPass> {
914913
PreservedAnalyses run(MachineFunction &, MachineFunctionAnalysisManager &) {
915914
return PreservedAnalyses::all();
916915
}

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ class TriggerVerifierErrorPass
368368
// A pass requires all MachineFunctionProperties.
369369
// DO NOT USE THIS EXCEPT FOR TESTING!
370370
class RequireAllMachineFunctionPropertiesPass
371-
: public MachinePassInfoMixin<RequireAllMachineFunctionPropertiesPass> {
371+
: public PassInfoMixin<RequireAllMachineFunctionPropertiesPass> {
372372
public:
373373
PreservedAnalyses run(MachineFunction &, MachineFunctionAnalysisManager &) {
374374
return PreservedAnalyses::none();

llvm/unittests/MIR/PassBuilderCallbacksTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ template <typename DerivedT> class MockAnalysisHandleBase {
233233

234234
template <typename DerivedT> class MockPassHandleBase {
235235
public:
236-
class Pass : public MachinePassInfoMixin<Pass> {
236+
class Pass : public PassInfoMixin<Pass> {
237237
friend MockPassHandleBase;
238238

239239
DerivedT *Handle;

0 commit comments

Comments
 (0)