Skip to content

Commit a2dfc9a

Browse files
authored
[NewPM][AMDGPU] Add AMDGPUPassRegistry.def (#86095)
Move the pass registry to a separate file, prepare for porting dag-isel.
1 parent 8cb2d43 commit a2dfc9a

File tree

5 files changed

+96
-104
lines changed

5 files changed

+96
-104
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
//===- AMDGPUPassRegistry.def - Registry of AMDGPU 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+
// AMDGPU backend.
11+
//
12+
//===----------------------------------------------------------------------===//
13+
14+
// NOTE: NO INCLUDE GUARD DESIRED!
15+
16+
#ifndef MODULE_PASS
17+
#define MODULE_PASS(NAME, CREATE_PASS)
18+
#endif
19+
MODULE_PASS("amdgpu-always-inline", AMDGPUAlwaysInlinePass())
20+
MODULE_PASS("amdgpu-attributor", AMDGPUAttributorPass(*this))
21+
MODULE_PASS("amdgpu-lower-buffer-fat-pointers",
22+
AMDGPULowerBufferFatPointersPass(*this))
23+
MODULE_PASS("amdgpu-lower-ctor-dtor", AMDGPUCtorDtorLoweringPass())
24+
MODULE_PASS("amdgpu-lower-module-lds", AMDGPULowerModuleLDSPass(*this))
25+
MODULE_PASS("amdgpu-printf-runtime-binding", AMDGPUPrintfRuntimeBindingPass())
26+
MODULE_PASS("amdgpu-unify-metadata", AMDGPUUnifyMetadataPass())
27+
#undef MODULE_PASS
28+
29+
#ifndef FUNCTION_PASS
30+
#define FUNCTION_PASS(NAME, CREATE_PASS)
31+
#endif
32+
FUNCTION_PASS("amdgpu-codegenprepare", AMDGPUCodeGenPreparePass(*this))
33+
FUNCTION_PASS("amdgpu-image-intrinsic-opt",
34+
AMDGPUImageIntrinsicOptimizerPass(*this))
35+
FUNCTION_PASS("amdgpu-lower-kernel-arguments",
36+
AMDGPULowerKernelArgumentsPass(*this))
37+
FUNCTION_PASS("amdgpu-lower-kernel-attributes",
38+
AMDGPULowerKernelAttributesPass())
39+
FUNCTION_PASS("amdgpu-simplifylib", AMDGPUSimplifyLibCallsPass())
40+
FUNCTION_PASS("amdgpu-promote-alloca", AMDGPUPromoteAllocaPass(*this))
41+
FUNCTION_PASS("amdgpu-promote-alloca-to-vector",
42+
AMDGPUPromoteAllocaToVectorPass(*this))
43+
FUNCTION_PASS("amdgpu-promote-kernel-arguments",
44+
AMDGPUPromoteKernelArgumentsPass())
45+
FUNCTION_PASS("amdgpu-rewrite-undef-for-phi", AMDGPURewriteUndefForPHIPass())
46+
FUNCTION_PASS("amdgpu-unify-divergent-exit-nodes",
47+
AMDGPUUnifyDivergentExitNodesPass())
48+
FUNCTION_PASS("amdgpu-usenative", AMDGPUUseNativeCallsPass())
49+
#undef FUNCTION_PASS
50+
51+
#ifndef FUNCTION_ANALYSIS
52+
#define FUNCTION_ANALYSIS(NAME, CREATE_PASS)
53+
#endif
54+
55+
#ifndef FUNCTION_ALIAS_ANALYSIS
56+
#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
57+
FUNCTION_ANALYSIS(NAME, CREATE_PASS)
58+
#endif
59+
FUNCTION_ALIAS_ANALYSIS("amdgpu-aa", AMDGPUAA())
60+
#undef FUNCTION_ALIAS_ANALYSIS
61+
#undef FUNCTION_ANALYSIS
62+
63+
#ifndef FUNCTION_PASS_WITH_PARAMS
64+
#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)
65+
#endif
66+
FUNCTION_PASS_WITH_PARAMS(
67+
"amdgpu-atomic-optimizer",
68+
"AMDGPUAtomicOptimizerPass",
69+
[=](ScanOptions Strategy) {
70+
return AMDGPUAtomicOptimizerPass(*this, Strategy);
71+
},
72+
parseAMDGPUAtomicOptimizerStrategy, "strategy=dpp|iterative|none")
73+
#undef FUNCTION_PASS_WITH_PARAMS

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

Lines changed: 17 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -631,107 +631,26 @@ void AMDGPUTargetMachine::registerDefaultAliasAnalyses(AAManager &AAM) {
631631
AAM.registerFunctionAnalysis<AMDGPUAA>();
632632
}
633633

634+
static Expected<ScanOptions>
635+
parseAMDGPUAtomicOptimizerStrategy(StringRef Params) {
636+
if (Params.empty())
637+
return ScanOptions::Iterative;
638+
Params.consume_front("strategy=");
639+
auto Result = StringSwitch<std::optional<ScanOptions>>(Params)
640+
.Case("dpp", ScanOptions::DPP)
641+
.Cases("iterative", "", ScanOptions::Iterative)
642+
.Case("none", ScanOptions::None)
643+
.Default(std::nullopt);
644+
if (Result)
645+
return *Result;
646+
return make_error<StringError>("invalid parameter", inconvertibleErrorCode());
647+
}
648+
634649
void AMDGPUTargetMachine::registerPassBuilderCallbacks(
635650
PassBuilder &PB, bool PopulateClassToPassNames) {
636-
PB.registerPipelineParsingCallback(
637-
[this](StringRef PassName, ModulePassManager &PM,
638-
ArrayRef<PassBuilder::PipelineElement>) {
639-
if (PassName == "amdgpu-attributor") {
640-
PM.addPass(AMDGPUAttributorPass(*this));
641-
return true;
642-
}
643-
if (PassName == "amdgpu-unify-metadata") {
644-
PM.addPass(AMDGPUUnifyMetadataPass());
645-
return true;
646-
}
647-
if (PassName == "amdgpu-printf-runtime-binding") {
648-
PM.addPass(AMDGPUPrintfRuntimeBindingPass());
649-
return true;
650-
}
651-
if (PassName == "amdgpu-always-inline") {
652-
PM.addPass(AMDGPUAlwaysInlinePass());
653-
return true;
654-
}
655-
if (PassName == "amdgpu-lower-module-lds") {
656-
PM.addPass(AMDGPULowerModuleLDSPass(*this));
657-
return true;
658-
}
659-
if (PassName == "amdgpu-lower-buffer-fat-pointers") {
660-
PM.addPass(AMDGPULowerBufferFatPointersPass(*this));
661-
return true;
662-
}
663-
if (PassName == "amdgpu-lower-ctor-dtor") {
664-
PM.addPass(AMDGPUCtorDtorLoweringPass());
665-
return true;
666-
}
667-
return false;
668-
});
669-
PB.registerPipelineParsingCallback(
670-
[this](StringRef PassName, FunctionPassManager &PM,
671-
ArrayRef<PassBuilder::PipelineElement>) {
672-
if (PassName == "amdgpu-simplifylib") {
673-
PM.addPass(AMDGPUSimplifyLibCallsPass());
674-
return true;
675-
}
676-
if (PassName == "amdgpu-image-intrinsic-opt") {
677-
PM.addPass(AMDGPUImageIntrinsicOptimizerPass(*this));
678-
return true;
679-
}
680-
if (PassName == "amdgpu-usenative") {
681-
PM.addPass(AMDGPUUseNativeCallsPass());
682-
return true;
683-
}
684-
if (PassName == "amdgpu-promote-alloca") {
685-
PM.addPass(AMDGPUPromoteAllocaPass(*this));
686-
return true;
687-
}
688-
if (PassName == "amdgpu-promote-alloca-to-vector") {
689-
PM.addPass(AMDGPUPromoteAllocaToVectorPass(*this));
690-
return true;
691-
}
692-
if (PassName == "amdgpu-lower-kernel-attributes") {
693-
PM.addPass(AMDGPULowerKernelAttributesPass());
694-
return true;
695-
}
696-
if (PassName == "amdgpu-promote-kernel-arguments") {
697-
PM.addPass(AMDGPUPromoteKernelArgumentsPass());
698-
return true;
699-
}
700-
if (PassName == "amdgpu-unify-divergent-exit-nodes") {
701-
PM.addPass(AMDGPUUnifyDivergentExitNodesPass());
702-
return true;
703-
}
704-
if (PassName == "amdgpu-atomic-optimizer") {
705-
PM.addPass(
706-
AMDGPUAtomicOptimizerPass(*this, AMDGPUAtomicOptimizerStrategy));
707-
return true;
708-
}
709-
if (PassName == "amdgpu-codegenprepare") {
710-
PM.addPass(AMDGPUCodeGenPreparePass(*this));
711-
return true;
712-
}
713-
if (PassName == "amdgpu-lower-kernel-arguments") {
714-
PM.addPass(AMDGPULowerKernelArgumentsPass(*this));
715-
return true;
716-
}
717-
if (PassName == "amdgpu-rewrite-undef-for-phi") {
718-
PM.addPass(AMDGPURewriteUndefForPHIPass());
719-
return true;
720-
}
721-
return false;
722-
});
723-
724-
PB.registerAnalysisRegistrationCallback([](FunctionAnalysisManager &FAM) {
725-
FAM.registerPass([&] { return AMDGPUAA(); });
726-
});
727651

728-
PB.registerParseAACallback([](StringRef AAName, AAManager &AAM) {
729-
if (AAName == "amdgpu-aa") {
730-
AAM.registerFunctionAnalysis<AMDGPUAA>();
731-
return true;
732-
}
733-
return false;
734-
});
652+
#define GET_PASS_REGISTRY "AMDGPUPassRegistry.def"
653+
#include "llvm/Passes/TargetPassRegistry.inc"
735654

736655
PB.registerPipelineStartEPCallback(
737656
[](ModulePassManager &PM, OptimizationLevel Level) {

llvm/test/CodeGen/AMDGPU/global_atomic_optimizer_fp_rtn.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2-
; RUN: opt -S -mtriple=amdgcn-- -mcpu=gfx906 -amdgpu-atomic-optimizer-strategy=Iterative -passes='amdgpu-atomic-optimizer,verify<domtree>' %s | FileCheck --check-prefixes=IR,IR-ITERATIVE %s
3-
; RUN: opt -S -mtriple=amdgcn-- -mcpu=gfx906 -amdgpu-atomic-optimizer-strategy=DPP -passes='amdgpu-atomic-optimizer,verify<domtree>' %s | FileCheck --check-prefixes=IR,IR-DPP %s
2+
; RUN: opt -S -mtriple=amdgcn-- -mcpu=gfx906 -passes='amdgpu-atomic-optimizer<strategy=iterative>,verify<domtree>' %s | FileCheck --check-prefixes=IR,IR-ITERATIVE %s
3+
; RUN: opt -S -mtriple=amdgcn-- -mcpu=gfx906 -passes='amdgpu-atomic-optimizer<strategy=dpp>,verify<domtree>' %s | FileCheck --check-prefixes=IR,IR-DPP %s
44

55
; Tests various combinations of uniform/divergent address and uniform/divergent value inputs of various types for atomic operations.
66
; Optimization remains same for Iterative and DPP strategies when value in uniform. These different scan/reduction

llvm/test/CodeGen/AMDGPU/global_atomics_iterative_scan_fp.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2-
; RUN: opt -S -mtriple=amdgcn-- -amdgpu-atomic-optimizer-strategy=Iterative -passes='amdgpu-atomic-optimizer,verify<domtree>' %s | FileCheck -check-prefix=IR-ITERATIVE %s
3-
; RUN: opt -S -mtriple=amdgcn-- -amdgpu-atomic-optimizer-strategy=DPP -passes='amdgpu-atomic-optimizer,verify<domtree>' %s | FileCheck -check-prefix=IR-DPP %s
2+
; RUN: opt -S -mtriple=amdgcn-- -passes='amdgpu-atomic-optimizer<strategy=iterative>,verify<domtree>' %s | FileCheck -check-prefix=IR-ITERATIVE %s
3+
; RUN: opt -S -mtriple=amdgcn-- -passes='amdgpu-atomic-optimizer<strategy=dpp>,verify<domtree>' %s | FileCheck -check-prefix=IR-DPP %s
44
declare i32 @llvm.amdgcn.workitem.id.x()
55
define amdgpu_kernel void @global_atomic_fadd_uni_value(ptr addrspace(1) %ptr) #0 {
66
; IR-ITERATIVE-LABEL: @global_atomic_fadd_uni_value(

llvm/test/CodeGen/AMDGPU/global_atomics_optimizer_fp_no_rtn.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2-
; RUN: opt -S -mtriple=amdgcn-- -mcpu=gfx906 -amdgpu-atomic-optimizer-strategy=Iterative -passes='amdgpu-atomic-optimizer,verify<domtree>' %s | FileCheck --check-prefixes=IR,IR-ITERATIVE %s
3-
; RUN: opt -S -mtriple=amdgcn-- -mcpu=gfx906 -amdgpu-atomic-optimizer-strategy=DPP -passes='amdgpu-atomic-optimizer,verify<domtree>' %s | FileCheck --check-prefixes=IR,IR-DPP %s
2+
; RUN: opt -S -mtriple=amdgcn-- -mcpu=gfx906 -passes='amdgpu-atomic-optimizer<strategy=iterative>,verify<domtree>' %s | FileCheck --check-prefixes=IR,IR-ITERATIVE %s
3+
; RUN: opt -S -mtriple=amdgcn-- -mcpu=gfx906 -passes='amdgpu-atomic-optimizer<strategy=dpp>,verify<domtree>' %s | FileCheck --check-prefixes=IR,IR-DPP %s
44

55
; Tests various combinations of uniform/divergent address and uniform/divergent value inputs of various types for atomic operations.
66
; Optimization remains same for Iterative and DPP strategies when value in uniform. These different scan/reduction

0 commit comments

Comments
 (0)