Skip to content

Commit 6ea0c0a

Browse files
authored
[NewPM][CodeGen] Add MachineFunctionAnalysis (#88610)
In new pass system, `MachineFunction` could be an analysis result again, machine module pass can now fetch them from analysis manager. `MachineModuleInfo` no longer owns them. Remove `FreeMachineFunctionPass`, replaced by `InvalidateAnalysisPass<MachineFunctionAnalysis>`. Now `FreeMachineFunction` is replaced by `InvalidateAnalysisPass<MachineFunctionAnalysis>`, the workaround in `MachineFunctionPassManager` is no longer needed, there is no difference between `unittests/MIR/PassBuilderCallbacksTest.cpp` and `unittests/IR/PassBuilderCallbacksTest.cpp`.
1 parent b1867e1 commit 6ea0c0a

26 files changed

+298
-731
lines changed

llvm/include/llvm/CodeGen/FreeMachineFunction.h

-24
This file was deleted.

llvm/include/llvm/CodeGen/MIRParser/MIRParser.h

+12
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ class MachineModuleInfo;
3434
class SMDiagnostic;
3535
class StringRef;
3636

37+
template <typename IRUnitT, typename... ExtraArgTs> class AnalysisManager;
38+
using ModuleAnalysisManager = AnalysisManager<Module>;
39+
3740
typedef llvm::function_ref<std::optional<std::string>(StringRef, StringRef)>
3841
DataLayoutCallbackTy;
3942

@@ -60,6 +63,15 @@ class MIRParser {
6063
///
6164
/// \returns true if an error occurred.
6265
bool parseMachineFunctions(Module &M, MachineModuleInfo &MMI);
66+
67+
/// Parses MachineFunctions in the MIR file and add them as the result
68+
/// of MachineFunctionAnalysis in ModulePassManager \p MAM.
69+
/// User should register at least MachineFunctionAnalysis,
70+
/// MachineModuleAnalysis, FunctionAnalysisManagerModuleProxy and
71+
/// PassInstrumentationAnalysis in \p MAM before parsing MIR.
72+
///
73+
/// \returns true if an error occurred.
74+
bool parseMachineFunctions(Module &M, ModuleAnalysisManager &MAM);
6375
};
6476

6577
/// This function is the main interface to the MIR serialization format parser.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
//===- llvm/CodeGen/MachineFunctionAnalysis.h -------------------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// This file declares the MachineFunctionAnalysis class.
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#ifndef LLVM_CODEGEN_MACHINEFUNCTIONANALYSIS
14+
#define LLVM_CODEGEN_MACHINEFUNCTIONANALYSIS
15+
16+
#include "llvm/IR/PassManager.h"
17+
18+
namespace llvm {
19+
20+
class MachineFunction;
21+
class LLVMTargetMachine;
22+
23+
/// This analysis create MachineFunction for given Function.
24+
/// To release the MachineFunction, users should invalidate it explicitly.
25+
class MachineFunctionAnalysis
26+
: public AnalysisInfoMixin<MachineFunctionAnalysis> {
27+
friend AnalysisInfoMixin<MachineFunctionAnalysis>;
28+
29+
static AnalysisKey Key;
30+
31+
const LLVMTargetMachine *TM;
32+
33+
public:
34+
class Result {
35+
std::unique_ptr<MachineFunction> MF;
36+
37+
public:
38+
Result(std::unique_ptr<MachineFunction> MF) : MF(std::move(MF)) {}
39+
MachineFunction &getMF() { return *MF; };
40+
bool invalidate(Function &, const PreservedAnalyses &PA,
41+
FunctionAnalysisManager::Invalidator &);
42+
};
43+
44+
MachineFunctionAnalysis(const LLVMTargetMachine *TM) : TM(TM){};
45+
Result run(Function &F, FunctionAnalysisManager &FAM);
46+
};
47+
48+
} // namespace llvm
49+
50+
#endif // LLVM_CODEGEN_MachineFunctionAnalysis

llvm/include/llvm/CodeGen/MachineModuleInfo.h

+4
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,14 @@ class MachineModuleInfo {
147147

148148
/// Returns the MachineFunction constructed for the IR function \p F.
149149
/// Creates a new MachineFunction if none exists yet.
150+
/// NOTE: New pass manager clients shall not use this method to get
151+
/// the `MachineFunction`, use `MachineFunctionAnalysis` instead.
150152
MachineFunction &getOrCreateMachineFunction(Function &F);
151153

152154
/// \brief Returns the MachineFunction associated to IR function \p F if there
153155
/// is one, otherwise nullptr.
156+
/// NOTE: New pass manager clients shall not use this method to get
157+
/// the `MachineFunction`, use `MachineFunctionAnalysis` instead.
154158
MachineFunction *getMachineFunction(const Function &F) const;
155159

156160
/// Delete the MachineFunction \p MF and reset the link in the IR Function to

llvm/include/llvm/CodeGen/MachinePassManager.h

+22-19
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,15 @@ bool MachineFunctionAnalysisManagerModuleProxy::Result::invalidate(
108108
ModuleAnalysisManager::Invalidator &Inv);
109109
extern template class InnerAnalysisManagerProxy<MachineFunctionAnalysisManager,
110110
Module>;
111+
using MachineFunctionAnalysisManagerFunctionProxy =
112+
InnerAnalysisManagerProxy<MachineFunctionAnalysisManager, Function>;
113+
114+
template <>
115+
bool MachineFunctionAnalysisManagerFunctionProxy::Result::invalidate(
116+
Function &F, const PreservedAnalyses &PA,
117+
FunctionAnalysisManager::Invalidator &Inv);
118+
extern template class InnerAnalysisManagerProxy<MachineFunctionAnalysisManager,
119+
Function>;
111120

112121
extern template class OuterAnalysisManagerProxy<ModuleAnalysisManager,
113122
MachineFunction>;
@@ -129,16 +138,6 @@ class FunctionAnalysisManagerMachineFunctionProxy
129138
Arg.FAM = nullptr;
130139
}
131140

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-
142141
Result &operator=(Result &&RHS) {
143142
FAM = RHS.FAM;
144143
// We have to null out the analysis manager in the moved-from state
@@ -187,18 +186,18 @@ class FunctionAnalysisManagerMachineFunctionProxy
187186
FunctionAnalysisManager *FAM;
188187
};
189188

190-
class ModuleToMachineFunctionPassAdaptor
191-
: public PassInfoMixin<ModuleToMachineFunctionPassAdaptor> {
189+
class FunctionToMachineFunctionPassAdaptor
190+
: public PassInfoMixin<FunctionToMachineFunctionPassAdaptor> {
192191
public:
193192
using PassConceptT =
194193
detail::PassConcept<MachineFunction, MachineFunctionAnalysisManager>;
195194

196-
explicit ModuleToMachineFunctionPassAdaptor(
195+
explicit FunctionToMachineFunctionPassAdaptor(
197196
std::unique_ptr<PassConceptT> Pass)
198197
: Pass(std::move(Pass)) {}
199198

200-
/// Runs the function pass across every function in the module.
201-
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
199+
/// Runs the function pass across every function in the function.
200+
PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
202201
void printPipeline(raw_ostream &OS,
203202
function_ref<StringRef(StringRef)> MapClassName2PassName);
204203

@@ -209,14 +208,14 @@ class ModuleToMachineFunctionPassAdaptor
209208
};
210209

211210
template <typename MachineFunctionPassT>
212-
ModuleToMachineFunctionPassAdaptor
213-
createModuleToMachineFunctionPassAdaptor(MachineFunctionPassT &&Pass) {
211+
FunctionToMachineFunctionPassAdaptor
212+
createFunctionToMachineFunctionPassAdaptor(MachineFunctionPassT &&Pass) {
214213
using PassModelT = detail::PassModel<MachineFunction, MachineFunctionPassT,
215214
MachineFunctionAnalysisManager>;
216215
// Do not use make_unique, it causes too many template instantiations,
217216
// causing terrible compile times.
218-
return ModuleToMachineFunctionPassAdaptor(
219-
std::unique_ptr<ModuleToMachineFunctionPassAdaptor::PassConceptT>(
217+
return FunctionToMachineFunctionPassAdaptor(
218+
std::unique_ptr<FunctionToMachineFunctionPassAdaptor::PassConceptT>(
220219
new PassModelT(std::forward<MachineFunctionPassT>(Pass))));
221220
}
222221

@@ -244,6 +243,10 @@ extern template class PassManager<MachineFunction>;
244243
/// Convenience typedef for a pass manager over functions.
245244
using MachineFunctionPassManager = PassManager<MachineFunction>;
246245

246+
/// Returns the minimum set of Analyses that all machine function passes must
247+
/// preserve.
248+
PreservedAnalyses getMachineFunctionPassPreservedAnalyses();
249+
247250
} // end namespace llvm
248251

249252
#endif // LLVM_CODEGEN_MACHINEPASSMANAGER_H

llvm/include/llvm/IR/LLVMContext.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ class LLVMContext {
155155
void enableDebugTypeODRUniquing();
156156
void disableDebugTypeODRUniquing();
157157

158+
/// generateMachineFunctionNum - Get a unique number for MachineFunction
159+
/// that associated with the given Function.
160+
unsigned generateMachineFunctionNum(Function &);
161+
158162
/// Defines the type of a yield callback.
159163
/// \see LLVMContext::setYieldCallback.
160164
using YieldCallbackTy = void (*)(LLVMContext *Context, void *OpaqueHandle);
@@ -332,7 +336,7 @@ class LLVMContext {
332336
void addModule(Module*);
333337

334338
/// removeModule - Unregister a module from this context.
335-
void removeModule(Module*);
339+
void removeModule(Module *);
336340
};
337341

338342
// Create wrappers for C Binding types (see CBindingWrapping.h).

llvm/include/llvm/Passes/CodeGenPassBuilder.h

+12-6
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
#include "llvm/CodeGen/DwarfEHPrepare.h"
3030
#include "llvm/CodeGen/ExpandMemCmp.h"
3131
#include "llvm/CodeGen/ExpandReductions.h"
32-
#include "llvm/CodeGen/FreeMachineFunction.h"
3332
#include "llvm/CodeGen/GCMetadata.h"
3433
#include "llvm/CodeGen/GlobalMerge.h"
3534
#include "llvm/CodeGen/IndirectBrExpand.h"
@@ -38,6 +37,8 @@
3837
#include "llvm/CodeGen/JMCInstrumenter.h"
3938
#include "llvm/CodeGen/LowerEmuTLS.h"
4039
#include "llvm/CodeGen/MIRPrinter.h"
40+
#include "llvm/CodeGen/MachineFunctionAnalysis.h"
41+
#include "llvm/CodeGen/MachineModuleInfo.h"
4142
#include "llvm/CodeGen/MachinePassManager.h"
4243
#include "llvm/CodeGen/PreISelIntrinsicLowering.h"
4344
#include "llvm/CodeGen/ReplaceWithVeclib.h"
@@ -199,8 +200,13 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
199200
AddMachinePass(ModulePassManager &MPM, const DerivedT &PB)
200201
: MPM(MPM), PB(PB) {}
201202
~AddMachinePass() {
202-
if (!MFPM.isEmpty())
203-
MPM.addPass(createModuleToMachineFunctionPassAdaptor(std::move(MFPM)));
203+
if (!MFPM.isEmpty()) {
204+
FunctionPassManager FPM;
205+
FPM.addPass(
206+
createFunctionToMachineFunctionPassAdaptor(std::move(MFPM)));
207+
FPM.addPass(InvalidateAnalysisPass<MachineFunctionAnalysis>());
208+
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
209+
}
204210
}
205211

206212
template <typename PassT>
@@ -219,8 +225,8 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
219225
} else {
220226
// Add Module Pass
221227
if (!MFPM.isEmpty()) {
222-
MPM.addPass(
223-
createModuleToMachineFunctionPassAdaptor(std::move(MFPM)));
228+
MPM.addPass(createModuleToFunctionPassAdaptor(
229+
createFunctionToMachineFunctionPassAdaptor(std::move(MFPM))));
224230
MFPM = MachineFunctionPassManager();
225231
}
226232

@@ -512,6 +518,7 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
512518

513519
{
514520
AddIRPass addIRPass(MPM, derived());
521+
addIRPass(RequireAnalysisPass<MachineModuleAnalysis, Module>());
515522
addIRPass(RequireAnalysisPass<ProfileSummaryAnalysis, Module>());
516523
addIRPass(RequireAnalysisPass<CollectorMetadataAnalysis, Module>());
517524
addISelPasses(addIRPass);
@@ -538,7 +545,6 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
538545
if (PrintMIR)
539546
addPass(PrintMIRPass(Out), /*Force=*/true);
540547

541-
addPass(FreeMachineFunctionPass());
542548
return verifyStartStop(*StartStopInfo);
543549
}
544550

llvm/include/llvm/Passes/MachinePassRegistry.def

-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,6 @@ MACHINE_FUNCTION_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis(PI
124124
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS)
125125
#endif
126126
MACHINE_FUNCTION_PASS("dead-mi-elimination", DeadMachineInstructionElimPass())
127-
// MACHINE_FUNCTION_PASS("free-machine-function", FreeMachineFunctionPass())
128127
MACHINE_FUNCTION_PASS("no-op-machine-function", NoOpMachineFunctionPass())
129128
MACHINE_FUNCTION_PASS("print", PrintMIRPass())
130129
MACHINE_FUNCTION_PASS("require-all-machine-function-properties",

llvm/lib/CodeGen/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ add_llvm_component_library(LLVMCodeGen
6565
FEntryInserter.cpp
6666
FinalizeISel.cpp
6767
FixupStatepointCallerSaved.cpp
68-
FreeMachineFunction.cpp
6968
FuncletLayout.cpp
69+
MachineFunctionAnalysis.cpp
7070
GCMetadata.cpp
7171
GCMetadataPrinter.cpp
7272
GCRootLowering.cpp

llvm/lib/CodeGen/DeadMachineInstructionElim.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ DeadMachineInstructionElimPass::run(MachineFunction &MF,
6868
MachineFunctionAnalysisManager &) {
6969
if (!DeadMachineInstructionElimImpl().runImpl(MF))
7070
return PreservedAnalyses::all();
71-
PreservedAnalyses PA;
71+
PreservedAnalyses PA = getMachineFunctionPassPreservedAnalyses();
7272
PA.preserveSet<CFGAnalyses>();
7373
return PA;
7474
}

llvm/lib/CodeGen/FreeMachineFunction.cpp

-22
This file was deleted.

0 commit comments

Comments
 (0)