@@ -36,65 +36,6 @@ class MachineFunction;
3636extern template class AnalysisManager <MachineFunction>;
3737using 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 () << " \n Current 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-
9839namespace detail {
9940
10041template <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 () << " \n Current 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) {
246223template <>
247224template <typename PassT>
248225void 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
0 commit comments