Skip to content

Commit 29bf32e

Browse files
authored
[NewPM][AArch64] Add AArch64PassRegistry.def (llvm#85215)
PR llvm#83567 ports `SelectionDAGISel` to the new pass manager, then each backend should provide `<Target>DagToDagISel()` in new pass manager style. Then each target should provide `<Target>PassRegistry.def` to register backend passes in `registerPassBuilderCallbacks` to reduce duplicate code. This PR adds `AArch64PassRegistry.def` to AArch64 backend and boilerplate code in `registerPassBuilderCallbacks`.
1 parent deefe3f commit 29bf32e

File tree

4 files changed

+219
-0
lines changed

4 files changed

+219
-0
lines changed
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
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+
// Just put the following lines in the body of registerPassBuilderCallbacks:
11+
// #define GET_PASS_REGISTRY "<Target>PassRegistry.def"
12+
// #include "llvm/Passes/TargetPassRegistry.inc"
13+
//
14+
//===----------------------------------------------------------------------===//
15+
16+
// NOTE: NO INCLUDE GUARD DESIRED!
17+
18+
#ifdef GET_PASS_REGISTRY
19+
20+
#if !__has_include(GET_PASS_REGISTRY)
21+
#error "must provide <Target>PassRegistry.def"
22+
#endif
23+
24+
if (PopulateClassToPassNames) {
25+
auto *PIC = PB.getPassInstrumentationCallbacks();
26+
27+
#define ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS) \
28+
PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
29+
#define ADD_CLASS_PASS_TO_PASS_NAME_WITH_PARAMS(NAME, CLASS) \
30+
PIC->addClassToPassName(CLASS, NAME);
31+
32+
#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
33+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
34+
#define MODULE_PASS(NAME, CREATE_PASS) \
35+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
36+
#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
37+
ADD_CLASS_PASS_TO_PASS_NAME_WITH_PARAMS(NAME, CLASS)
38+
#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
39+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
40+
#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
41+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
42+
#define FUNCTION_PASS(NAME, CREATE_PASS) \
43+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
44+
#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
45+
ADD_CLASS_PASS_TO_PASS_NAME_WITH_PARAMS(NAME, CLASS)
46+
#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
47+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
48+
#define LOOP_PASS(NAME, CREATE_PASS) \
49+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
50+
#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
51+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
52+
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
53+
ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
54+
#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
55+
PARAMS) \
56+
ADD_CLASS_PASS_TO_PASS_NAME_WITH_PARAMS(NAME, CLASS)
57+
#include GET_PASS_REGISTRY
58+
#undef MODULE_ANALYSIS
59+
#undef MODULE_PASS
60+
#undef MODULE_PASS_WITH_PARAMS
61+
#undef FUNCTION_ANALYSIS
62+
#undef FUNCTION_ALIAS_ANALYSIS
63+
#undef FUNCTION_PASS
64+
#undef FUNCTION_PASS_WITH_PARAMS
65+
#undef LOOP_ANALYSIS
66+
#undef LOOP_PASS
67+
#undef MACHINE_FUNCTION_ANALYSIS
68+
#undef MACHINE_FUNCTION_PASS
69+
#undef MACHINE_FUNCTION_PASS_WITH_PARAMS
70+
#undef ADD_CLASS_PASS_TO_PASS_NAME
71+
#undef ADD_CLASS_PASS_TO_PASS_NAME_WITH_PARAMS
72+
}
73+
74+
#define ADD_PASS(NAME, CREATE_PASS) \
75+
if (Name == NAME) { \
76+
PM.addPass(CREATE_PASS); \
77+
return true; \
78+
}
79+
80+
#define ADD_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER) \
81+
if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
82+
auto Params = PassBuilder::parsePassParameters(PARSER, Name, NAME); \
83+
if (!Params) \
84+
return false; \
85+
PM.addPass(CREATE_PASS(Params.get())); \
86+
return true; \
87+
}
88+
89+
PB.registerPipelineParsingCallback([=](StringRef Name, ModulePassManager &PM,
90+
ArrayRef<PassBuilder::PipelineElement>) {
91+
#define MODULE_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
92+
#include GET_PASS_REGISTRY
93+
#undef MODULE_PASS
94+
return false;
95+
});
96+
97+
PB.registerPipelineParsingCallback([=](StringRef Name, ModulePassManager &PM,
98+
ArrayRef<PassBuilder::PipelineElement>) {
99+
#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
100+
ADD_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER)
101+
#include GET_PASS_REGISTRY
102+
#undef MODULE_PASS_WITH_PARAMS
103+
return false;
104+
});
105+
106+
PB.registerPipelineParsingCallback([=](StringRef Name, FunctionPassManager &PM,
107+
ArrayRef<PassBuilder::PipelineElement>) {
108+
#define FUNCTION_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
109+
#include GET_PASS_REGISTRY
110+
#undef FUNCTION_PASS
111+
return false;
112+
});
113+
114+
PB.registerPipelineParsingCallback([=](StringRef Name, FunctionPassManager &PM,
115+
ArrayRef<PassBuilder::PipelineElement>) {
116+
#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
117+
ADD_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER)
118+
#include GET_PASS_REGISTRY
119+
#undef FUNCTION_PASS_WITH_PARAMS
120+
return false;
121+
});
122+
123+
PB.registerPipelineParsingCallback([=](StringRef Name, LoopPassManager &PM,
124+
ArrayRef<PassBuilder::PipelineElement>) {
125+
#define LOOP_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
126+
#include GET_PASS_REGISTRY
127+
return false;
128+
});
129+
130+
PB.registerPipelineParsingCallback([=](StringRef Name,
131+
MachineFunctionPassManager &PM,
132+
ArrayRef<PassBuilder::PipelineElement>) {
133+
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
134+
#include GET_PASS_REGISTRY
135+
return false;
136+
});
137+
138+
PB.registerPipelineParsingCallback([=](StringRef Name, FunctionPassManager &PM,
139+
ArrayRef<PassBuilder::PipelineElement>) {
140+
#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
141+
PARAMS) \
142+
ADD_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER)
143+
#include GET_PASS_REGISTRY
144+
#undef MACHINE_FUNCTION_PASS_WITH_PARAMS
145+
return false;
146+
});
147+
148+
#undef ADD_PASS
149+
#undef ADD_PASS_WITH_PARAMS
150+
151+
PB.registerAnalysisRegistrationCallback([](ModuleAnalysisManager &AM) {
152+
#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
153+
AM.registerPass([&] { return CREATE_PASS; });
154+
#include GET_PASS_REGISTRY
155+
#undef MODULE_ANALYSIS
156+
});
157+
158+
PB.registerAnalysisRegistrationCallback([](FunctionAnalysisManager &AM) {
159+
#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
160+
AM.registerPass([&] { return CREATE_PASS; });
161+
#include GET_PASS_REGISTRY
162+
#undef FUNCTION_ANALYSIS
163+
});
164+
165+
PB.registerParseAACallback([](StringRef Name, AAManager &AM) {
166+
#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
167+
if (Name == NAME) { \
168+
AM.registerFunctionAnalysis< \
169+
std::remove_reference_t<decltype(CREATE_PASS)>>(); \
170+
return true; \
171+
}
172+
#include GET_PASS_REGISTRY
173+
#undef FUNCTION_ALIAS_ANALYSIS
174+
return false;
175+
});
176+
177+
PB.registerAnalysisRegistrationCallback([](LoopAnalysisManager &AM) {
178+
#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
179+
AM.registerPass([&] { return CREATE_PASS; });
180+
#include GET_PASS_REGISTRY
181+
#undef LOOP_ANALYSIS
182+
});
183+
184+
PB.registerAnalysisRegistrationCallback([](MachineFunctionAnalysisManager &AM) {
185+
#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
186+
AM.registerPass([&] { return CREATE_PASS; });
187+
#include GET_PASS_REGISTRY
188+
#undef MACHINE_FUNCTION_ANALYSIS
189+
});
190+
191+
#undef GET_PASS_REGISTRY
192+
#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());

llvm/test/Transforms/LoopIdiom/AArch64/byte-compare-index.ll

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
; RUN: opt -aarch64-lit -aarch64-lit-verify -verify-dom-info -mtriple aarch64-unknown-linux-gnu -mattr=+sve -S < %s | FileCheck %s
33
; RUN: opt -aarch64-lit -simplifycfg -mtriple aarch64-unknown-linux-gnu -mattr=+sve -S < %s | FileCheck %s --check-prefix=LOOP-DEL
44
; RUN: opt -aarch64-lit -mtriple aarch64-unknown-linux-gnu -S < %s | FileCheck %s --check-prefix=NO-TRANSFORM
5+
; RUN: opt -p aarch64-lit -aarch64-lit-verify -verify-dom-info -mtriple aarch64-unknown-linux-gnu -mattr=+sve -S < %s | FileCheck %s
6+
; RUN: opt -passes='function(loop(aarch64-lit)),simplifycfg' -mtriple aarch64-unknown-linux-gnu -mattr=+sve -S < %s | FileCheck %s --check-prefix=LOOP-DEL
7+
; RUN: opt -p aarch64-lit -mtriple aarch64-unknown-linux-gnu -S < %s | FileCheck %s --check-prefix=NO-TRANSFORM
58

69
define i32 @compare_bytes_simple(ptr %a, ptr %b, i32 %len, i32 %extra, i32 %n) {
710
; CHECK-LABEL: define i32 @compare_bytes_simple(

0 commit comments

Comments
 (0)