@@ -44,99 +44,16 @@ using MachineFunctionAnalysisManager = AnalysisManager<MachineFunction>;
44
44
// / automatically mixes in \c PassInfoMixin.
45
45
template <typename DerivedT>
46
46
struct MachinePassInfoMixin : public PassInfoMixin <DerivedT> {
47
- // TODO: Add MachineFunctionProperties support.
48
- };
49
-
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
- };
57
-
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)) {}
64
-
65
- friend void swap (MachinePassModel &LHS, MachinePassModel &RHS) {
66
- using std::swap;
67
- swap (LHS.Pass , RHS.Pass );
68
- }
69
-
70
- MachinePassModel &operator =(MachinePassModel RHS) {
71
- swap (*this , RHS);
72
- return *this ;
73
- }
74
-
75
- MachinePassModel &operator =(const MachinePassModel &) = delete ;
76
- PreservedAnalyses run (MachineFunction &IR,
77
- MachineFunctionAnalysisManager &AM) override {
78
- return Pass.run (IR, AM);
79
- }
47
+ class PropertyChanger {
48
+ MachineFunction &MF;
80
49
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 ();
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
- }
50
+ template <typename T>
51
+ using has_get_required_properties_t =
52
+ decltype (std::declval<T &>().getRequiredProperties());
121
53
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
- }
54
+ template <typename T>
55
+ using has_get_set_properties_t =
56
+ decltype (std::declval<T &>().getSetProperties());
140
57
141
58
template <typename T>
142
59
using has_get_cleared_properties_t =
@@ -177,6 +94,40 @@ template <typename PassT> struct MachinePassModel : MachinePassConcept {
177
94
return static_cast <DerivedT *>(this )->run (MF, MFAM);
178
95
}
179
96
};
97
+
98
+ namespace detail {
99
+
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)) {}
106
+ // We have to explicitly define all the special member functions because MSVC
107
+ // refuses to generate them.
108
+ MachinePassModel (const MachinePassModel &Arg)
109
+ : PassModel<MachineFunction, PassT, MachineFunctionAnalysisManager>(
110
+ Arg.Pass) {}
111
+ MachinePassModel (MachinePassModel &&Arg)
112
+ : PassModel<MachineFunction, PassT, MachineFunctionAnalysisManager>(
113
+ std::move (Arg.Pass)) {}
114
+
115
+ friend void swap (MachinePassModel &LHS, MachinePassModel &RHS) {
116
+ using std::swap;
117
+ swap (LHS.Pass , RHS.Pass );
118
+ }
119
+
120
+ MachinePassModel &operator =(MachinePassModel RHS) {
121
+ swap (*this , RHS);
122
+ return *this ;
123
+ }
124
+
125
+ MachinePassModel &operator =(const MachinePassModel &) = delete;
126
+ PreservedAnalyses run (MachineFunction &IR,
127
+ MachineFunctionAnalysisManager &AM) override {
128
+ return this ->Pass .MachinePassInfoMixin <PassT>::run (IR, AM);
129
+ }
130
+ };
180
131
} // namespace detail
181
132
182
133
using MachineFunctionAnalysisManagerModuleProxy =
@@ -269,11 +220,12 @@ class FunctionAnalysisManagerMachineFunctionProxy
269
220
270
221
class ModuleToMachineFunctionPassAdaptor
271
222
: public PassInfoMixin<ModuleToMachineFunctionPassAdaptor> {
272
- using MachinePassConcept = detail::MachinePassConcept;
273
-
274
223
public:
224
+ using PassConceptT =
225
+ detail::PassConcept<MachineFunction, MachineFunctionAnalysisManager>;
226
+
275
227
explicit ModuleToMachineFunctionPassAdaptor (
276
- std::unique_ptr<MachinePassConcept > Pass)
228
+ std::unique_ptr<PassConceptT > Pass)
277
229
: Pass(std::move(Pass)) {}
278
230
279
231
// / Runs the function pass across every function in the module.
@@ -284,17 +236,18 @@ class ModuleToMachineFunctionPassAdaptor
284
236
static bool isRequired () { return true ; }
285
237
286
238
private:
287
- std::unique_ptr<MachinePassConcept > Pass;
239
+ std::unique_ptr<PassConceptT > Pass;
288
240
};
289
241
290
242
template <typename MachineFunctionPassT>
291
243
ModuleToMachineFunctionPassAdaptor
292
244
createModuleToMachineFunctionPassAdaptor (MachineFunctionPassT &&Pass) {
293
- using PassModelT = detail::MachinePassModel<MachineFunctionPassT>;
245
+ using PassModelT = detail::PassModel<MachineFunction, MachineFunctionPassT,
246
+ MachineFunctionAnalysisManager>;
294
247
// Do not use make_unique, it causes too many template instantiations,
295
248
// causing terrible compile times.
296
249
return ModuleToMachineFunctionPassAdaptor (
297
- std::unique_ptr<detail::MachinePassConcept >(
250
+ std::unique_ptr<ModuleToMachineFunctionPassAdaptor::PassConceptT >(
298
251
new PassModelT (std::forward<MachineFunctionPassT>(Pass))));
299
252
}
300
253
@@ -304,15 +257,11 @@ std::enable_if_t<!std::is_same<PassT, PassManager<MachineFunction>>::value>
304
257
PassManager<MachineFunction>::addPass (PassT &&Pass) {
305
258
using PassModelT =
306
259
detail::PassModel<MachineFunction, PassT, MachineFunctionAnalysisManager>;
307
- using MachineFunctionPassModelT =
308
- detail::PassModel<MachineFunction, MachinePassInfoMixin<PassT>,
309
- MachineFunctionAnalysisManager>;
310
260
// Do not use make_unique or emplace_back, they cause too many template
311
261
// instantiations, causing terrible compile times.
312
262
if constexpr (std::is_base_of_v<MachinePassInfoMixin<PassT>, PassT>) {
313
- Passes.push_back (
314
- std::unique_ptr<PassConceptT>(new MachineFunctionPassModelT (
315
- std::forward<MachinePassInfoMixin<PassT>>(Pass))));
263
+ Passes.push_back (std::unique_ptr<PassConceptT>(
264
+ new detail::MachinePassModel<PassT>(std::forward<PassT>(Pass))));
316
265
} else {
317
266
Passes.push_back (std::unique_ptr<PassConceptT>(
318
267
new PassModelT (std::forward<PassT>(Pass))));
0 commit comments