Skip to content

Commit fef54d0

Browse files
AMDGPU/GlobalISel: Add skeletons for new register bank select passes (#112862)
New register bank select for AMDGPU will be split in two passes: - AMDGPURegBankSelect: select banks based on machine uniformity analysis - AMDGPURegBankLegalize: lower instructions that can't be inst-selected with register banks assigned by AMDGPURegBankSelect. AMDGPURegBankLegalize is similar to legalizer but with context of uniformity analysis. Does not change already assigned banks. Main goal of AMDGPURegBankLegalize is to provide high level table-like overview of how to lower generic instructions based on available target features and uniformity info (uniform vs divergent). See RegBankLegalizeRules. Summary of new features: At the moment register bank select assigns register bank to output register using simple algorithm: - one of the inputs is vgpr output is vgpr - all inputs are sgpr output is sgpr. When function does not contain divergent control flow propagating register banks like this works. In general, first point is still correct but second is not when function contains divergent control flow. Examples: - Phi with uniform inputs that go through divergent branch - Instruction with temporal divergent use. To fix this AMDGPURegBankSelect will use machine uniformity analysis to assign vgpr to each divergent and sgpr to each uniform instruction. But some instructions are only available on VALU (for example floating point instructions before gfx1150) and we need to assign vgpr to them. Since we are no longer propagating register banks we need to ensure that uniform instructions get their inputs in sgpr in some way. In AMDGPURegBankLegalize uniform instructions that are only available on VALU will be reassigned to vgpr on all operands and read-any-lane vgpr output to original sgpr output.
1 parent 9bf6365 commit fef54d0

11 files changed

+4048
-2
lines changed

llvm/lib/Target/AMDGPU/AMDGPU.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,16 @@ void initializeAMDGPUPostLegalizerCombinerPass(PassRegistry &);
2929
FunctionPass *createAMDGPUPostLegalizeCombiner(bool IsOptNone);
3030
FunctionPass *createAMDGPURegBankCombiner(bool IsOptNone);
3131
void initializeAMDGPURegBankCombinerPass(PassRegistry &);
32+
FunctionPass *createAMDGPUGlobalISelDivergenceLoweringPass();
33+
FunctionPass *createAMDGPURegBankSelectPass();
34+
FunctionPass *createAMDGPURegBankLegalizePass();
3235

3336
// SI Passes
3437
FunctionPass *createGCNDPPCombinePass();
3538
FunctionPass *createSIAnnotateControlFlowLegacyPass();
3639
FunctionPass *createSIFoldOperandsLegacyPass();
3740
FunctionPass *createSIPeepholeSDWALegacyPass();
3841
FunctionPass *createSILowerI1CopiesLegacyPass();
39-
FunctionPass *createAMDGPUGlobalISelDivergenceLoweringPass();
4042
FunctionPass *createSIShrinkInstructionsLegacyPass();
4143
FunctionPass *createSILoadStoreOptimizerLegacyPass();
4244
FunctionPass *createSIWholeQuadModePass();
@@ -186,6 +188,12 @@ extern char &SILowerI1CopiesLegacyID;
186188
void initializeAMDGPUGlobalISelDivergenceLoweringPass(PassRegistry &);
187189
extern char &AMDGPUGlobalISelDivergenceLoweringID;
188190

191+
void initializeAMDGPURegBankSelectPass(PassRegistry &);
192+
extern char &AMDGPURegBankSelectID;
193+
194+
void initializeAMDGPURegBankLegalizePass(PassRegistry &);
195+
extern char &AMDGPURegBankLegalizeID;
196+
189197
void initializeAMDGPUMarkLastScratchLoadPass(PassRegistry &);
190198
extern char &AMDGPUMarkLastScratchLoadID;
191199

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
//===-- AMDGPURegBankLegalize.cpp -----------------------------------------===//
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+
/// Lower G_ instructions that can't be inst-selected with register bank
10+
/// assignment from AMDGPURegBankSelect based on machine uniformity info.
11+
/// Given types on all operands, some register bank assignments require lowering
12+
/// while others do not.
13+
/// Note: cases where all register bank assignments would require lowering are
14+
/// lowered in legalizer.
15+
/// For example vgpr S64 G_AND requires lowering to S32 while sgpr S64 does not.
16+
/// Eliminate sgpr S1 by lowering to sgpr S32.
17+
//
18+
//===----------------------------------------------------------------------===//
19+
20+
#include "AMDGPU.h"
21+
#include "llvm/CodeGen/MachineFunctionPass.h"
22+
#include "llvm/InitializePasses.h"
23+
24+
#define DEBUG_TYPE "amdgpu-regbanklegalize"
25+
26+
using namespace llvm;
27+
28+
namespace {
29+
30+
class AMDGPURegBankLegalize : public MachineFunctionPass {
31+
public:
32+
static char ID;
33+
34+
public:
35+
AMDGPURegBankLegalize() : MachineFunctionPass(ID) {
36+
initializeAMDGPURegBankLegalizePass(*PassRegistry::getPassRegistry());
37+
}
38+
39+
bool runOnMachineFunction(MachineFunction &MF) override;
40+
41+
StringRef getPassName() const override {
42+
return "AMDGPU Register Bank Legalize";
43+
}
44+
45+
void getAnalysisUsage(AnalysisUsage &AU) const override {
46+
MachineFunctionPass::getAnalysisUsage(AU);
47+
}
48+
49+
// If there were no phis and we do waterfall expansion machine verifier would
50+
// fail.
51+
MachineFunctionProperties getClearedProperties() const override {
52+
return MachineFunctionProperties().set(
53+
MachineFunctionProperties::Property::NoPHIs);
54+
}
55+
};
56+
57+
} // End anonymous namespace.
58+
59+
INITIALIZE_PASS_BEGIN(AMDGPURegBankLegalize, DEBUG_TYPE,
60+
"AMDGPU Register Bank Legalize", false, false)
61+
INITIALIZE_PASS_END(AMDGPURegBankLegalize, DEBUG_TYPE,
62+
"AMDGPU Register Bank Legalize", false, false)
63+
64+
char AMDGPURegBankLegalize::ID = 0;
65+
66+
char &llvm::AMDGPURegBankLegalizeID = AMDGPURegBankLegalize::ID;
67+
68+
FunctionPass *llvm::createAMDGPURegBankLegalizePass() {
69+
return new AMDGPURegBankLegalize();
70+
}
71+
72+
using namespace AMDGPU;
73+
74+
bool AMDGPURegBankLegalize::runOnMachineFunction(MachineFunction &MF) {
75+
if (MF.getProperties().hasProperty(
76+
MachineFunctionProperties::Property::FailedISel))
77+
return false;
78+
return true;
79+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
//===-- AMDGPURegBankSelect.cpp -------------------------------------------===//
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+
/// Assign register banks to all register operands of G_ instructions using
10+
/// machine uniformity analysis.
11+
/// Sgpr - uniform values and some lane masks
12+
/// Vgpr - divergent, non S1, values
13+
/// Vcc - divergent S1 values(lane masks)
14+
/// However in some cases G_ instructions with this register bank assignment
15+
/// can't be inst-selected. This is solved in AMDGPURegBankLegalize.
16+
//===----------------------------------------------------------------------===//
17+
18+
#include "AMDGPU.h"
19+
#include "llvm/CodeGen/MachineFunctionPass.h"
20+
#include "llvm/InitializePasses.h"
21+
22+
#define DEBUG_TYPE "amdgpu-regbankselect"
23+
24+
using namespace llvm;
25+
26+
namespace {
27+
28+
class AMDGPURegBankSelect : public MachineFunctionPass {
29+
public:
30+
static char ID;
31+
32+
AMDGPURegBankSelect() : MachineFunctionPass(ID) {
33+
initializeAMDGPURegBankSelectPass(*PassRegistry::getPassRegistry());
34+
}
35+
36+
bool runOnMachineFunction(MachineFunction &MF) override;
37+
38+
StringRef getPassName() const override {
39+
return "AMDGPU Register Bank Select";
40+
}
41+
42+
void getAnalysisUsage(AnalysisUsage &AU) const override {
43+
MachineFunctionPass::getAnalysisUsage(AU);
44+
}
45+
46+
// This pass assigns register banks to all virtual registers, and we maintain
47+
// this property in subsequent passes
48+
MachineFunctionProperties getSetProperties() const override {
49+
return MachineFunctionProperties().set(
50+
MachineFunctionProperties::Property::RegBankSelected);
51+
}
52+
};
53+
54+
} // End anonymous namespace.
55+
56+
INITIALIZE_PASS_BEGIN(AMDGPURegBankSelect, DEBUG_TYPE,
57+
"AMDGPU Register Bank Select", false, false)
58+
INITIALIZE_PASS_END(AMDGPURegBankSelect, DEBUG_TYPE,
59+
"AMDGPU Register Bank Select", false, false)
60+
61+
char AMDGPURegBankSelect::ID = 0;
62+
63+
char &llvm::AMDGPURegBankSelectID = AMDGPURegBankSelect::ID;
64+
65+
FunctionPass *llvm::createAMDGPURegBankSelectPass() {
66+
return new AMDGPURegBankSelect();
67+
}
68+
69+
bool AMDGPURegBankSelect::runOnMachineFunction(MachineFunction &MF) {
70+
if (MF.getProperties().hasProperty(
71+
MachineFunctionProperties::Property::FailedISel))
72+
return false;
73+
return true;
74+
}

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,12 @@ static cl::opt<bool>
448448
cl::desc("Enable AMDGPUAttributorPass"),
449449
cl::init(true), cl::Hidden);
450450

451+
static cl::opt<bool> NewRegBankSelect(
452+
"new-reg-bank-select",
453+
cl::desc("Run amdgpu-regbankselect and amdgpu-regbanklegalize instead of "
454+
"regbankselect"),
455+
cl::init(false), cl::Hidden);
456+
451457
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAMDGPUTarget() {
452458
// Register the target
453459
RegisterTargetMachine<R600TargetMachine> X(getTheR600Target());
@@ -464,6 +470,8 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAMDGPUTarget() {
464470
initializeGCNDPPCombineLegacyPass(*PR);
465471
initializeSILowerI1CopiesLegacyPass(*PR);
466472
initializeAMDGPUGlobalISelDivergenceLoweringPass(*PR);
473+
initializeAMDGPURegBankSelectPass(*PR);
474+
initializeAMDGPURegBankLegalizePass(*PR);
467475
initializeSILowerWWMCopiesPass(*PR);
468476
initializeAMDGPUMarkLastScratchLoadPass(*PR);
469477
initializeSILowerSGPRSpillsLegacyPass(*PR);
@@ -1385,7 +1393,12 @@ void GCNPassConfig::addPreRegBankSelect() {
13851393
}
13861394

13871395
bool GCNPassConfig::addRegBankSelect() {
1388-
addPass(new RegBankSelect());
1396+
if (NewRegBankSelect) {
1397+
addPass(createAMDGPURegBankSelectPass());
1398+
addPass(createAMDGPURegBankLegalizePass());
1399+
} else {
1400+
addPass(new RegBankSelect());
1401+
}
13891402
return false;
13901403
}
13911404

llvm/lib/Target/AMDGPU/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ add_llvm_target(AMDGPUCodeGen
9292
AMDGPUPromoteAlloca.cpp
9393
AMDGPUPromoteKernelArguments.cpp
9494
AMDGPURegBankCombiner.cpp
95+
AMDGPURegBankLegalize.cpp
96+
AMDGPURegBankSelect.cpp
9597
AMDGPURegisterBankInfo.cpp
9698
AMDGPURemoveIncompatibleFunctions.cpp
9799
AMDGPUReserveWWMRegs.cpp

0 commit comments

Comments
 (0)