Skip to content

Commit a79db96

Browse files
authored
[GISel][TableGen] Generate getRegBankFromRegClass (#99896)
Generating the mapping from a register class to a register bank is complex: - there can be lots of register classes - the mapping may be ambiguos - a register class can span several register banks (e.g. a register class containing all registers) - the type information is not enough to decide which register bank to map to (e.g. a register class containing floating point and vector registers, and all register can represent a f64 value) The approach taken here is to encode the register banks in an array indexed by the ID of the register class. To save space, the entries are packed into chunks of size 2^n.
1 parent b2b68c2 commit a79db96

17 files changed

+143
-229
lines changed

llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp

Lines changed: 2 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -241,57 +241,12 @@ unsigned AArch64RegisterBankInfo::copyCost(const RegisterBank &A,
241241

242242
const RegisterBank &
243243
AArch64RegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
244-
LLT) const {
244+
LLT Ty) const {
245245
switch (RC.getID()) {
246-
case AArch64::FPR8RegClassID:
247-
case AArch64::FPR16RegClassID:
248-
case AArch64::FPR16_loRegClassID:
249-
case AArch64::FPR32_with_hsub_in_FPR16_loRegClassID:
250-
case AArch64::FPR32RegClassID:
251-
case AArch64::FPR64RegClassID:
252-
case AArch64::FPR128RegClassID:
253-
case AArch64::FPR64_loRegClassID:
254-
case AArch64::FPR128_loRegClassID:
255-
case AArch64::FPR128_0to7RegClassID:
256-
case AArch64::DDRegClassID:
257-
case AArch64::DDDRegClassID:
258-
case AArch64::DDDDRegClassID:
259-
case AArch64::QQRegClassID:
260-
case AArch64::QQQRegClassID:
261-
case AArch64::QQQQRegClassID:
262-
case AArch64::ZPRRegClassID:
263-
case AArch64::ZPR_3bRegClassID:
264-
return getRegBank(AArch64::FPRRegBankID);
265-
case AArch64::GPR32commonRegClassID:
266-
case AArch64::GPR32RegClassID:
267-
case AArch64::GPR32spRegClassID:
268-
case AArch64::GPR32sponlyRegClassID:
269-
case AArch64::GPR32argRegClassID:
270-
case AArch64::GPR32allRegClassID:
271-
case AArch64::GPR64commonRegClassID:
272-
case AArch64::GPR64RegClassID:
273-
case AArch64::GPR64spRegClassID:
274246
case AArch64::GPR64sponlyRegClassID:
275-
case AArch64::GPR64argRegClassID:
276-
case AArch64::GPR64allRegClassID:
277-
case AArch64::GPR64noipRegClassID:
278-
case AArch64::GPR64common_and_GPR64noipRegClassID:
279-
case AArch64::GPR64noip_and_tcGPR64RegClassID:
280-
case AArch64::tcGPR64RegClassID:
281-
case AArch64::tcGPRx16x17RegClassID:
282-
case AArch64::tcGPRx17RegClassID:
283-
case AArch64::tcGPRnotx16RegClassID:
284-
case AArch64::WSeqPairsClassRegClassID:
285-
case AArch64::XSeqPairsClassRegClassID:
286-
case AArch64::MatrixIndexGPR32_8_11RegClassID:
287-
case AArch64::MatrixIndexGPR32_12_15RegClassID:
288-
case AArch64::GPR64_with_sub_32_in_MatrixIndexGPR32_8_11RegClassID:
289-
case AArch64::GPR64_with_sub_32_in_MatrixIndexGPR32_12_15RegClassID:
290247
return getRegBank(AArch64::GPRRegBankID);
291-
case AArch64::CCRRegClassID:
292-
return getRegBank(AArch64::CCRegBankID);
293248
default:
294-
llvm_unreachable("Register class not supported");
249+
return AArch64GenRegisterBankInfo::getRegBankFromRegClass(RC, Ty);
295250
}
296251
}
297252

llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ class AArch64RegisterBankInfo final : public AArch64GenRegisterBankInfo {
150150
TypeSize Size) const override;
151151

152152
const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC,
153-
LLT) const override;
153+
LLT Ty) const override;
154154

155155
InstructionMappings
156156
getInstrAlternativeMappings(const MachineInstr &MI) const override;

llvm/lib/Target/ARM/ARMRegisterBankInfo.cpp

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -170,44 +170,6 @@ ARMRegisterBankInfo::ARMRegisterBankInfo(const TargetRegisterInfo &TRI) {
170170
llvm::call_once(InitializeRegisterBankFlag, InitializeRegisterBankOnce);
171171
}
172172

173-
const RegisterBank &
174-
ARMRegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
175-
LLT) const {
176-
using namespace ARM;
177-
178-
switch (RC.getID()) {
179-
case GPRRegClassID:
180-
case GPRwithAPSRRegClassID:
181-
case GPRnoipRegClassID:
182-
case GPRnopcRegClassID:
183-
case GPRnoip_and_GPRnopcRegClassID:
184-
case rGPRRegClassID:
185-
case GPRspRegClassID:
186-
case tcGPRRegClassID:
187-
case tcGPRnotr12RegClassID:
188-
case tGPRRegClassID:
189-
case tGPREvenRegClassID:
190-
case tGPROddRegClassID:
191-
case tGPR_and_tGPREvenRegClassID:
192-
case tGPR_and_tGPROddRegClassID:
193-
case tGPREven_and_tcGPRRegClassID:
194-
case tGPROdd_and_tcGPRRegClassID:
195-
case tGPREven_and_tcGPRnotr12RegClassID:
196-
return getRegBank(ARM::GPRRegBankID);
197-
case HPRRegClassID:
198-
case SPR_8RegClassID:
199-
case SPRRegClassID:
200-
case DPR_8RegClassID:
201-
case DPRRegClassID:
202-
case QPRRegClassID:
203-
return getRegBank(ARM::FPRRegBankID);
204-
default:
205-
llvm_unreachable("Unsupported register kind");
206-
}
207-
208-
llvm_unreachable("Switch should handle all register classes");
209-
}
210-
211173
const RegisterBankInfo::InstructionMapping &
212174
ARMRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
213175
auto Opc = MI.getOpcode();

llvm/lib/Target/ARM/ARMRegisterBankInfo.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,6 @@ class ARMRegisterBankInfo final : public ARMGenRegisterBankInfo {
3232
public:
3333
ARMRegisterBankInfo(const TargetRegisterInfo &TRI);
3434

35-
const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC,
36-
LLT) const override;
37-
3835
const InstructionMapping &
3936
getInstrMapping(const MachineInstr &MI) const override;
4037
};

llvm/lib/Target/M68k/GISel/M68kRegisterBankInfo.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,6 @@ const RegisterBankInfo::ValueMapping ValueMappings[] = {
5858
M68kRegisterBankInfo::M68kRegisterBankInfo(const TargetRegisterInfo &TRI)
5959
: M68kGenRegisterBankInfo() {}
6060

61-
const RegisterBank &
62-
M68kRegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
63-
LLT) const {
64-
return getRegBank(M68k::GPRRegBankID);
65-
}
66-
6761
const RegisterBankInfo::InstructionMapping &
6862
M68kRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
6963
auto Opc = MI.getOpcode();

llvm/lib/Target/M68k/GISel/M68kRegisterBankInfo.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,6 @@ class M68kRegisterBankInfo final : public M68kGenRegisterBankInfo {
3535
public:
3636
M68kRegisterBankInfo(const TargetRegisterInfo &TRI);
3737

38-
const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC,
39-
LLT) const override;
40-
4138
const InstructionMapping &
4239
getInstrMapping(const MachineInstr &MI) const override;
4340
};

llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -75,35 +75,6 @@ using namespace llvm;
7575

7676
MipsRegisterBankInfo::MipsRegisterBankInfo(const TargetRegisterInfo &TRI) {}
7777

78-
const RegisterBank &
79-
MipsRegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
80-
LLT) const {
81-
using namespace Mips;
82-
83-
switch (RC.getID()) {
84-
case Mips::GPR32RegClassID:
85-
case Mips::CPU16Regs_and_GPRMM16ZeroRegClassID:
86-
case Mips::GPRMM16MovePPairFirstRegClassID:
87-
case Mips::CPU16Regs_and_GPRMM16MovePPairSecondRegClassID:
88-
case Mips::GPRMM16MoveP_and_CPU16Regs_and_GPRMM16ZeroRegClassID:
89-
case Mips::GPRMM16MovePPairFirst_and_GPRMM16MovePPairSecondRegClassID:
90-
case Mips::SP32RegClassID:
91-
case Mips::GP32RegClassID:
92-
return getRegBank(Mips::GPRBRegBankID);
93-
case Mips::FGRCCRegClassID:
94-
case Mips::FGR32RegClassID:
95-
case Mips::FGR64RegClassID:
96-
case Mips::AFGR64RegClassID:
97-
case Mips::MSA128BRegClassID:
98-
case Mips::MSA128HRegClassID:
99-
case Mips::MSA128WRegClassID:
100-
case Mips::MSA128DRegClassID:
101-
return getRegBank(Mips::FPRBRegBankID);
102-
default:
103-
llvm_unreachable("Register class not supported");
104-
}
105-
}
106-
10778
// Instructions where use operands are floating point registers.
10879
// Def operands are general purpose.
10980
static bool isFloatingPointOpcodeUse(unsigned Opc) {

llvm/lib/Target/Mips/MipsRegisterBankInfo.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,6 @@ class MipsRegisterBankInfo final : public MipsGenRegisterBankInfo {
3232
public:
3333
MipsRegisterBankInfo(const TargetRegisterInfo &TRI);
3434

35-
const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC,
36-
LLT) const override;
37-
3835
const InstructionMapping &
3936
getInstrMapping(const MachineInstr &MI) const override;
4037

llvm/lib/Target/PowerPC/GISel/PPCRegisterBankInfo.cpp

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,6 @@ const RegisterBank &
3434
PPCRegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
3535
LLT Ty) const {
3636
switch (RC.getID()) {
37-
case PPC::G8RCRegClassID:
38-
case PPC::G8RC_NOX0RegClassID:
39-
case PPC::G8RC_and_G8RC_NOX0RegClassID:
40-
case PPC::GPRCRegClassID:
41-
case PPC::GPRC_NOR0RegClassID:
42-
case PPC::GPRC_and_GPRC_NOR0RegClassID:
43-
return getRegBank(PPC::GPRRegBankID);
4437
case PPC::VSFRCRegClassID:
4538
case PPC::SPILLTOVSRRC_and_VSFRCRegClassID:
4639
case PPC::SPILLTOVSRRC_and_VFRCRegClassID:
@@ -50,19 +43,8 @@ PPCRegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
5043
case PPC::VSSRCRegClassID:
5144
case PPC::F4RCRegClassID:
5245
return getRegBank(PPC::FPRRegBankID);
53-
case PPC::VSRCRegClassID:
54-
case PPC::VRRCRegClassID:
55-
case PPC::VRRC_with_sub_64_in_SPILLTOVSRRCRegClassID:
56-
case PPC::VSRC_with_sub_64_in_SPILLTOVSRRCRegClassID:
57-
case PPC::SPILLTOVSRRCRegClassID:
58-
case PPC::VSLRCRegClassID:
59-
case PPC::VSLRC_with_sub_64_in_SPILLTOVSRRCRegClassID:
60-
return getRegBank(PPC::VECRegBankID);
61-
case PPC::CRRCRegClassID:
62-
case PPC::CRBITRCRegClassID:
63-
return getRegBank(PPC::CRRegBankID);
6446
default:
65-
llvm_unreachable("Unexpected register class");
47+
return PPCGenRegisterBankInfo::getRegBankFromRegClass(RC, Ty);
6648
}
6749
}
6850

llvm/lib/Target/PowerPC/GISel/PPCRegisterBankInfo.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class PPCRegisterBankInfo final : public PPCGenRegisterBankInfo {
6767

6868
const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC,
6969
LLT Ty) const override;
70+
7071
const InstructionMapping &
7172
getInstrMapping(const MachineInstr &MI) const override;
7273

llvm/lib/Target/RISCV/GISel/RISCVRegisterBankInfo.cpp

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -112,51 +112,6 @@ using namespace llvm;
112112
RISCVRegisterBankInfo::RISCVRegisterBankInfo(unsigned HwMode)
113113
: RISCVGenRegisterBankInfo(HwMode) {}
114114

115-
const RegisterBank &
116-
RISCVRegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
117-
LLT Ty) const {
118-
switch (RC.getID()) {
119-
default:
120-
llvm_unreachable("Register class not supported");
121-
case RISCV::GPRRegClassID:
122-
case RISCV::GPRF16RegClassID:
123-
case RISCV::GPRF32RegClassID:
124-
case RISCV::GPRNoX0RegClassID:
125-
case RISCV::GPRNoX0X2RegClassID:
126-
case RISCV::GPRJALRRegClassID:
127-
case RISCV::GPRJALRNonX7RegClassID:
128-
case RISCV::GPRTCRegClassID:
129-
case RISCV::GPRTCNonX7RegClassID:
130-
case RISCV::GPRC_and_GPRTCRegClassID:
131-
case RISCV::GPRCRegClassID:
132-
case RISCV::GPRC_and_SR07RegClassID:
133-
case RISCV::SR07RegClassID:
134-
case RISCV::SPRegClassID:
135-
case RISCV::GPRX0RegClassID:
136-
return getRegBank(RISCV::GPRBRegBankID);
137-
case RISCV::FPR64RegClassID:
138-
case RISCV::FPR16RegClassID:
139-
case RISCV::FPR32RegClassID:
140-
case RISCV::FPR64CRegClassID:
141-
case RISCV::FPR32CRegClassID:
142-
return getRegBank(RISCV::FPRBRegBankID);
143-
case RISCV::VMRegClassID:
144-
case RISCV::VRRegClassID:
145-
case RISCV::VRNoV0RegClassID:
146-
case RISCV::VRM2RegClassID:
147-
case RISCV::VRM2NoV0RegClassID:
148-
case RISCV::VRM4RegClassID:
149-
case RISCV::VRM4NoV0RegClassID:
150-
case RISCV::VMV0RegClassID:
151-
case RISCV::VRM2_with_sub_vrm1_0_in_VMV0RegClassID:
152-
case RISCV::VRM4_with_sub_vrm1_0_in_VMV0RegClassID:
153-
case RISCV::VRM8RegClassID:
154-
case RISCV::VRM8NoV0RegClassID:
155-
case RISCV::VRM8_with_sub_vrm1_0_in_VMV0RegClassID:
156-
return getRegBank(RISCV::VRBRegBankID);
157-
}
158-
}
159-
160115
static const RegisterBankInfo::ValueMapping *getFPValueMapping(unsigned Size) {
161116
unsigned Idx;
162117
switch (Size) {

llvm/lib/Target/RISCV/GISel/RISCVRegisterBankInfo.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,6 @@ class RISCVRegisterBankInfo final : public RISCVGenRegisterBankInfo {
3333
public:
3434
RISCVRegisterBankInfo(unsigned HwMode);
3535

36-
const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC,
37-
LLT Ty) const override;
38-
3936
const InstructionMapping &
4037
getInstrMapping(const MachineInstr &MI) const override;
4138

llvm/lib/Target/SPIRV/SPIRVRegisterBankInfo.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include "SPIRVRegisterBankInfo.h"
1414
#include "SPIRVRegisterInfo.h"
15+
#include "llvm/ADT/Twine.h"
1516
#include "llvm/CodeGen/RegisterBank.h"
1617

1718
#define GET_REGINFO_ENUM

llvm/lib/Target/X86/GISel/X86RegisterBankInfo.cpp

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -44,33 +44,6 @@ X86RegisterBankInfo::X86RegisterBankInfo(const TargetRegisterInfo &TRI) {
4444
"GPRs should hold up to 64-bit");
4545
}
4646

47-
const RegisterBank &
48-
X86RegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
49-
LLT) const {
50-
51-
if (X86::GR8RegClass.hasSubClassEq(&RC) ||
52-
X86::GR16RegClass.hasSubClassEq(&RC) ||
53-
X86::GR32RegClass.hasSubClassEq(&RC) ||
54-
X86::GR64RegClass.hasSubClassEq(&RC) ||
55-
X86::LOW32_ADDR_ACCESSRegClass.hasSubClassEq(&RC) ||
56-
X86::LOW32_ADDR_ACCESS_RBPRegClass.hasSubClassEq(&RC))
57-
return getRegBank(X86::GPRRegBankID);
58-
59-
if (X86::FR32XRegClass.hasSubClassEq(&RC) ||
60-
X86::FR64XRegClass.hasSubClassEq(&RC) ||
61-
X86::VR128XRegClass.hasSubClassEq(&RC) ||
62-
X86::VR256XRegClass.hasSubClassEq(&RC) ||
63-
X86::VR512RegClass.hasSubClassEq(&RC))
64-
return getRegBank(X86::VECRRegBankID);
65-
66-
if (X86::RFP80RegClass.hasSubClassEq(&RC) ||
67-
X86::RFP32RegClass.hasSubClassEq(&RC) ||
68-
X86::RFP64RegClass.hasSubClassEq(&RC))
69-
return getRegBank(X86::PSRRegBankID);
70-
71-
llvm_unreachable("Unsupported register kind yet.");
72-
}
73-
7447
// \returns true if a given intrinsic only uses and defines FPRs.
7548
static bool isFPIntrinsic(const MachineRegisterInfo &MRI,
7649
const MachineInstr &MI) {

llvm/lib/Target/X86/GISel/X86RegisterBankInfo.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,6 @@ class X86RegisterBankInfo final : public X86GenRegisterBankInfo {
8181
public:
8282
X86RegisterBankInfo(const TargetRegisterInfo &TRI);
8383

84-
const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC,
85-
LLT) const override;
86-
8784
InstructionMappings
8885
getInstrAlternativeMappings(const MachineInstr &MI) const override;
8986

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// RUN: llvm-tblgen -gen-register-bank -I %p/../../include %s | FileCheck %s
2+
3+
include "llvm/Target/Target.td"
4+
5+
def MyTarget : Target;
6+
7+
def R0 : Register<"r0">;
8+
def GR : RegisterClass<"MyTarget", [i32], 32, (add R0)>;
9+
10+
def F0 : Register<"f0">;
11+
def FR : RegisterClass<"MyTarget", [f32], 32, (add F0)>;
12+
13+
def V0 : Register<"V0">;
14+
def VR : RegisterClass<"MyTarget", [v4i8, f32], 32, (add V0)>;
15+
16+
def AllFloatR : RegisterClass<"MyTarget", [f32], 32, (add F0, V0)>;
17+
def AnyR : RegisterClass<"MyTarget", [i32, f32, v4i8], 32, (add R0, F0, V0)>;
18+
19+
def GRRegBank : RegisterBank<"GRB", [GR]>;
20+
def FRRegBank : RegisterBank<"FRB", [FR]>;
21+
def VRRegBank : RegisterBank<"VRB", [VR]>;
22+
23+
24+
// CHECK: #ifdef GET_TARGET_REGBANK_CLASS
25+
// CHECK: const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC, LLT Ty) const override;
26+
27+
// CHECK: #ifdef GET_TARGET_REGBANK_IMPL
28+
// CHECK: const RegisterBank &
29+
// CHECK-NEXT: MyTargetGenRegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC, LLT) const {
30+
// CHECK-NEXT: constexpr uint32_t InvalidRegBankID = uint32_t(MyTarget::InvalidRegBankID) & 3;
31+
// CHECK-NEXT: static const uint32_t RegClass2RegBank[1] = {
32+
// CHECK-NEXT: (uint32_t(InvalidRegBankID) << 0) |
33+
// CHECK-NEXT: (uint32_t(InvalidRegBankID) << 2) |
34+
// CHECK-NEXT: (uint32_t(MyTarget::FRRegBankID) << 4) | // FRRegClassID
35+
// CHECK-NEXT: (uint32_t(MyTarget::GRRegBankID) << 6) | // GRRegClassID
36+
// CHECK-NEXT: (uint32_t(MyTarget::VRRegBankID) << 8) // VRRegClassID
37+
// CHECK-NEXT: };
38+
// CHECK-NEXT: const unsigned RegClassID = RC.getID();
39+
// CHECK-NEXT: if (LLVM_LIKELY(RegClassID < 5)) {
40+
// CHECK-NEXT: unsigned RegBankID = (RegClass2RegBank[RegClassID / 16] >> ((RegClassID % 16) * 2)) & 3;
41+
// CHECK-NEXT: if (RegBankID != InvalidRegBankID)
42+
// CHECK-NEXT: return getRegBank(RegBankID);
43+
// CHECK-NEXT: }
44+
// CHECK-NEXT: llvm_unreachable(llvm::Twine("Target needs to handle register class ID 0x").concat(llvm::Twine::utohexstr(RegClassID)).str().c_str());
45+
// CHECK-NEXT: }

0 commit comments

Comments
 (0)