Skip to content

Commit beae3d0

Browse files
committed
another method
1 parent fff4338 commit beae3d0

File tree

5 files changed

+59
-133
lines changed

5 files changed

+59
-133
lines changed

llvm/include/llvm/CodeGen/MachinePassManager.h

Lines changed: 52 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -44,99 +44,16 @@ using MachineFunctionAnalysisManager = AnalysisManager<MachineFunction>;
4444
/// automatically mixes in \c PassInfoMixin.
4545
template <typename DerivedT>
4646
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;
8049

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());
12153

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());
14057

14158
template <typename T>
14259
using has_get_cleared_properties_t =
@@ -177,6 +94,40 @@ template <typename PassT> struct MachinePassModel : MachinePassConcept {
17794
return static_cast<DerivedT *>(this)->run(MF, MFAM);
17895
}
17996
};
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+
};
180131
} // namespace detail
181132

182133
using MachineFunctionAnalysisManagerModuleProxy =
@@ -269,11 +220,12 @@ class FunctionAnalysisManagerMachineFunctionProxy
269220

270221
class ModuleToMachineFunctionPassAdaptor
271222
: public PassInfoMixin<ModuleToMachineFunctionPassAdaptor> {
272-
using MachinePassConcept = detail::MachinePassConcept;
273-
274223
public:
224+
using PassConceptT =
225+
detail::PassConcept<MachineFunction, MachineFunctionAnalysisManager>;
226+
275227
explicit ModuleToMachineFunctionPassAdaptor(
276-
std::unique_ptr<MachinePassConcept> Pass)
228+
std::unique_ptr<PassConceptT> Pass)
277229
: Pass(std::move(Pass)) {}
278230

279231
/// Runs the function pass across every function in the module.
@@ -284,17 +236,18 @@ class ModuleToMachineFunctionPassAdaptor
284236
static bool isRequired() { return true; }
285237

286238
private:
287-
std::unique_ptr<MachinePassConcept> Pass;
239+
std::unique_ptr<PassConceptT> Pass;
288240
};
289241

290242
template <typename MachineFunctionPassT>
291243
ModuleToMachineFunctionPassAdaptor
292244
createModuleToMachineFunctionPassAdaptor(MachineFunctionPassT &&Pass) {
293-
using PassModelT = detail::MachinePassModel<MachineFunctionPassT>;
245+
using PassModelT = detail::PassModel<MachineFunction, MachineFunctionPassT,
246+
MachineFunctionAnalysisManager>;
294247
// Do not use make_unique, it causes too many template instantiations,
295248
// causing terrible compile times.
296249
return ModuleToMachineFunctionPassAdaptor(
297-
std::unique_ptr<detail::MachinePassConcept>(
250+
std::unique_ptr<ModuleToMachineFunctionPassAdaptor::PassConceptT>(
298251
new PassModelT(std::forward<MachineFunctionPassT>(Pass))));
299252
}
300253

@@ -304,15 +257,11 @@ std::enable_if_t<!std::is_same<PassT, PassManager<MachineFunction>>::value>
304257
PassManager<MachineFunction>::addPass(PassT &&Pass) {
305258
using PassModelT =
306259
detail::PassModel<MachineFunction, PassT, MachineFunctionAnalysisManager>;
307-
using MachineFunctionPassModelT =
308-
detail::PassModel<MachineFunction, MachinePassInfoMixin<PassT>,
309-
MachineFunctionAnalysisManager>;
310260
// Do not use make_unique or emplace_back, they cause too many template
311261
// instantiations, causing terrible compile times.
312262
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))));
316265
} else {
317266
Passes.push_back(std::unique_ptr<PassConceptT>(
318267
new PassModelT(std::forward<PassT>(Pass))));

llvm/include/llvm/IR/PassManager.h

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,6 @@ extern llvm::cl::opt<bool> UseNewDbgInfoFormat;
6464

6565
namespace llvm {
6666

67-
class MachineFunction;
68-
6967
// RemoveDIs: Provide facilities for converting debug-info from one form to
7068
// another, which are no-ops for everything but modules.
7169
template <class IRUnitT> inline bool shouldConvertDbgInfo(IRUnitT &IR) {
@@ -273,10 +271,8 @@ class PassManager : public PassInfoMixin<
273271
LLVM_ATTRIBUTE_MINSIZE
274272
std::enable_if_t<!std::is_same<PassT, PassManager>::value>
275273
addPass(PassT &&Pass) {
276-
using PassModelT = std::conditional_t<
277-
std::is_same_v<IRUnitT, MachineFunction>,
278-
detail::MachinePassModel<PassT>,
279-
detail::PassModel<IRUnitT, PassT, AnalysisManagerT, ExtraArgTs...>>;
274+
using PassModelT =
275+
detail::PassModel<IRUnitT, PassT, AnalysisManagerT, ExtraArgTs...>;
280276
// Do not use make_unique or emplace_back, they cause too many template
281277
// instantiations, causing terrible compile times.
282278
Passes.push_back(std::unique_ptr<PassConceptT>(
@@ -302,9 +298,8 @@ class PassManager : public PassInfoMixin<
302298
static bool isRequired() { return true; }
303299

304300
protected:
305-
using PassConceptT = std::conditional_t<
306-
std::is_same_v<IRUnitT, MachineFunction>, detail::MachinePassConcept,
307-
detail::PassConcept<IRUnitT, AnalysisManagerT, ExtraArgTs...>>;
301+
using PassConceptT =
302+
detail::PassConcept<IRUnitT, AnalysisManagerT, ExtraArgTs...>;
308303

309304
std::vector<std::unique_ptr<PassConceptT>> Passes;
310305
};

llvm/include/llvm/IR/PassManagerInternal.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -328,9 +328,6 @@ struct AnalysisPassModel
328328
PassT Pass;
329329
};
330330

331-
struct MachinePassConcept;
332-
template <typename PassT> struct MachinePassModel;
333-
334331
} // end namespace detail
335332

336333
} // end namespace llvm

llvm/lib/CodeGen/MachinePassManager.cpp

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -121,27 +121,11 @@ PassManager<MachineFunction>::run(MachineFunction &MF,
121121
for (auto &Pass : Passes) {
122122
if (!PI.runBeforePass<MachineFunction>(*Pass, MF))
123123
continue;
124-
auto &MFProps = MF.getProperties();
125-
#ifndef NDEBUG
126-
auto RequiredProperties = Pass->getRequiredProperties();
127-
if (!MFProps.verifyRequiredProperties(RequiredProperties)) {
128-
errs() << "MachineFunctionProperties required by " << Pass->name()
129-
<< " pass are not met by function " << F.getName() << ".\n"
130-
<< "Required properties: ";
131-
RequiredProperties.print(errs());
132-
errs() << "\nCurrent properties: ";
133-
MFProps.print(errs());
134-
errs() << '\n';
135-
report_fatal_error("MachineFunctionProperties check failed");
136-
}
137-
#endif
138124

139125
PreservedAnalyses PassPA = Pass->run(MF, MFAM);
140126
if (MMI.getMachineFunction(F)) {
141127
MFAM.invalidate(MF, PassPA);
142128
PI.runAfterPass(*Pass, MF, PassPA);
143-
MFProps.set(Pass->getSetProperties());
144-
MFProps.reset(Pass->getClearedProperties());
145129
} else {
146130
MFAM.clear(MF, F.getName());
147131
PI.runAfterPassInvalidated<MachineFunction>(*Pass, PassPA);

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -368,9 +368,10 @@ class TriggerVerifierErrorPass
368368
// A pass requires all MachineFunctionProperties.
369369
// DO NOT USE THIS EXCEPT FOR TESTING!
370370
class RequireAllMachineFunctionPropertiesPass
371-
: public PassInfoMixin<RequireAllMachineFunctionPropertiesPass> {
371+
: public MachinePassInfoMixin<RequireAllMachineFunctionPropertiesPass> {
372372
public:
373-
PreservedAnalyses run(MachineFunction &, MachineFunctionAnalysisManager &) {
373+
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &) {
374+
PropertyChanger PC(MF);
374375
return PreservedAnalyses::none();
375376
}
376377

0 commit comments

Comments
 (0)