@@ -76,6 +76,10 @@ struct MachinePassModel
76
76
#endif
77
77
78
78
auto PA = this ->Pass .run (IR, AM);
79
+ // Machine function passes are not allowed to modify the LLVM
80
+ // representation, therefore we should preserve all IR analyses.
81
+ PA.template preserveSet <AllAnalysesOn<Module>>();
82
+ PA.template preserveSet <AllAnalysesOn<Function>>();
79
83
80
84
if constexpr (is_detected<has_get_set_properties_t , PassT>::value)
81
85
IR.getProperties ().set (PassT::getSetProperties ());
@@ -108,6 +112,15 @@ bool MachineFunctionAnalysisManagerModuleProxy::Result::invalidate(
108
112
ModuleAnalysisManager::Invalidator &Inv);
109
113
extern template class InnerAnalysisManagerProxy <MachineFunctionAnalysisManager,
110
114
Module>;
115
+ using MachineFunctionAnalysisManagerFunctionProxy =
116
+ InnerAnalysisManagerProxy<MachineFunctionAnalysisManager, Function>;
117
+
118
+ template <>
119
+ bool MachineFunctionAnalysisManagerFunctionProxy::Result::invalidate (
120
+ Function &F, const PreservedAnalyses &PA,
121
+ FunctionAnalysisManager::Invalidator &Inv);
122
+ extern template class InnerAnalysisManagerProxy <MachineFunctionAnalysisManager,
123
+ Function>;
111
124
112
125
extern template class OuterAnalysisManagerProxy <ModuleAnalysisManager,
113
126
MachineFunction>;
@@ -129,16 +142,6 @@ class FunctionAnalysisManagerMachineFunctionProxy
129
142
Arg.FAM = nullptr ;
130
143
}
131
144
132
- ~Result () {
133
- // FAM is cleared in a moved from state where there is nothing to do.
134
- if (!FAM)
135
- return ;
136
-
137
- // Clear out the analysis manager if we're being destroyed -- it means we
138
- // didn't even see an invalidate call when we got invalidated.
139
- FAM->clear ();
140
- }
141
-
142
145
Result &operator =(Result &&RHS) {
143
146
FAM = RHS.FAM ;
144
147
// We have to null out the analysis manager in the moved-from state
@@ -187,18 +190,18 @@ class FunctionAnalysisManagerMachineFunctionProxy
187
190
FunctionAnalysisManager *FAM;
188
191
};
189
192
190
- class ModuleToMachineFunctionPassAdaptor
191
- : public PassInfoMixin<ModuleToMachineFunctionPassAdaptor > {
193
+ class FunctionToMachineFunctionPassAdaptor
194
+ : public PassInfoMixin<FunctionToMachineFunctionPassAdaptor > {
192
195
public:
193
196
using PassConceptT =
194
197
detail::PassConcept<MachineFunction, MachineFunctionAnalysisManager>;
195
198
196
- explicit ModuleToMachineFunctionPassAdaptor (
199
+ explicit FunctionToMachineFunctionPassAdaptor (
197
200
std::unique_ptr<PassConceptT> Pass)
198
201
: Pass(std::move(Pass)) {}
199
202
200
- // / Runs the function pass across every function in the module .
201
- PreservedAnalyses run (Module &M, ModuleAnalysisManager &AM );
203
+ // / Runs the function pass across every function in the function .
204
+ PreservedAnalyses run (Function &F, FunctionAnalysisManager &FAM );
202
205
void printPipeline (raw_ostream &OS,
203
206
function_ref<StringRef(StringRef)> MapClassName2PassName);
204
207
@@ -209,14 +212,14 @@ class ModuleToMachineFunctionPassAdaptor
209
212
};
210
213
211
214
template <typename MachineFunctionPassT>
212
- ModuleToMachineFunctionPassAdaptor
213
- createModuleToMachineFunctionPassAdaptor (MachineFunctionPassT &&Pass) {
215
+ FunctionToMachineFunctionPassAdaptor
216
+ createFunctionToMachineFunctionPassAdaptor (MachineFunctionPassT &&Pass) {
214
217
using PassModelT = detail::PassModel<MachineFunction, MachineFunctionPassT,
215
218
MachineFunctionAnalysisManager>;
216
219
// Do not use make_unique, it causes too many template instantiations,
217
220
// causing terrible compile times.
218
- return ModuleToMachineFunctionPassAdaptor (
219
- std::unique_ptr<ModuleToMachineFunctionPassAdaptor ::PassConceptT>(
221
+ return FunctionToMachineFunctionPassAdaptor (
222
+ std::unique_ptr<FunctionToMachineFunctionPassAdaptor ::PassConceptT>(
220
223
new PassModelT (std::forward<MachineFunctionPassT>(Pass))));
221
224
}
222
225
0 commit comments