[llvm] 496de32 - [NewPM] Remove `MachinePassInfoMixin` (#88243)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 11 04:13:10 PDT 2024
Author: paperchalice
Date: 2024-04-11T19:13:06+08:00
New Revision: 496de32ee2c34880c7d3396bbd09e45d5d5c8a9e
URL: https://github.com/llvm/llvm-project/commit/496de32ee2c34880c7d3396bbd09e45d5d5c8a9e
DIFF: https://github.com/llvm/llvm-project/commit/496de32ee2c34880c7d3396bbd09e45d5d5c8a9e.diff
LOG: [NewPM] Remove `MachinePassInfoMixin` (#88243)
Unify the inheritance paths of IR and machine function.
Added:
Modified:
llvm/include/llvm/CodeGen/DeadMachineInstructionElim.h
llvm/include/llvm/CodeGen/FreeMachineFunction.h
llvm/include/llvm/CodeGen/MIRPrinter.h
llvm/include/llvm/CodeGen/MachinePassManager.h
llvm/include/llvm/Passes/CodeGenPassBuilder.h
llvm/include/llvm/Passes/PassBuilder.h
llvm/lib/Passes/PassBuilder.cpp
llvm/unittests/MIR/PassBuilderCallbacksTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/CodeGen/DeadMachineInstructionElim.h b/llvm/include/llvm/CodeGen/DeadMachineInstructionElim.h
index b9fe7cfccf9a39..56cfa1e087181a 100644
--- a/llvm/include/llvm/CodeGen/DeadMachineInstructionElim.h
+++ b/llvm/include/llvm/CodeGen/DeadMachineInstructionElim.h
@@ -14,7 +14,7 @@
namespace llvm {
class DeadMachineInstructionElimPass
- : public MachinePassInfoMixin<DeadMachineInstructionElimPass> {
+ : public PassInfoMixin<DeadMachineInstructionElimPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
diff --git a/llvm/include/llvm/CodeGen/FreeMachineFunction.h b/llvm/include/llvm/CodeGen/FreeMachineFunction.h
index 77b76c591201a7..5f21c6720350bc 100644
--- a/llvm/include/llvm/CodeGen/FreeMachineFunction.h
+++ b/llvm/include/llvm/CodeGen/FreeMachineFunction.h
@@ -13,8 +13,7 @@
namespace llvm {
-class FreeMachineFunctionPass
- : public MachinePassInfoMixin<FreeMachineFunctionPass> {
+class FreeMachineFunctionPass : public PassInfoMixin<FreeMachineFunctionPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
diff --git a/llvm/include/llvm/CodeGen/MIRPrinter.h b/llvm/include/llvm/CodeGen/MIRPrinter.h
index daa0d7e2691f1b..d0a11e1c4a2fde 100644
--- a/llvm/include/llvm/CodeGen/MIRPrinter.h
+++ b/llvm/include/llvm/CodeGen/MIRPrinter.h
@@ -24,7 +24,7 @@ class MachineFunction;
class Module;
template <typename T> class SmallVectorImpl;
-class PrintMIRPreparePass : public MachinePassInfoMixin<PrintMIRPreparePass> {
+class PrintMIRPreparePass : public PassInfoMixin<PrintMIRPreparePass> {
raw_ostream &OS;
public:
@@ -32,7 +32,7 @@ class PrintMIRPreparePass : public MachinePassInfoMixin<PrintMIRPreparePass> {
PreservedAnalyses run(Module &M, ModuleAnalysisManager &MFAM);
};
-class PrintMIRPass : public MachinePassInfoMixin<PrintMIRPass> {
+class PrintMIRPass : public PassInfoMixin<PrintMIRPass> {
raw_ostream &OS;
public:
diff --git a/llvm/include/llvm/CodeGen/MachinePassManager.h b/llvm/include/llvm/CodeGen/MachinePassManager.h
index 8689fd19030f90..4f0b6ba2b1e738 100644
--- a/llvm/include/llvm/CodeGen/MachinePassManager.h
+++ b/llvm/include/llvm/CodeGen/MachinePassManager.h
@@ -36,65 +36,6 @@ class MachineFunction;
extern template class AnalysisManager<MachineFunction>;
using MachineFunctionAnalysisManager = AnalysisManager<MachineFunction>;
-/// A CRTP mix-in that provides informational APIs needed for machine passes.
-///
-/// This provides some boilerplate for types that are machine passes. It
-/// automatically mixes in \c PassInfoMixin.
-template <typename DerivedT>
-struct MachinePassInfoMixin : public PassInfoMixin<DerivedT> {
-protected:
- class PropertyChanger {
- MachineFunction &MF;
-
- template <typename T>
- using has_get_required_properties_t =
- decltype(std::declval<T &>().getRequiredProperties());
-
- template <typename T>
- using has_get_set_properties_t =
- decltype(std::declval<T &>().getSetProperties());
-
- template <typename T>
- using has_get_cleared_properties_t =
- decltype(std::declval<T &>().getClearedProperties());
-
- public:
- PropertyChanger(MachineFunction &MF) : MF(MF) {
-#ifndef NDEBUG
- if constexpr (is_detected<has_get_required_properties_t,
- DerivedT>::value) {
- auto &MFProps = MF.getProperties();
- auto RequiredProperties = DerivedT::getRequiredProperties();
- if (!MFProps.verifyRequiredProperties(RequiredProperties)) {
- errs() << "MachineFunctionProperties required by " << DerivedT::name()
- << " pass are not met by function " << MF.getName() << ".\n"
- << "Required properties: ";
- RequiredProperties.print(errs());
- errs() << "\nCurrent properties: ";
- MFProps.print(errs());
- errs() << '\n';
- report_fatal_error("MachineFunctionProperties check failed");
- }
- }
-#endif
- }
-
- ~PropertyChanger() {
- if constexpr (is_detected<has_get_set_properties_t, DerivedT>::value)
- MF.getProperties().set(DerivedT::getSetProperties());
- if constexpr (is_detected<has_get_cleared_properties_t, DerivedT>::value)
- MF.getProperties().reset(DerivedT::getClearedProperties());
- }
- };
-
-public:
- PreservedAnalyses runImpl(MachineFunction &MF,
- MachineFunctionAnalysisManager &MFAM) {
- PropertyChanger PC(MF);
- return static_cast<DerivedT *>(this)->run(MF, MFAM);
- }
-};
-
namespace detail {
template <typename PassT>
@@ -117,8 +58,44 @@ struct MachinePassModel
MachinePassModel &operator=(const MachinePassModel &) = delete;
PreservedAnalyses run(MachineFunction &IR,
MachineFunctionAnalysisManager &AM) override {
- return this->Pass.runImpl(IR, AM);
+#ifndef NDEBUG
+ if constexpr (is_detected<has_get_required_properties_t, PassT>::value) {
+ auto &MFProps = IR.getProperties();
+ auto RequiredProperties = PassT::getRequiredProperties();
+ if (!MFProps.verifyRequiredProperties(RequiredProperties)) {
+ errs() << "MachineFunctionProperties required by " << PassT::name()
+ << " pass are not met by function " << IR.getName() << ".\n"
+ << "Required properties: ";
+ RequiredProperties.print(errs());
+ errs() << "\nCurrent properties: ";
+ MFProps.print(errs());
+ errs() << '\n';
+ report_fatal_error("MachineFunctionProperties check failed");
+ }
+ }
+#endif
+
+ auto PA = this->Pass.run(IR, AM);
+
+ if constexpr (is_detected<has_get_set_properties_t, PassT>::value)
+ IR.getProperties().set(PassT::getSetProperties());
+ if constexpr (is_detected<has_get_cleared_properties_t, PassT>::value)
+ IR.getProperties().reset(PassT::getClearedProperties());
+ return PA;
}
+
+private:
+ template <typename T>
+ using has_get_required_properties_t =
+ decltype(std::declval<T &>().getRequiredProperties());
+
+ template <typename T>
+ using has_get_set_properties_t =
+ decltype(std::declval<T &>().getSetProperties());
+
+ template <typename T>
+ using has_get_cleared_properties_t =
+ decltype(std::declval<T &>().getClearedProperties());
};
} // namespace detail
@@ -246,20 +223,15 @@ createModuleToMachineFunctionPassAdaptor(MachineFunctionPassT &&Pass) {
template <>
template <typename PassT>
void PassManager<MachineFunction>::addPass(PassT &&Pass) {
- using PassModelT =
- detail::PassModel<MachineFunction, PassT, MachineFunctionAnalysisManager>;
using MachinePassModelT = detail::MachinePassModel<PassT>;
// Do not use make_unique or emplace_back, they cause too many template
// instantiations, causing terrible compile times.
- if constexpr (std::is_base_of_v<MachinePassInfoMixin<PassT>, PassT>) {
- Passes.push_back(std::unique_ptr<PassConceptT>(
- new MachinePassModelT(std::forward<PassT>(Pass))));
- } else if constexpr (std::is_same_v<PassT, PassManager<MachineFunction>>) {
+ if constexpr (std::is_same_v<PassT, PassManager<MachineFunction>>) {
for (auto &P : Pass.Passes)
Passes.push_back(std::move(P));
} else {
- Passes.push_back(std::unique_ptr<PassConceptT>(
- new PassModelT(std::forward<PassT>(Pass))));
+ Passes.push_back(std::unique_ptr<MachinePassModelT>(
+ new MachinePassModelT(std::forward<PassT>(Pass))));
}
}
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
index ab231dbbb6a68c..ed5d8affa79380 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -87,14 +87,14 @@ namespace llvm {
} \
};
#define DUMMY_MACHINE_MODULE_PASS(NAME, PASS_NAME) \
- struct PASS_NAME : public MachinePassInfoMixin<PASS_NAME> { \
+ struct PASS_NAME : public PassInfoMixin<PASS_NAME> { \
template <typename... Ts> PASS_NAME(Ts &&...) {} \
PreservedAnalyses run(Module &, ModuleAnalysisManager &) { \
return PreservedAnalyses::all(); \
} \
};
#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME) \
- struct PASS_NAME : public MachinePassInfoMixin<PASS_NAME> { \
+ struct PASS_NAME : public PassInfoMixin<PASS_NAME> { \
template <typename... Ts> PASS_NAME(Ts &&...) {} \
PreservedAnalyses run(MachineFunction &, \
MachineFunctionAnalysisManager &) { \
diff --git a/llvm/include/llvm/Passes/PassBuilder.h b/llvm/include/llvm/Passes/PassBuilder.h
index d1232124d5d819..c8f643452bb158 100644
--- a/llvm/include/llvm/Passes/PassBuilder.h
+++ b/llvm/include/llvm/Passes/PassBuilder.h
@@ -909,8 +909,7 @@ struct NoOpLoopPass : PassInfoMixin<NoOpLoopPass> {
};
/// No-op machine function pass which does nothing.
-struct NoOpMachineFunctionPass
- : public MachinePassInfoMixin<NoOpMachineFunctionPass> {
+struct NoOpMachineFunctionPass : public PassInfoMixin<NoOpMachineFunctionPass> {
PreservedAnalyses run(MachineFunction &, MachineFunctionAnalysisManager &) {
return PreservedAnalyses::all();
}
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index 832ee352205a04..8d408ca2363a98 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -368,7 +368,7 @@ class TriggerVerifierErrorPass
// A pass requires all MachineFunctionProperties.
// DO NOT USE THIS EXCEPT FOR TESTING!
class RequireAllMachineFunctionPropertiesPass
- : public MachinePassInfoMixin<RequireAllMachineFunctionPropertiesPass> {
+ : public PassInfoMixin<RequireAllMachineFunctionPropertiesPass> {
public:
PreservedAnalyses run(MachineFunction &, MachineFunctionAnalysisManager &) {
return PreservedAnalyses::none();
diff --git a/llvm/unittests/MIR/PassBuilderCallbacksTest.cpp b/llvm/unittests/MIR/PassBuilderCallbacksTest.cpp
index 8e3738dc919209..6fd4e54a929f40 100644
--- a/llvm/unittests/MIR/PassBuilderCallbacksTest.cpp
+++ b/llvm/unittests/MIR/PassBuilderCallbacksTest.cpp
@@ -233,7 +233,7 @@ template <typename DerivedT> class MockAnalysisHandleBase {
template <typename DerivedT> class MockPassHandleBase {
public:
- class Pass : public MachinePassInfoMixin<Pass> {
+ class Pass : public PassInfoMixin<Pass> {
friend MockPassHandleBase;
DerivedT *Handle;
More information about the llvm-commits
mailing list