@@ -36,65 +36,6 @@ class MachineFunction;
36
36
extern template class AnalysisManager <MachineFunction>;
37
37
using MachineFunctionAnalysisManager = AnalysisManager<MachineFunction>;
38
38
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
-
98
39
namespace detail {
99
40
100
41
template <typename PassT>
@@ -117,8 +58,44 @@ struct MachinePassModel
117
58
MachinePassModel &operator =(const MachinePassModel &) = delete ;
118
59
PreservedAnalyses run (MachineFunction &IR,
119
60
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;
121
85
}
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());
122
99
};
123
100
} // namespace detail
124
101
@@ -246,20 +223,15 @@ createModuleToMachineFunctionPassAdaptor(MachineFunctionPassT &&Pass) {
246
223
template <>
247
224
template <typename PassT>
248
225
void PassManager<MachineFunction>::addPass(PassT &&Pass) {
249
- using PassModelT =
250
- detail::PassModel<MachineFunction, PassT, MachineFunctionAnalysisManager>;
251
226
using MachinePassModelT = detail::MachinePassModel<PassT>;
252
227
// Do not use make_unique or emplace_back, they cause too many template
253
228
// 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>>) {
258
230
for (auto &P : Pass.Passes )
259
231
Passes.push_back (std::move (P));
260
232
} 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))));
263
235
}
264
236
}
265
237
0 commit comments