Skip to content

Commit 22d7f27

Browse files
committed
Add TargetPassBuilder.
1 parent 730e8a4 commit 22d7f27

File tree

9 files changed

+1221
-0
lines changed

9 files changed

+1221
-0
lines changed

llvm/include/llvm/Passes/MachinePassRegistry.def

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,11 +269,13 @@ DUMMY_MACHINE_MODULE_PASS("pseudo-probe-inserter", PseudoProbeInserterPass)
269269
DUMMY_MACHINE_MODULE_PASS("mir-debugify", DebugifyMachineModule)
270270
DUMMY_MACHINE_MODULE_PASS("mir-check-debugify", CheckDebugMachineModulePass)
271271
DUMMY_MACHINE_MODULE_PASS("mir-strip-debug", StripDebugMachineModulePass)
272+
DUMMY_MACHINE_MODULE_PASS("static-data-annotator", StaticDataAnnotatorPass)
272273
#undef DUMMY_MACHINE_MODULE_PASS
273274

274275
#ifndef DUMMY_MACHINE_FUNCTION_PASS
275276
#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME)
276277
#endif
278+
DUMMY_MACHINE_FUNCTION_PASS("bb-path-cloning", BasicBlockPathCloningPass)
277279
DUMMY_MACHINE_FUNCTION_PASS("bbsections-prepare", BasicBlockSectionsPass)
278280
DUMMY_MACHINE_FUNCTION_PASS("bbsections-profile-reader", BasicBlockSectionsProfileReaderPass)
279281
DUMMY_MACHINE_FUNCTION_PASS("block-placement-stats", MachineBlockPlacementStatsPass)
@@ -314,6 +316,8 @@ DUMMY_MACHINE_FUNCTION_PASS("reset-machine-function", ResetMachineFunctionPass)
314316
DUMMY_MACHINE_FUNCTION_PASS("shrink-wrap", ShrinkWrapPass)
315317
DUMMY_MACHINE_FUNCTION_PASS("stack-frame-layout", StackFrameLayoutAnalysisPass)
316318
DUMMY_MACHINE_FUNCTION_PASS("stackmap-liveness", StackMapLivenessPass)
319+
DUMMY_MACHINE_FUNCTION_PASS("static-data-splitter", StaticDataSplitterPass)
317320
DUMMY_MACHINE_FUNCTION_PASS("unpack-mi-bundles", UnpackMachineBundlesPass)
321+
DUMMY_MACHINE_FUNCTION_PASS("unreachable-mbb-elimination", UnreachableMachineBlockElim)
318322
DUMMY_MACHINE_FUNCTION_PASS("virtregrewriter", VirtRegRewriterPass)
319323
#undef DUMMY_MACHINE_FUNCTION_PASS

llvm/include/llvm/Passes/PassBuilder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ class PassBuilder {
112112
std::optional<PGOOptions> PGOOpt;
113113
PassInstrumentationCallbacks *PIC;
114114

115+
friend class TargetPassBuilder;
116+
115117
public:
116118
/// A struct to capture parsed pass pipeline names.
117119
///
Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
//===- Parsing, selection, and construction of pass pipelines --*- 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+
/// \file
9+
///
10+
/// Interfaces for registering analysis passes, producing common pass manager
11+
/// configurations, and parsing of pass pipelines.
12+
///
13+
//===----------------------------------------------------------------------===//
14+
15+
#ifndef LLVM_PASSES_TARGETPASSBUILDER_H
16+
#define LLVM_PASSES_TARGETPASSBUILDER_H
17+
18+
#include "llvm/ADT/SmallVector.h"
19+
#include "llvm/ADT/StringSet.h"
20+
#include "llvm/ADT/identity.h"
21+
#include "llvm/CodeGen/MachinePassManager.h"
22+
#include "llvm/Target/CGPassBuilderOption.h"
23+
#include "llvm/Transforms/Scalar/LoopPassManager.h"
24+
#include <list>
25+
#include <type_traits>
26+
#include <unordered_set>
27+
#include <utility>
28+
#include <variant>
29+
#include <vector>
30+
31+
namespace llvm {
32+
33+
class PassBuilder;
34+
class TargetMachine;
35+
class SelectionDAGISel;
36+
37+
class TargetPassBuilder {
38+
public:
39+
TargetPassBuilder(PassBuilder &PB);
40+
41+
virtual ~TargetPassBuilder() = default;
42+
43+
// TODO: Add necessary parameters once AsmPrinter is ported to new pass
44+
// manager.
45+
llvm::ModulePassManager buildPipeline(CodeGenFileType FileType);
46+
47+
private:
48+
using PassList = std::list<std::pair<
49+
StringRef,
50+
std::variant<llvm::ModulePassManager, llvm::FunctionPassManager,
51+
llvm::LoopPassManager, llvm::MachineFunctionPassManager>>>;
52+
53+
template <typename InternalPassT> struct AdaptorWrapper : InternalPassT {
54+
using InternalPassT::Passes;
55+
};
56+
57+
template <typename PassManagerT, typename InternalPassT = void>
58+
class PassManagerWrapper {
59+
friend class TargetPassBuilder;
60+
61+
public:
62+
bool isEmpty() const { return Passes.empty(); }
63+
64+
template <typename PassT> void addPass(PassT &&P) {
65+
PassManagerT PM;
66+
PM.addPass(std::forward<PassT>(P));
67+
Passes.emplace_back(PassT::name(), std::move(PM));
68+
}
69+
70+
void addPass(PassManagerWrapper &&PM) {
71+
for (auto &P : PM.Passes)
72+
Passes.push_back(std::move(P));
73+
}
74+
75+
void addPass(AdaptorWrapper<InternalPassT> &&Adaptor) {
76+
for (auto &P : Adaptor.Passes)
77+
Passes.push_back(std::move(P));
78+
}
79+
80+
void addPass(llvm::ModulePassManager &&) = delete;
81+
void addPass(llvm::FunctionPassManager &&) = delete;
82+
void addPass(llvm::LoopPassManager &&) = delete;
83+
void addPass(llvm::MachineFunctionPassManager &&) = delete;
84+
85+
private:
86+
PassList Passes;
87+
};
88+
89+
template <typename NestedPassManagerT, typename PassT>
90+
AdaptorWrapper<NestedPassManagerT> createPassAdaptor(PassT &&P) {
91+
AdaptorWrapper<NestedPassManagerT> Adaptor;
92+
Adaptor.addPass(std::forward<PassT>(P));
93+
return Adaptor;
94+
}
95+
96+
private:
97+
template <typename PassT, typename IRUnitT>
98+
using HasRunOnIRUnit = decltype(std::declval<PassT>().run(
99+
std::declval<IRUnitT &>(), std::declval<AnalysisManager<IRUnitT> &>()));
100+
template <typename PassT>
101+
static constexpr bool isModulePass =
102+
is_detected<HasRunOnIRUnit, PassT, Module>::value;
103+
template <typename PassT>
104+
static constexpr bool isFunctionPass =
105+
is_detected<HasRunOnIRUnit, PassT, Function>::value;
106+
template <typename PassT>
107+
static constexpr bool isMachineFunctionPass =
108+
is_detected<HasRunOnIRUnit, PassT, MachineFunction>::value;
109+
110+
protected:
111+
// Hijack real pass managers intentionally.
112+
using MachineFunctionPassManager =
113+
PassManagerWrapper<llvm::MachineFunctionPassManager>;
114+
using FunctionPassManager =
115+
PassManagerWrapper<llvm::FunctionPassManager, MachineFunctionPassManager>;
116+
using ModulePassManager =
117+
PassManagerWrapper<llvm::ModulePassManager, FunctionPassManager>;
118+
119+
protected:
120+
template <typename FunctionPassT>
121+
AdaptorWrapper<FunctionPassManager>
122+
createModuleToFunctionPassAdaptor(FunctionPassT &&P) {
123+
return createPassAdaptor<FunctionPassManager>(
124+
std::forward<FunctionPassT>(P));
125+
}
126+
127+
template <typename FunctionPassT>
128+
AdaptorWrapper<FunctionPassManager>
129+
createModuleToPostOrderCGSCCPassAdaptor(FunctionPassManager &&PM) {
130+
assert(CGPBO.RequiresCodeGenSCCOrder &&
131+
"Target must set RequiresCodeGenSCCOrder!");
132+
return createPassAdaptor<FunctionPassManager>(
133+
std::forward<FunctionPassT>(PM));
134+
}
135+
136+
template <typename MachineFunctionPassT>
137+
AdaptorWrapper<MachineFunctionPassManager>
138+
createFunctionToMachineFunctionPassAdaptor(MachineFunctionPassT &&P) {
139+
return createPassAdaptor<MachineFunctionPassManager>(
140+
std::forward<MachineFunctionPassManager>(P));
141+
}
142+
143+
protected:
144+
PassBuilder &PB;
145+
TargetMachine *TM;
146+
CodeGenOptLevel OptLevel;
147+
CGPassBuilderOption CGPBO = getCGPassBuilderOption();
148+
149+
template <typename PassT,
150+
typename PassManagerT = std::conditional_t<
151+
isModulePass<PassT>, ModulePassManager,
152+
std::conditional_t<isFunctionPass<PassT>, FunctionPassManager,
153+
MachineFunctionPassManager>>>
154+
void injectBefore(
155+
typename llvm::identity<std::function<PassManagerT()>>::argument_type F) {
156+
InjectionCallbacks.push_back(
157+
[Accessed = false, F](PassList &Passes, PassList::iterator I) mutable {
158+
if (Accessed)
159+
return I;
160+
if (PassT::name() != I->first)
161+
return I;
162+
Accessed = true;
163+
auto PMPasses = F().Passes;
164+
return Passes.insert(I, std::make_move_iterator(PMPasses.begin()),
165+
std::make_move_iterator(PMPasses.end()));
166+
});
167+
}
168+
169+
template <typename PassTs> void disablePass() {
170+
DisabedPasses.insert(PassTs::name());
171+
}
172+
173+
void disablePass(StringRef Name) { DisabedPasses.insert(Name); }
174+
175+
template <typename PassT> bool isPassDisabled() const {
176+
return DisabedPasses.contains(PassT::name());
177+
}
178+
179+
bool isPassDisabled(StringRef Name) const {
180+
return DisabedPasses.contains(Name);
181+
}
182+
183+
template <typename PassT> bool isPassEnabled() const {
184+
return !isPassDisabled<PassT>();
185+
}
186+
187+
bool isPassEnabled(StringRef Name) const { return !isPassDisabled(Name); }
188+
189+
protected:
190+
/// \defgroup target specific hooks
191+
/// @{
192+
// FIXME: Find a way that each target can return sliced object.
193+
virtual std::unique_ptr<SelectionDAGISel> getSelectionDAGISelPass() = 0;
194+
/// @}
195+
196+
private:
197+
void buildCoreCodeGenPipeline(ModulePassManager &MPM);
198+
199+
ModulePassManager buildCodeGenIRPipeline();
200+
201+
/// Add passes that optimize machine instructions in SSA form.
202+
void addISelPasses(MachineFunctionPassManager &MFPM);
203+
void addMachineSSAOptimizationPasses(MachineFunctionPassManager &MFPM);
204+
void addRegAllocPipeline(MachineFunctionPassManager &MFPM);
205+
void addRegAllocPass(MachineFunctionPassManager &MFPM, bool Optimized);
206+
ModulePassManager buildCodeGenMIRPipeline();
207+
208+
void addExceptionHandlingPasses(FunctionPassManager &FPM);
209+
210+
void filtPassList(ModulePassManager &MPM) const;
211+
static void addMIRPrinterPasses(ModulePassManager &MPM);
212+
213+
llvm::ModulePassManager constructRealPassManager(ModulePassManager &&MPMW);
214+
215+
private:
216+
virtual void anchor();
217+
218+
StringSet<> DisabedPasses;
219+
std::vector<std::function<PassList::iterator(PassList &, PassList::iterator)>>
220+
InjectionCallbacks;
221+
222+
void invokeInjectionCallbacks(ModulePassManager &MPM) const;
223+
224+
// Only Loop Strength Reduction need this, shadow LoopPassManager
225+
// in future if it is necessary.
226+
template <typename PassT>
227+
void addLoopPass(FunctionPassManager &FPM, PassT &&P) {
228+
LoopPassManager LPM;
229+
LPM.addPass(std::forward<PassT>(P));
230+
FPM.Passes.push_back(std::pair(PassT::name(), std::move(LPM)));
231+
}
232+
};
233+
234+
template <> struct TargetPassBuilder::AdaptorWrapper<void> {};
235+
236+
} // namespace llvm
237+
238+
#endif

llvm/include/llvm/Target/CGPassBuilderOption.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,11 @@ struct CGPassBuilderOption {
5151
bool EnableMachineFunctionSplitter = false;
5252
bool EnableSinkAndFold = false;
5353
bool EnableTailMerge = true;
54+
bool EnableLoopTermFold = false;
5455
bool MISchedPostRA = false;
5556
bool EarlyLiveIntervals = false;
5657
bool GCEmptyBlocks = false;
58+
bool SplitStaticData = false;
5759

5860
bool DisableLSR = false;
5961
bool DisableCGP = false;
@@ -65,6 +67,9 @@ struct CGPassBuilderOption {
6567
bool DisableExpandReductions = false;
6668
bool DisableRAFSProfileLoader = false;
6769
bool DisableCFIFixup = false;
70+
bool DisableReplaceWithVecLib = false;
71+
bool DisableLayoutFSProfileLoader = false;
72+
bool DisablePrologEpilogInserterPass = false;
6873
bool PrintAfterISel = false;
6974
bool PrintISelInput = false;
7075
bool RequiresCodeGenSCCOrder = false;

llvm/lib/CodeGen/TargetPassConfig.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,12 +506,15 @@ CGPassBuilderOption llvm::getCGPassBuilderOption() {
506506
SET_BOOLEAN_OPTION(DisableCGP)
507507
SET_BOOLEAN_OPTION(DisablePartialLibcallInlining)
508508
SET_BOOLEAN_OPTION(DisableSelectOptimize)
509+
SET_BOOLEAN_OPTION(DisableReplaceWithVecLib)
510+
SET_BOOLEAN_OPTION(DisableLayoutFSProfileLoader)
509511
SET_BOOLEAN_OPTION(PrintISelInput)
510512
SET_BOOLEAN_OPTION(DebugifyAndStripAll)
511513
SET_BOOLEAN_OPTION(DebugifyCheckAndStripAll)
512514
SET_BOOLEAN_OPTION(DisableRAFSProfileLoader)
513515
SET_BOOLEAN_OPTION(DisableCFIFixup)
514516
SET_BOOLEAN_OPTION(EnableMachineFunctionSplitter)
517+
SET_BOOLEAN_OPTION(SplitStaticData)
515518

516519
return Opt;
517520
}

llvm/lib/Passes/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ add_llvm_component_library(LLVMPasses
66
PassBuilderPipelines.cpp
77
PassPlugin.cpp
88
StandardInstrumentations.cpp
9+
TargetPassBuilder.cpp
910

1011
ADDITIONAL_HEADER_DIRS
1112
${LLVM_MAIN_INCLUDE_DIR}/llvm

0 commit comments

Comments
 (0)