Skip to content

Commit d1d92e8

Browse files
committed
[NewPM] Add FunctionToMachineFunctionPassAdaptor
1 parent b45c9c3 commit d1d92e8

File tree

4 files changed

+115
-31
lines changed

4 files changed

+115
-31
lines changed

llvm/include/llvm/CodeGen/MachinePassManager.h

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -129,16 +129,6 @@ class FunctionAnalysisManagerMachineFunctionProxy
129129
Arg.FAM = nullptr;
130130
}
131131

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-
142132
Result &operator=(Result &&RHS) {
143133
FAM = RHS.FAM;
144134
// We have to null out the analysis manager in the moved-from state
@@ -211,15 +201,46 @@ class ModuleToMachineFunctionPassAdaptor
211201
template <typename MachineFunctionPassT>
212202
ModuleToMachineFunctionPassAdaptor
213203
createModuleToMachineFunctionPassAdaptor(MachineFunctionPassT &&Pass) {
214-
using PassModelT = detail::PassModel<MachineFunction, MachineFunctionPassT,
215-
MachineFunctionAnalysisManager>;
204+
using PassModelT = detail::MachinePassModel<MachineFunctionPassT>;
216205
// Do not use make_unique, it causes too many template instantiations,
217206
// causing terrible compile times.
218207
return ModuleToMachineFunctionPassAdaptor(
219208
std::unique_ptr<ModuleToMachineFunctionPassAdaptor::PassConceptT>(
220209
new PassModelT(std::forward<MachineFunctionPassT>(Pass))));
221210
}
222211

212+
class FunctionToMachineFunctionPassAdaptor
213+
: public PassInfoMixin<FunctionToMachineFunctionPassAdaptor> {
214+
public:
215+
using PassConceptT =
216+
detail::PassConcept<MachineFunction, MachineFunctionAnalysisManager>;
217+
218+
explicit FunctionToMachineFunctionPassAdaptor(
219+
std::unique_ptr<PassConceptT> Pass)
220+
: Pass(std::move(Pass)) {}
221+
222+
/// Runs the machine function pass across every function.
223+
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
224+
void printPipeline(raw_ostream &OS,
225+
function_ref<StringRef(StringRef)> MapClassName2PassName);
226+
227+
static bool isRequired() { return true; }
228+
229+
private:
230+
std::unique_ptr<PassConceptT> Pass;
231+
};
232+
233+
template <typename MachineFunctionPassT>
234+
FunctionToMachineFunctionPassAdaptor
235+
createFunctionToMachineFunctionPassAdaptor(MachineFunctionPassT &&Pass) {
236+
using PassModelT = detail::MachinePassModel<MachineFunctionPassT>;
237+
// Do not use make_unique, it causes too many template instantiations,
238+
// causing terrible compile times.
239+
return FunctionToMachineFunctionPassAdaptor(
240+
std::unique_ptr<FunctionToMachineFunctionPassAdaptor::PassConceptT>(
241+
new PassModelT(std::forward<MachineFunctionPassT>(Pass))));
242+
}
243+
223244
template <>
224245
template <typename PassT>
225246
void PassManager<MachineFunction>::addPass(PassT &&Pass) {

llvm/lib/CodeGen/MachinePassManager.cpp

Lines changed: 74 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "llvm/CodeGen/MachinePassManager.h"
14+
#include "llvm/CodeGen/FreeMachineFunction.h"
15+
#include "llvm/CodeGen/FunctionToMachineFunctionAnalysis.h"
1416
#include "llvm/CodeGen/MachineFunction.h"
1517
#include "llvm/CodeGen/MachineModuleInfo.h"
1618
#include "llvm/IR/PassManagerImpl.h"
@@ -69,9 +71,34 @@ bool MachineFunctionAnalysisManagerModuleProxy::Result::invalidate(
6971
return false;
7072
}
7173

74+
template <>
75+
bool MachineFunctionAnalysisManagerFunctionProxy::Result::invalidate(
76+
Function &F, const PreservedAnalyses &PA,
77+
FunctionAnalysisManager::Invalidator &Inv) {
78+
// If literally everything is preserved, we're done.
79+
if (PA.areAllPreserved())
80+
return false; // This is still a valid proxy.
81+
82+
// If this proxy isn't marked as preserved, then even if the result remains
83+
// valid, the key itself may no longer be valid, so we clear everything.
84+
//
85+
// Once function changed by a non-trivial pass, we need to do instruction
86+
// selection again.
87+
auto PAC = PA.getChecker<MachineFunctionAnalysisManagerFunctionProxy>();
88+
if (!PAC.preserved() && !PAC.preservedSet<AllAnalysesOn<Function>>()) {
89+
InnerAM->clear();
90+
return true;
91+
}
92+
93+
// Return false to indicate that this result is still a valid proxy.
94+
return false;
95+
}
96+
7297
PreservedAnalyses
7398
ModuleToMachineFunctionPassAdaptor::run(Module &M, ModuleAnalysisManager &AM) {
74-
auto &MMI = AM.getResult<MachineModuleAnalysis>(M).getMMI();
99+
// Ensure we have a MachineModuleInfo
100+
AM.getResult<MachineModuleAnalysis>(M).getMMI();
101+
auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
75102
MachineFunctionAnalysisManager &MFAM =
76103
AM.getResult<MachineFunctionAnalysisManagerModuleProxy>(M).getManager();
77104
PassInstrumentation PI = AM.getResult<PassInstrumentationAnalysis>(M);
@@ -82,19 +109,51 @@ ModuleToMachineFunctionPassAdaptor::run(Module &M, ModuleAnalysisManager &AM) {
82109
if (F.isDeclaration() || F.hasAvailableExternallyLinkage())
83110
continue;
84111

85-
MachineFunction &MF = MMI.getOrCreateMachineFunction(F);
112+
MachineFunction &MF =
113+
FAM.getResult<FunctionToMachineFunctionAnalysis>(F).getMF();
86114

87115
if (!PI.runBeforePass<MachineFunction>(*Pass, MF))
88116
continue;
89117
PreservedAnalyses PassPA = Pass->run(MF, MFAM);
90-
if (MMI.getMachineFunction(F)) {
91-
MFAM.invalidate(MF, PassPA);
118+
MFAM.invalidate(MF, PassPA);
119+
if (Pass->name() != FreeMachineFunctionPass::name()) {
92120
PI.runAfterPass(*Pass, MF, PassPA);
121+
PA.intersect(std::move(PassPA));
93122
} else {
94-
MFAM.clear(MF, F.getName());
95-
PI.runAfterPassInvalidated<MachineFunction>(*Pass, PassPA);
123+
PA.intersect(std::move(PassPA));
124+
FAM.invalidate(F, PA);
125+
PI.runAfterPassInvalidated<MachineFunction>(*Pass, PA);
96126
}
127+
}
128+
129+
return PA;
130+
}
131+
132+
PreservedAnalyses
133+
FunctionToMachineFunctionPassAdaptor::run(Function &F,
134+
FunctionAnalysisManager &FAM) {
135+
// Do not codegen any 'available_externally' functions at all, they have
136+
// definitions outside the translation unit.
137+
if (F.isDeclaration() || F.hasAvailableExternallyLinkage())
138+
return PreservedAnalyses::all();
139+
140+
auto &MF = FAM.getResult<FunctionToMachineFunctionAnalysis>(F).getMF();
141+
auto &MFAM = FAM.getResult<MachineFunctionAnalysisManagerFunctionProxy>(F)
142+
.getManager();
143+
auto PI = FAM.getResult<PassInstrumentationAnalysis>(F);
144+
PreservedAnalyses PA = PreservedAnalyses::all();
145+
146+
if (!PI.runBeforePass<MachineFunction>(*Pass, MF))
147+
return PreservedAnalyses::all();
148+
PreservedAnalyses PassPA = Pass->run(MF, MFAM);
149+
MFAM.invalidate(MF, PassPA);
150+
if (Pass->name() != FreeMachineFunctionPass::name()) {
151+
PI.runAfterPass(*Pass, MF, PassPA);
152+
PA.intersect(std::move(PassPA));
153+
} else {
97154
PA.intersect(std::move(PassPA));
155+
FAM.invalidate(F, PA);
156+
PI.runAfterPassInvalidated<MachineFunction>(*Pass, PA);
98157
}
99158

100159
return PA;
@@ -112,25 +171,24 @@ PreservedAnalyses
112171
PassManager<MachineFunction>::run(MachineFunction &MF,
113172
AnalysisManager<MachineFunction> &MFAM) {
114173
PassInstrumentation PI = MFAM.getResult<PassInstrumentationAnalysis>(MF);
115-
Function &F = MF.getFunction();
116-
MachineModuleInfo &MMI =
117-
MFAM.getResult<ModuleAnalysisManagerMachineFunctionProxy>(MF)
118-
.getCachedResult<MachineModuleAnalysis>(*F.getParent())
119-
->getMMI();
174+
FunctionAnalysisManager &FAM =
175+
MFAM.getResult<FunctionAnalysisManagerMachineFunctionProxy>(MF)
176+
.getManager();
120177
PreservedAnalyses PA = PreservedAnalyses::all();
121178
for (auto &Pass : Passes) {
122179
if (!PI.runBeforePass<MachineFunction>(*Pass, MF))
123180
continue;
124181

125182
PreservedAnalyses PassPA = Pass->run(MF, MFAM);
126-
if (MMI.getMachineFunction(F)) {
127-
MFAM.invalidate(MF, PassPA);
183+
MFAM.invalidate(MF, PassPA);
184+
if (Pass->name() != FreeMachineFunctionPass::name()) {
128185
PI.runAfterPass(*Pass, MF, PassPA);
186+
PA.intersect(std::move(PassPA));
129187
} else {
130-
MFAM.clear(MF, F.getName());
131-
PI.runAfterPassInvalidated<MachineFunction>(*Pass, PassPA);
188+
PA.intersect(std::move(PassPA));
189+
FAM.invalidate(MF.getFunction(), PA);
190+
PI.runAfterPassInvalidated<MachineFunction>(*Pass, PA);
132191
}
133-
PA.intersect(std::move(PassPA));
134192
}
135193
return PA;
136194
}

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
#include "llvm/CodeGen/ExpandLargeFpConvert.h"
8484
#include "llvm/CodeGen/ExpandMemCmp.h"
8585
#include "llvm/CodeGen/FreeMachineFunction.h"
86+
#include "llvm/CodeGen/FunctionToMachineFunctionAnalysis.h"
8687
#include "llvm/CodeGen/GCMetadata.h"
8788
#include "llvm/CodeGen/GlobalMerge.h"
8889
#include "llvm/CodeGen/HardwareLoops.h"

llvm/unittests/CodeGen/PassManagerTest.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,10 +176,10 @@ TEST_F(PassManagerTest, Basic) {
176176
MachineModuleInfo MMI(LLVMTM);
177177

178178
LoopAnalysisManager LAM;
179+
MachineFunctionAnalysisManager MFAM;
179180
FunctionAnalysisManager FAM;
180181
CGSCCAnalysisManager CGAM;
181182
ModuleAnalysisManager MAM;
182-
MachineFunctionAnalysisManager MFAM;
183183
PassBuilder PB(TM.get());
184184
PB.registerModuleAnalyses(MAM);
185185
PB.registerCGSCCAnalyses(CGAM);
@@ -203,11 +203,15 @@ TEST_F(PassManagerTest, Basic) {
203203
MPM.addPass(TestMachineModulePass(Count, Counts));
204204
MFPM.addPass(TestMachineFunctionPass(Count, Counts));
205205
MPM.addPass(createModuleToMachineFunctionPassAdaptor(std::move(MFPM)));
206+
MPM.addPass(createModuleToFunctionPassAdaptor(
207+
createFunctionToMachineFunctionPassAdaptor(
208+
TestMachineFunctionPass(Count, Counts))));
206209

207210
MPM.run(*M, MAM);
208211

209-
EXPECT_EQ((std::vector<int>{10, 16, 18, 20, 30, 36, 38, 40}), Counts);
210-
EXPECT_EQ(40, Count);
212+
EXPECT_EQ((std::vector<int>{10, 16, 18, 20, 30, 36, 38, 40, 46, 48, 50}),
213+
Counts);
214+
EXPECT_EQ(50, Count);
211215
}
212216

213217
} // namespace

0 commit comments

Comments
 (0)