Skip to content

Commit f887646

Browse files
committed
[AArch64] Add AArch64PassRegistry.def
1 parent 5a3cc7b commit f887646

File tree

4 files changed

+2037
-0
lines changed

4 files changed

+2037
-0
lines changed
Lines changed: 278 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,278 @@
1+
//===- TargetPassRegistry.def - Registry of passes --------------*- 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 is used as the registry of passes in registerPassBuilderCallbacks
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
// NOTE: NO INCLUDE GUARD DESIRED!
14+
15+
#ifdef GET_PASS_REGISTRY
16+
17+
#if !__has_include(GET_PASS_REGISTRY)
18+
static_assert(false && "must provide <Target>PassRegistry.def");
19+
#endif
20+
21+
static constexpr bool HAVE_MODULE_ANALYSIS_ = std::size({
22+
"",
23+
#define MODULE_ANALYSIS(NAME, CREATE_PASS) NAME,
24+
#include GET_PASS_REGISTRY
25+
#undef MODULE_ANALYSIS
26+
}) > 1;
27+
28+
static constexpr bool HAVE_MODULE_PASS_ = std::size({
29+
"",
30+
#define MODULE_PASS(NAME, CREATE_PASS) NAME,
31+
#include GET_PASS_REGISTRY
32+
#undef MODULE_PASS
33+
}) > 1;
34+
35+
static constexpr bool HAVE_MODULE_PASS_WITH_PARAMS_ = std::size({
36+
"",
37+
#define MODULE_PASS_WITH_PARAMS(NAME, CREATE_PASS) NAME,
38+
#include GET_PASS_REGISTRY
39+
#undef MODULE_PASS_WITH_PARAMS
40+
}) > 1;
41+
42+
static constexpr bool HAVE_FUNCTION_ANALYSIS_ = std::size({
43+
"",
44+
#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) NAME,
45+
#include GET_PASS_REGISTRY
46+
#undef FUNCTION_ANALYSIS
47+
}) > 1;
48+
49+
static constexpr bool HAVE_FUNCTION_ALIAS_ANALYSIS_ = std::size({
50+
"",
51+
#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) NAME,
52+
#include GET_PASS_REGISTRY
53+
#undef FUNCTION_ALIAS_ANALYSIS
54+
}) > 1;
55+
56+
static constexpr bool HAVE_FUNCTION_PASS_ = std::size({
57+
"",
58+
#define FUNCTION_PASS(NAME, CREATE_PASS) NAME,
59+
#include GET_PASS_REGISTRY
60+
#undef FUNCTION_PASS
61+
}) > 1;
62+
63+
static constexpr bool HAVE_FUNCTION_PASS_WITH_PARAMS_ = std::size({
64+
"",
65+
#define FUNCTION_PASS_WITH_PARAMS(NAME, CREATE_PASS) NAME,
66+
#include GET_PASS_REGISTRY
67+
#undef FUNCTION_PASS_WITH_PARAMS
68+
}) > 1;
69+
70+
static constexpr bool HAVE_LOOP_PASS_ = std::size({
71+
"",
72+
#define LOOP_PASS(NAME, CREATE_PASS) NAME,
73+
#include GET_PASS_REGISTRY
74+
}) > 1;
75+
76+
static constexpr bool HAVE_MACHINE_FUNCTION_ANALYSIS_ = std::size({
77+
"",
78+
#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) NAME,
79+
#include GET_PASS_REGISTRY
80+
#undef MACHINE_FUNCTION_ANALYSIS
81+
}) > 1;
82+
83+
static constexpr bool HAVE_MACHINE_FUNCTION_PASS_ = std::size({
84+
"",
85+
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) NAME,
86+
#include GET_PASS_REGISTRY
87+
#undef MACHINE_FUNCTION_PASS
88+
}) > 1;
89+
90+
static constexpr bool HAVE_MACHINE_FUNCTION_PASS_WITH_PARAMS_ = std::size({
91+
"",
92+
#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CREATE_PASS) NAME,
93+
#include GET_PASS_REGISTRY
94+
#undef MACHINE_FUNCTION_PASS_WITH_PARAMS
95+
}) > 1;
96+
97+
if (PopulateClassToPassNames) {
98+
auto *PIC = PB.getPassInstrumentationCallbacks();
99+
100+
#define ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS) \
101+
PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
102+
103+
#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
104+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
105+
#define MODULE_PASS(NAME, CREATE_PASS) \
106+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
107+
#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
108+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
109+
#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
110+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
111+
#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
112+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
113+
#define FUNCTION_PASS(NAME, CREATE_PASS) \
114+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
115+
#define FUNCTION_PASS_WITH_PARAMS(NAME, CREATE_PASS) \
116+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
117+
#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
118+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
119+
#define LOOP_PASS(NAME, CREATE_PASS) \
120+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
121+
#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
122+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
123+
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
124+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
125+
#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CREATE_PASS) \
126+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
127+
#include GET_PASS_REGISTRY
128+
#undef MODULE_ANALYSIS
129+
#undef MODULE_PASS
130+
#undef MODULE_PASS_WITH_PARAMS
131+
#undef FUNCTION_ANALYSIS
132+
#undef FUNCTION_PASS
133+
#undef FUNCTION_PASS_WITH_PARAMS
134+
#undef MACHINE_FUNCTION_ANALYSIS
135+
#undef MACHINE_FUNCTION_PASS
136+
#undef MACHINE_FUNCTION_PASS_WITH_PARAMS
137+
#undef ADD_CLASS_PASS_TO_PASS_NAME
138+
}
139+
140+
#define ADD_PASS(NAME, CREATE_PASS) \
141+
if (Name == NAME) { \
142+
PM.addPass(CREATE_PASS); \
143+
return true; \
144+
}
145+
146+
#define ADD_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER) \
147+
if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
148+
auto Params = PassBuilder::parsePassParameters(PARSER, Name, NAME); \
149+
if (!Params) \
150+
return Params.takeError(); \
151+
PM.addPass(CREATE_PASS(Params.get())); \
152+
return true; \
153+
}
154+
155+
if constexpr (HAVE_MODULE_PASS_) {
156+
PB.registerPipelineParsingCallback(
157+
[=](StringRef Name, ModulePassManager &PM,
158+
ArrayRef<PassBuilder::PipelineElement>) {
159+
#define MODULE_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
160+
#include GET_PASS_REGISTRY
161+
#undef MODULE_PASS
162+
return false;
163+
});
164+
}
165+
166+
if constexpr (HAVE_MODULE_PASS_WITH_PARAMS_) {
167+
PB.registerPipelineParsingCallback(
168+
[=](StringRef Name, ModulePassManager &PM,
169+
ArrayRef<PassBuilder::PipelineElement>) {
170+
#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
171+
ADD_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER)
172+
#include GET_PASS_REGISTRY
173+
#undef MODULE_PASS_WITH_PARAMS
174+
return false;
175+
});
176+
}
177+
178+
if constexpr (HAVE_FUNCTION_PASS_) {
179+
PB.registerPipelineParsingCallback(
180+
[=](StringRef Name, FunctionPassManager &PM,
181+
ArrayRef<PassBuilder::PipelineElement>) {
182+
#define FUNCTION_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
183+
#include GET_PASS_REGISTRY
184+
#undef FUNCTION_PASS
185+
return false;
186+
});
187+
}
188+
189+
if constexpr (HAVE_FUNCTION_PASS_WITH_PARAMS_) {
190+
PB.registerPipelineParsingCallback(
191+
[=](StringRef Name, FunctionPassManager &PM,
192+
ArrayRef<PassBuilder::PipelineElement>) {
193+
#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
194+
ADD_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER)
195+
#include GET_PASS_REGISTRY
196+
#undef FUNCTION_PASS_WITH_PARAMS
197+
return false;
198+
});
199+
}
200+
201+
if constexpr (HAVE_LOOP_PASS_) {
202+
PB.registerPipelineParsingCallback(
203+
[=](StringRef Name, LoopPassManager &PM,
204+
ArrayRef<PassBuilder::PipelineElement>) {
205+
#define LOOP_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
206+
#include GET_PASS_REGISTRY
207+
return false;
208+
});
209+
}
210+
211+
if constexpr (HAVE_MACHINE_FUNCTION_PASS_) {
212+
PB.registerPipelineParsingCallback(
213+
[=](StringRef Name, MachineFunctionPassManager &PM,
214+
ArrayRef<PassBuilder::PipelineElement>) {
215+
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
216+
#include GET_PASS_REGISTRY
217+
return false;
218+
});
219+
}
220+
221+
if constexpr (HAVE_MACHINE_FUNCTION_PASS_WITH_PARAMS_) {
222+
PB.registerPipelineParsingCallback(
223+
[=](StringRef Name, FunctionPassManager &PM,
224+
ArrayRef<PassBuilder::PipelineElement>) {
225+
#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
226+
PARAMS) \
227+
ADD_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER)
228+
#include GET_PASS_REGISTRY
229+
#undef MACHINE_FUNCTION_PASS_WITH_PARAMS
230+
return false;
231+
});
232+
}
233+
#undef ADD_PASS
234+
#undef ADD_PASS_WITH_PARAMS
235+
236+
if constexpr (HAVE_MODULE_ANALYSIS_) {
237+
PB.registerAnalysisRegistrationCallback([](ModuleAnalysisManager &AM) {
238+
#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
239+
AM.registerPass([&] { return CREATE_PASS; });
240+
#include GET_PASS_REGISTRY
241+
#undef MODULE_ANALYSIS
242+
});
243+
}
244+
245+
if constexpr (HAVE_FUNCTION_ANALYSIS_) {
246+
PB.registerAnalysisRegistrationCallback([](FunctionAnalysisManager &AM) {
247+
#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
248+
AM.registerPass([&] { return CREATE_PASS; });
249+
#include GET_PASS_REGISTRY
250+
#undef FUNCTION_ANALYSIS
251+
});
252+
}
253+
254+
if constexpr (HAVE_FUNCTION_ALIAS_ANALYSIS_) {
255+
PB.registerParseAACallback([](StringRef AAName, AAManager &AAM) {
256+
#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
257+
if (Name == NAME) { \
258+
AA.registerFunctionAnalysis< \
259+
std::remove_reference_t<decltype(CREATE_PASS)>>(); \
260+
return true; \
261+
}
262+
#include GET_PASS_REGISTRY
263+
#undef FUNCTION_ANALYSIS
264+
return false;
265+
});
266+
}
267+
268+
if constexpr (HAVE_MACHINE_FUNCTION_ANALYSIS_) {
269+
PB.registerAnalysisRegistrationCallback(
270+
[](MachineFunctionAnalysisManager &AM) {
271+
#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
272+
AM.registerPass([&] { return CREATE_PASS; });
273+
#include GET_PASS_REGISTRY
274+
#undef MACHINE_FUNCTION_ANALYSIS
275+
});
276+
}
277+
#undef GET_PASS_REGISTRY
278+
#endif // GET_PASS_REGISTRY
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//===- AArch64PassRegistry.def - Registry of AArch64 passes -----*- 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 is used as the registry of passes that are part of the
10+
// AArch64 backend.
11+
//
12+
//===----------------------------------------------------------------------===//
13+
14+
// NOTE: NO INCLUDE GUARD DESIRED!
15+
16+
#ifndef LOOP_PASS
17+
#define LOOP_PASS(NAME, CREATE_PASS)
18+
#endif
19+
LOOP_PASS("aarch64-lit", AArch64LoopIdiomTransformPass())
20+
#undef LOOP_PASS

llvm/lib/Target/AArch64/AArch64TargetMachine.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,10 @@ class AArch64PassConfig : public TargetPassConfig {
547547

548548
void AArch64TargetMachine::registerPassBuilderCallbacks(
549549
PassBuilder &PB, bool PopulateClassToPassNames) {
550+
551+
#define GET_PASS_REGISTRY "AArch64PassRegistry.def"
552+
#include "llvm/Passes/TargetPassRegistry.inc"
553+
550554
PB.registerLateLoopOptimizationsEPCallback(
551555
[=](LoopPassManager &LPM, OptimizationLevel Level) {
552556
LPM.addPass(AArch64LoopIdiomTransformPass());

0 commit comments

Comments
 (0)