Skip to content

Commit 12edbe2

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

File tree

4 files changed

+2093
-0
lines changed

4 files changed

+2093
-0
lines changed
Lines changed: 334 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,334 @@
1+
//===- TargetPassRegistry.inc - 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+
#error "must provide <Target>PassRegistry.def"
19+
#endif
20+
21+
{
22+
23+
// FIXME: use std::size when MSVC_MIN >= 19.30
24+
25+
static constexpr bool HAVE_MODULE_ANALYSIS_ =
26+
std::array{
27+
"",
28+
#define MODULE_ANALYSIS(NAME, CREATE_PASS) NAME,
29+
#include GET_PASS_REGISTRY
30+
#undef MODULE_ANALYSIS
31+
}
32+
.size() > 1;
33+
34+
static constexpr bool HAVE_MODULE_PASS_ =
35+
std::array{
36+
"",
37+
#define MODULE_PASS(NAME, CREATE_PASS) NAME,
38+
#include GET_PASS_REGISTRY
39+
#undef MODULE_PASS
40+
}
41+
.size() > 1;
42+
43+
static constexpr bool HAVE_MODULE_PASS_WITH_PARAMS_ =
44+
std::array{
45+
"",
46+
#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) NAME,
47+
#include GET_PASS_REGISTRY
48+
#undef MODULE_PASS_WITH_PARAMS
49+
}
50+
.size() > 1;
51+
52+
static constexpr bool HAVE_FUNCTION_ANALYSIS_ =
53+
std::array{
54+
"",
55+
#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) NAME,
56+
#include GET_PASS_REGISTRY
57+
#undef FUNCTION_ANALYSIS
58+
}
59+
.size() > 1;
60+
61+
static constexpr bool HAVE_FUNCTION_ALIAS_ANALYSIS_ =
62+
std::array{
63+
"",
64+
#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) NAME,
65+
#include GET_PASS_REGISTRY
66+
#undef FUNCTION_ALIAS_ANALYSIS
67+
}
68+
.size() > 1;
69+
70+
static constexpr bool HAVE_FUNCTION_PASS_ =
71+
std::array{
72+
"",
73+
#define FUNCTION_PASS(NAME, CREATE_PASS) NAME,
74+
#include GET_PASS_REGISTRY
75+
#undef FUNCTION_PASS
76+
}
77+
.size() > 1;
78+
79+
static constexpr bool HAVE_FUNCTION_PASS_WITH_PARAMS_ =
80+
std::array{
81+
"",
82+
#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
83+
NAME,
84+
#include GET_PASS_REGISTRY
85+
#undef FUNCTION_PASS_WITH_PARAMS
86+
}
87+
.size() > 1;
88+
89+
static constexpr bool HAVE_LOOP_ANALYSIS_ =
90+
std::array{
91+
"",
92+
#define LOOP_ANALYSIS(NAME, CREATE_PASS) NAME,
93+
#include GET_PASS_REGISTRY
94+
#undef LOOP_ANALYSIS
95+
}
96+
.size() > 1;
97+
98+
static constexpr bool HAVE_LOOP_PASS_ =
99+
std::array{
100+
"",
101+
#define LOOP_PASS(NAME, CREATE_PASS) NAME,
102+
#include GET_PASS_REGISTRY
103+
#undef LOOP_PASS
104+
}
105+
.size() > 1;
106+
107+
static constexpr bool HAVE_MACHINE_FUNCTION_ANALYSIS_ =
108+
std::array{
109+
"",
110+
#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) NAME,
111+
#include GET_PASS_REGISTRY
112+
#undef MACHINE_FUNCTION_ANALYSIS
113+
}
114+
.size() > 1;
115+
116+
static constexpr bool HAVE_MACHINE_FUNCTION_PASS_ =
117+
std::array{
118+
"",
119+
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) NAME,
120+
#include GET_PASS_REGISTRY
121+
#undef MACHINE_FUNCTION_PASS
122+
}
123+
.size() > 1;
124+
125+
static constexpr bool HAVE_MACHINE_FUNCTION_PASS_WITH_PARAMS_ =
126+
std::array{
127+
"",
128+
#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
129+
PARAMS) \
130+
NAME,
131+
#include GET_PASS_REGISTRY
132+
#undef MACHINE_FUNCTION_PASS_WITH_PARAMS
133+
}
134+
.size() > 1;
135+
136+
if (PopulateClassToPassNames) {
137+
auto *PIC = PB.getPassInstrumentationCallbacks();
138+
139+
#define ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS) \
140+
PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
141+
#define ADD_CLASS_PASS_TO_PASS_NAME_WITH_PARAMS(NAME, CLASS) \
142+
PIC->addClassToPassName(CLASS, NAME);
143+
144+
#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
145+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
146+
#define MODULE_PASS(NAME, CREATE_PASS) \
147+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
148+
#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
149+
ADD_CLASS_PASS_TO_PASS_NAME_WITH_PARAMS(NAME, CLASS)
150+
#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
151+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
152+
#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
153+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
154+
#define FUNCTION_PASS(NAME, CREATE_PASS) \
155+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
156+
#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
157+
ADD_CLASS_PASS_TO_PASS_NAME_WITH_PARAMS(NAME, CLASS)
158+
#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
159+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
160+
#define LOOP_PASS(NAME, CREATE_PASS) \
161+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
162+
#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
163+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
164+
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
165+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
166+
#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
167+
PARAMS) \
168+
ADD_CLASS_PASS_TO_PASS_NAME_WITH_PARAMS(NAME, CREATE_PASS)
169+
#include GET_PASS_REGISTRY
170+
#undef MODULE_ANALYSIS
171+
#undef MODULE_PASS
172+
#undef MODULE_PASS_WITH_PARAMS
173+
#undef FUNCTION_ANALYSIS
174+
#undef FUNCTION_PASS
175+
#undef FUNCTION_PASS_WITH_PARAMS
176+
#undef LOOP_ANALYSIS
177+
#undef LOOP_PASS
178+
#undef MACHINE_FUNCTION_ANALYSIS
179+
#undef MACHINE_FUNCTION_PASS
180+
#undef MACHINE_FUNCTION_PASS_WITH_PARAMS
181+
#undef ADD_CLASS_PASS_TO_PASS_NAME
182+
#undef ADD_CLASS_PASS_TO_PASS_NAME_WITH_PARAMS
183+
}
184+
185+
#define ADD_PASS(NAME, CREATE_PASS) \
186+
if (Name == NAME) { \
187+
PM.addPass(CREATE_PASS); \
188+
return true; \
189+
}
190+
191+
#define ADD_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER) \
192+
if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
193+
auto Params = PassBuilder::parsePassParameters(PARSER, Name, NAME); \
194+
if (!Params) \
195+
return false; \
196+
PM.addPass(CREATE_PASS(Params.get())); \
197+
return true; \
198+
}
199+
200+
if constexpr (HAVE_MODULE_PASS_) {
201+
PB.registerPipelineParsingCallback(
202+
[=](StringRef Name, ModulePassManager &PM,
203+
ArrayRef<PassBuilder::PipelineElement>) {
204+
#define MODULE_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
205+
#include GET_PASS_REGISTRY
206+
#undef MODULE_PASS
207+
return false;
208+
});
209+
}
210+
211+
if constexpr (HAVE_MODULE_PASS_WITH_PARAMS_) {
212+
PB.registerPipelineParsingCallback(
213+
[=](StringRef Name, ModulePassManager &PM,
214+
ArrayRef<PassBuilder::PipelineElement>) {
215+
#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
216+
ADD_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER)
217+
#include GET_PASS_REGISTRY
218+
#undef MODULE_PASS_WITH_PARAMS
219+
return false;
220+
});
221+
}
222+
223+
if constexpr (HAVE_FUNCTION_PASS_) {
224+
PB.registerPipelineParsingCallback(
225+
[=](StringRef Name, FunctionPassManager &PM,
226+
ArrayRef<PassBuilder::PipelineElement>) {
227+
#define FUNCTION_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
228+
#include GET_PASS_REGISTRY
229+
#undef FUNCTION_PASS
230+
return false;
231+
});
232+
}
233+
234+
if constexpr (HAVE_FUNCTION_PASS_WITH_PARAMS_) {
235+
PB.registerPipelineParsingCallback(
236+
[=](StringRef Name, FunctionPassManager &PM,
237+
ArrayRef<PassBuilder::PipelineElement>) {
238+
#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
239+
ADD_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER)
240+
#include GET_PASS_REGISTRY
241+
#undef FUNCTION_PASS_WITH_PARAMS
242+
return false;
243+
});
244+
}
245+
246+
if constexpr (HAVE_LOOP_PASS_) {
247+
PB.registerPipelineParsingCallback(
248+
[=](StringRef Name, LoopPassManager &PM,
249+
ArrayRef<PassBuilder::PipelineElement>) {
250+
#define LOOP_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
251+
#include GET_PASS_REGISTRY
252+
return false;
253+
});
254+
}
255+
256+
if constexpr (HAVE_MACHINE_FUNCTION_PASS_) {
257+
PB.registerPipelineParsingCallback(
258+
[=](StringRef Name, MachineFunctionPassManager &PM,
259+
ArrayRef<PassBuilder::PipelineElement>) {
260+
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
261+
#include GET_PASS_REGISTRY
262+
return false;
263+
});
264+
}
265+
266+
if constexpr (HAVE_MACHINE_FUNCTION_PASS_WITH_PARAMS_) {
267+
PB.registerPipelineParsingCallback(
268+
[=](StringRef Name, FunctionPassManager &PM,
269+
ArrayRef<PassBuilder::PipelineElement>) {
270+
#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
271+
PARAMS) \
272+
ADD_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER)
273+
#include GET_PASS_REGISTRY
274+
#undef MACHINE_FUNCTION_PASS_WITH_PARAMS
275+
return false;
276+
});
277+
}
278+
#undef ADD_PASS
279+
#undef ADD_PASS_WITH_PARAMS
280+
281+
if constexpr (HAVE_MODULE_ANALYSIS_) {
282+
PB.registerAnalysisRegistrationCallback([](ModuleAnalysisManager &AM) {
283+
#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
284+
AM.registerPass([&] { return CREATE_PASS; });
285+
#include GET_PASS_REGISTRY
286+
#undef MODULE_ANALYSIS
287+
});
288+
}
289+
290+
if constexpr (HAVE_FUNCTION_ANALYSIS_) {
291+
PB.registerAnalysisRegistrationCallback([](FunctionAnalysisManager &AM) {
292+
#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
293+
AM.registerPass([&] { return CREATE_PASS; });
294+
#include GET_PASS_REGISTRY
295+
#undef FUNCTION_ANALYSIS
296+
});
297+
}
298+
299+
if constexpr (HAVE_FUNCTION_ALIAS_ANALYSIS_) {
300+
PB.registerParseAACallback([](StringRef Name, AAManager &AM) {
301+
#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
302+
if (Name == NAME) { \
303+
AM.registerFunctionAnalysis< \
304+
std::remove_reference_t<decltype(CREATE_PASS)>>(); \
305+
return true; \
306+
}
307+
#include GET_PASS_REGISTRY
308+
#undef FUNCTION_ANALYSIS
309+
return false;
310+
});
311+
}
312+
313+
if constexpr (HAVE_LOOP_ANALYSIS_) {
314+
PB.registerAnalysisRegistrationCallback([](LoopAnalysisManager &AM) {
315+
#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
316+
AM.registerPass([&] { return CREATE_PASS; });
317+
#include GET_PASS_REGISTRY
318+
#undef LOOP_ANALYSIS
319+
});
320+
}
321+
322+
if constexpr (HAVE_MACHINE_FUNCTION_ANALYSIS_) {
323+
PB.registerAnalysisRegistrationCallback(
324+
[](MachineFunctionAnalysisManager &AM) {
325+
#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
326+
AM.registerPass([&] { return CREATE_PASS; });
327+
#include GET_PASS_REGISTRY
328+
#undef MACHINE_FUNCTION_ANALYSIS
329+
});
330+
}
331+
}
332+
333+
#undef GET_PASS_REGISTRY
334+
#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)