16
16
// their respective analysis managers such as ModuleAnalysisManager and
17
17
// FunctionAnalysisManager.
18
18
//
19
+ // TODO: Add MachineFunctionProperties support.
20
+ //
19
21
// ===----------------------------------------------------------------------===//
20
22
21
23
#ifndef LLVM_CODEGEN_MACHINEPASSMANAGER_H
@@ -42,67 +44,23 @@ using MachineFunctionAnalysisManager = AnalysisManager<MachineFunction>;
42
44
// / automatically mixes in \c PassInfoMixin.
43
45
template <typename DerivedT>
44
46
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
- }
47
+ // TODO: Add MachineFunctionProperties support.
96
48
};
97
49
98
50
namespace detail {
51
+ struct MachinePassConcept
52
+ : PassConcept<MachineFunction, MachineFunctionAnalysisManager> {
53
+ virtual MachineFunctionProperties getRequiredProperties () const = 0;
54
+ virtual MachineFunctionProperties getSetProperties () const = 0;
55
+ virtual MachineFunctionProperties getClearedProperties () const = 0;
56
+ };
99
57
100
- template <typename PassT>
101
- struct MachinePassModel
102
- : PassModel<MachineFunction, PassT, MachineFunctionAnalysisManager> {
103
- explicit MachinePassModel (PassT &&Pass)
104
- : PassModel<MachineFunction, PassT, MachineFunctionAnalysisManager>(
105
- std::move (Pass)) {}
58
+ template <typename PassT> struct MachinePassModel : MachinePassConcept {
59
+ explicit MachinePassModel (PassT &&Pass) : Pass(std::move(Pass)) {}
60
+ // We have to explicitly define all the special member functions because MSVC
61
+ // refuses to generate them.
62
+ MachinePassModel ( const MachinePassModel &Arg) : Pass(Arg.Pass) {}
63
+ MachinePassModel (MachinePassModel &&Arg) : Pass( std::move(Arg. Pass)) {}
106
64
107
65
friend void swap (MachinePassModel &LHS, MachinePassModel &RHS) {
108
66
using std::swap;
@@ -117,8 +75,89 @@ struct MachinePassModel
117
75
MachinePassModel &operator =(const MachinePassModel &) = delete ;
118
76
PreservedAnalyses run (MachineFunction &IR,
119
77
MachineFunctionAnalysisManager &AM) override {
120
- return this ->Pass .runImpl (IR, AM);
78
+ return Pass.run (IR, AM);
79
+ }
80
+
81
+ void printPipeline (
82
+ raw_ostream &OS,
83
+ function_ref<StringRef(StringRef)> MapClassName2PassName) override {
84
+ Pass.printPipeline (OS, MapClassName2PassName);
85
+ }
86
+
87
+ StringRef name () const override { return PassT::name (); }
88
+
89
+ template <typename T>
90
+ using has_required_t = decltype (std::declval<T &>().isRequired());
91
+ template <typename T>
92
+ static std::enable_if_t <is_detected<has_required_t , T>::value, bool >
93
+ passIsRequiredImpl () {
94
+ return T::isRequired ();
121
95
}
96
+ template <typename T>
97
+ static std::enable_if_t <!is_detected<has_required_t , T>::value, bool >
98
+ passIsRequiredImpl () {
99
+ return false ;
100
+ }
101
+ bool isRequired () const override { return passIsRequiredImpl<PassT>(); }
102
+
103
+ template <typename T>
104
+ using has_get_required_properties_t =
105
+ decltype (std::declval<T &>().getRequiredProperties());
106
+ template <typename T>
107
+ static std::enable_if_t <is_detected<has_get_required_properties_t , T>::value,
108
+ MachineFunctionProperties>
109
+ getRequiredPropertiesImpl () {
110
+ return PassT::getRequiredProperties ();
111
+ }
112
+ template <typename T>
113
+ static std::enable_if_t <!is_detected<has_get_required_properties_t , T>::value,
114
+ MachineFunctionProperties>
115
+ getRequiredPropertiesImpl () {
116
+ return MachineFunctionProperties ();
117
+ }
118
+ MachineFunctionProperties getRequiredProperties () const override {
119
+ return getRequiredPropertiesImpl<PassT>();
120
+ }
121
+
122
+ template <typename T>
123
+ using has_get_set_properties_t =
124
+ decltype (std::declval<T &>().getSetProperties());
125
+ template <typename T>
126
+ static std::enable_if_t <is_detected<has_get_set_properties_t , T>::value,
127
+ MachineFunctionProperties>
128
+ getSetPropertiesImpl () {
129
+ return PassT::getSetProperties ();
130
+ }
131
+ template <typename T>
132
+ static std::enable_if_t <!is_detected<has_get_set_properties_t , T>::value,
133
+ MachineFunctionProperties>
134
+ getSetPropertiesImpl () {
135
+ return MachineFunctionProperties ();
136
+ }
137
+ MachineFunctionProperties getSetProperties () const override {
138
+ return getSetPropertiesImpl<PassT>();
139
+ }
140
+
141
+ template <typename T>
142
+ using has_get_cleared_properties_t =
143
+ decltype (std::declval<T &>().getClearedProperties());
144
+ template <typename T>
145
+ static std::enable_if_t <is_detected<has_get_cleared_properties_t , T>::value,
146
+ MachineFunctionProperties>
147
+ getClearedPropertiesImpl () {
148
+ return PassT::getClearedProperties ();
149
+ }
150
+ template <typename T>
151
+ static std::enable_if_t <!is_detected<has_get_cleared_properties_t , T>::value,
152
+ MachineFunctionProperties>
153
+ getClearedPropertiesImpl () {
154
+ return MachineFunctionProperties ();
155
+ }
156
+ MachineFunctionProperties getClearedProperties () const override {
157
+ return getClearedPropertiesImpl<PassT>();
158
+ }
159
+
160
+ PassT Pass;
122
161
};
123
162
} // namespace detail
124
163
@@ -212,12 +251,11 @@ class FunctionAnalysisManagerMachineFunctionProxy
212
251
213
252
class ModuleToMachineFunctionPassAdaptor
214
253
: public PassInfoMixin<ModuleToMachineFunctionPassAdaptor> {
215
- public:
216
- using PassConceptT =
217
- detail::PassConcept<MachineFunction, MachineFunctionAnalysisManager>;
254
+ using MachinePassConcept = detail::MachinePassConcept;
218
255
256
+ public:
219
257
explicit ModuleToMachineFunctionPassAdaptor (
220
- std::unique_ptr<PassConceptT > Pass)
258
+ std::unique_ptr<MachinePassConcept > Pass)
221
259
: Pass(std::move(Pass)) {}
222
260
223
261
// / Runs the function pass across every function in the module.
@@ -228,39 +266,20 @@ class ModuleToMachineFunctionPassAdaptor
228
266
static bool isRequired () { return true ; }
229
267
230
268
private:
231
- std::unique_ptr<PassConceptT > Pass;
269
+ std::unique_ptr<MachinePassConcept > Pass;
232
270
};
233
271
234
272
template <typename MachineFunctionPassT>
235
273
ModuleToMachineFunctionPassAdaptor
236
274
createModuleToMachineFunctionPassAdaptor (MachineFunctionPassT &&Pass) {
237
- using PassModelT = detail::PassModel<MachineFunction, MachineFunctionPassT,
238
- MachineFunctionAnalysisManager>;
275
+ using PassModelT = detail::MachinePassModel<MachineFunctionPassT>;
239
276
// Do not use make_unique, it causes too many template instantiations,
240
277
// causing terrible compile times.
241
278
return ModuleToMachineFunctionPassAdaptor (
242
- std::unique_ptr<ModuleToMachineFunctionPassAdaptor::PassConceptT >(
279
+ std::unique_ptr<detail::MachinePassConcept >(
243
280
new PassModelT (std::forward<MachineFunctionPassT>(Pass))));
244
281
}
245
282
246
- template <>
247
- template <typename PassT>
248
- std::enable_if_t <!std::is_same<PassT, PassManager<MachineFunction>>::value>
249
- PassManager<MachineFunction>::addPass(PassT &&Pass) {
250
- using PassModelT =
251
- detail::PassModel<MachineFunction, PassT, MachineFunctionAnalysisManager>;
252
- using MachinePassModelT = detail::MachinePassModel<PassT>;
253
- // Do not use make_unique or emplace_back, they cause too many template
254
- // instantiations, causing terrible compile times.
255
- if constexpr (std::is_base_of_v<MachinePassInfoMixin<PassT>, PassT>) {
256
- Passes.push_back (std::unique_ptr<PassConceptT>(
257
- new MachinePassModelT (std::forward<PassT>(Pass))));
258
- } else {
259
- Passes.push_back (std::unique_ptr<PassConceptT>(
260
- new PassModelT (std::forward<PassT>(Pass))));
261
- }
262
- }
263
-
264
283
template <>
265
284
PreservedAnalyses
266
285
PassManager<MachineFunction>::run(MachineFunction &,
0 commit comments