Skip to content

Commit 0be26db

Browse files
authored
Revert "[PassManager] Support MachineFunctionProperties (#83668)" (#87136)
This reverts commit 5538853. #83668 Break some test bots.
1 parent 5538853 commit 0be26db

File tree

4 files changed

+103
-125
lines changed

4 files changed

+103
-125
lines changed

llvm/include/llvm/CodeGen/MachinePassManager.h

Lines changed: 103 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
// their respective analysis managers such as ModuleAnalysisManager and
1717
// FunctionAnalysisManager.
1818
//
19+
// TODO: Add MachineFunctionProperties support.
20+
//
1921
//===----------------------------------------------------------------------===//
2022

2123
#ifndef LLVM_CODEGEN_MACHINEPASSMANAGER_H
@@ -42,67 +44,23 @@ using MachineFunctionAnalysisManager = AnalysisManager<MachineFunction>;
4244
/// automatically mixes in \c PassInfoMixin.
4345
template <typename DerivedT>
4446
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() << "\nCurrent properties: ";
74-
MFProps.print(errs());
75-
errs() << '\n';
76-
report_fatal_error("MachineFunctionProperties check failed");
77-
}
78-
#endif
79-
}
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.
9648
};
9749

9850
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+
};
9957

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)) {}
10664

10765
friend void swap(MachinePassModel &LHS, MachinePassModel &RHS) {
10866
using std::swap;
@@ -117,8 +75,89 @@ struct MachinePassModel
11775
MachinePassModel &operator=(const MachinePassModel &) = delete;
11876
PreservedAnalyses run(MachineFunction &IR,
11977
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();
12195
}
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;
122161
};
123162
} // namespace detail
124163

@@ -212,12 +251,11 @@ class FunctionAnalysisManagerMachineFunctionProxy
212251

213252
class ModuleToMachineFunctionPassAdaptor
214253
: public PassInfoMixin<ModuleToMachineFunctionPassAdaptor> {
215-
public:
216-
using PassConceptT =
217-
detail::PassConcept<MachineFunction, MachineFunctionAnalysisManager>;
254+
using MachinePassConcept = detail::MachinePassConcept;
218255

256+
public:
219257
explicit ModuleToMachineFunctionPassAdaptor(
220-
std::unique_ptr<PassConceptT> Pass)
258+
std::unique_ptr<MachinePassConcept> Pass)
221259
: Pass(std::move(Pass)) {}
222260

223261
/// Runs the function pass across every function in the module.
@@ -228,39 +266,20 @@ class ModuleToMachineFunctionPassAdaptor
228266
static bool isRequired() { return true; }
229267

230268
private:
231-
std::unique_ptr<PassConceptT> Pass;
269+
std::unique_ptr<MachinePassConcept> Pass;
232270
};
233271

234272
template <typename MachineFunctionPassT>
235273
ModuleToMachineFunctionPassAdaptor
236274
createModuleToMachineFunctionPassAdaptor(MachineFunctionPassT &&Pass) {
237-
using PassModelT = detail::PassModel<MachineFunction, MachineFunctionPassT,
238-
MachineFunctionAnalysisManager>;
275+
using PassModelT = detail::MachinePassModel<MachineFunctionPassT>;
239276
// Do not use make_unique, it causes too many template instantiations,
240277
// causing terrible compile times.
241278
return ModuleToMachineFunctionPassAdaptor(
242-
std::unique_ptr<ModuleToMachineFunctionPassAdaptor::PassConceptT>(
279+
std::unique_ptr<detail::MachinePassConcept>(
243280
new PassModelT(std::forward<MachineFunctionPassT>(Pass))));
244281
}
245282

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-
264283
template <>
265284
PreservedAnalyses
266285
PassManager<MachineFunction>::run(MachineFunction &,

llvm/include/llvm/Passes/MachinePassRegistry.def

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,6 @@ MACHINE_FUNCTION_PASS("dead-mi-elimination", DeadMachineInstructionElimPass())
127127
// MACHINE_FUNCTION_PASS("free-machine-function", FreeMachineFunctionPass())
128128
MACHINE_FUNCTION_PASS("no-op-machine-function", NoOpMachineFunctionPass())
129129
MACHINE_FUNCTION_PASS("print", PrintMIRPass())
130-
MACHINE_FUNCTION_PASS("require-all-machine-function-properties",
131-
RequireAllMachineFunctionPropertiesPass())
132130
#undef MACHINE_FUNCTION_PASS
133131

134132
// After a pass is converted to new pass manager, its entry should be moved from

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -365,33 +365,6 @@ class TriggerVerifierErrorPass
365365
static StringRef name() { return "TriggerVerifierErrorPass"; }
366366
};
367367

368-
// A pass requires all MachineFunctionProperties.
369-
// DO NOT USE THIS EXCEPT FOR TESTING!
370-
class RequireAllMachineFunctionPropertiesPass
371-
: public MachinePassInfoMixin<RequireAllMachineFunctionPropertiesPass> {
372-
public:
373-
PreservedAnalyses run(MachineFunction &, MachineFunctionAnalysisManager &) {
374-
return PreservedAnalyses::none();
375-
}
376-
377-
static MachineFunctionProperties getRequiredProperties() {
378-
MachineFunctionProperties MFProps;
379-
MFProps.set(MachineFunctionProperties::Property::FailedISel);
380-
MFProps.set(MachineFunctionProperties::Property::FailsVerification);
381-
MFProps.set(MachineFunctionProperties::Property::IsSSA);
382-
MFProps.set(MachineFunctionProperties::Property::Legalized);
383-
MFProps.set(MachineFunctionProperties::Property::NoPHIs);
384-
MFProps.set(MachineFunctionProperties::Property::NoVRegs);
385-
MFProps.set(MachineFunctionProperties::Property::RegBankSelected);
386-
MFProps.set(MachineFunctionProperties::Property::Selected);
387-
MFProps.set(MachineFunctionProperties::Property::TiedOpsRewritten);
388-
MFProps.set(MachineFunctionProperties::Property::TracksDebugUserValues);
389-
MFProps.set(MachineFunctionProperties::Property::TracksLiveness);
390-
return MFProps;
391-
}
392-
static StringRef name() { return "RequireAllMachineFunctionPropertiesPass"; }
393-
};
394-
395368
} // namespace
396369

397370
PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,

llvm/test/tools/llc/new-pm/machine-function-properties.mir

Lines changed: 0 additions & 12 deletions
This file was deleted.

0 commit comments

Comments
 (0)