Skip to content

[GISel][TableGen] Generate getRegBankFromRegClass #99896

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 2 additions & 47 deletions llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -240,57 +240,12 @@ unsigned AArch64RegisterBankInfo::copyCost(const RegisterBank &A,

const RegisterBank &
AArch64RegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
LLT) const {
LLT Ty) const {
switch (RC.getID()) {
case AArch64::FPR8RegClassID:
case AArch64::FPR16RegClassID:
case AArch64::FPR16_loRegClassID:
case AArch64::FPR32_with_hsub_in_FPR16_loRegClassID:
case AArch64::FPR32RegClassID:
case AArch64::FPR64RegClassID:
case AArch64::FPR128RegClassID:
case AArch64::FPR64_loRegClassID:
case AArch64::FPR128_loRegClassID:
case AArch64::FPR128_0to7RegClassID:
case AArch64::DDRegClassID:
case AArch64::DDDRegClassID:
case AArch64::DDDDRegClassID:
case AArch64::QQRegClassID:
case AArch64::QQQRegClassID:
case AArch64::QQQQRegClassID:
case AArch64::ZPRRegClassID:
case AArch64::ZPR_3bRegClassID:
return getRegBank(AArch64::FPRRegBankID);
case AArch64::GPR32commonRegClassID:
case AArch64::GPR32RegClassID:
case AArch64::GPR32spRegClassID:
case AArch64::GPR32sponlyRegClassID:
case AArch64::GPR32argRegClassID:
case AArch64::GPR32allRegClassID:
case AArch64::GPR64commonRegClassID:
case AArch64::GPR64RegClassID:
case AArch64::GPR64spRegClassID:
case AArch64::GPR64sponlyRegClassID:
case AArch64::GPR64argRegClassID:
case AArch64::GPR64allRegClassID:
case AArch64::GPR64noipRegClassID:
case AArch64::GPR64common_and_GPR64noipRegClassID:
case AArch64::GPR64noip_and_tcGPR64RegClassID:
case AArch64::tcGPR64RegClassID:
case AArch64::tcGPRx16x17RegClassID:
case AArch64::tcGPRx17RegClassID:
case AArch64::tcGPRnotx16RegClassID:
case AArch64::WSeqPairsClassRegClassID:
case AArch64::XSeqPairsClassRegClassID:
case AArch64::MatrixIndexGPR32_8_11RegClassID:
case AArch64::MatrixIndexGPR32_12_15RegClassID:
case AArch64::GPR64_with_sub_32_in_MatrixIndexGPR32_8_11RegClassID:
case AArch64::GPR64_with_sub_32_in_MatrixIndexGPR32_12_15RegClassID:
return getRegBank(AArch64::GPRRegBankID);
case AArch64::CCRRegClassID:
return getRegBank(AArch64::CCRegBankID);
default:
llvm_unreachable("Register class not supported");
return AArch64GenRegisterBankInfo::getRegBankFromRegClass(RC, Ty);
}
}

Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ class AArch64RegisterBankInfo final : public AArch64GenRegisterBankInfo {
TypeSize Size) const override;

const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC,
LLT) const override;
LLT Ty) const override;

InstructionMappings
getInstrAlternativeMappings(const MachineInstr &MI) const override;
Expand Down
38 changes: 0 additions & 38 deletions llvm/lib/Target/ARM/ARMRegisterBankInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,44 +170,6 @@ ARMRegisterBankInfo::ARMRegisterBankInfo(const TargetRegisterInfo &TRI) {
llvm::call_once(InitializeRegisterBankFlag, InitializeRegisterBankOnce);
}

const RegisterBank &
ARMRegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
LLT) const {
using namespace ARM;

switch (RC.getID()) {
case GPRRegClassID:
case GPRwithAPSRRegClassID:
case GPRnoipRegClassID:
case GPRnopcRegClassID:
case GPRnoip_and_GPRnopcRegClassID:
case rGPRRegClassID:
case GPRspRegClassID:
case tcGPRRegClassID:
case tcGPRnotr12RegClassID:
case tGPRRegClassID:
case tGPREvenRegClassID:
case tGPROddRegClassID:
case tGPR_and_tGPREvenRegClassID:
case tGPR_and_tGPROddRegClassID:
case tGPREven_and_tcGPRRegClassID:
case tGPROdd_and_tcGPRRegClassID:
case tGPREven_and_tcGPRnotr12RegClassID:
return getRegBank(ARM::GPRRegBankID);
case HPRRegClassID:
case SPR_8RegClassID:
case SPRRegClassID:
case DPR_8RegClassID:
case DPRRegClassID:
case QPRRegClassID:
return getRegBank(ARM::FPRRegBankID);
default:
llvm_unreachable("Unsupported register kind");
}

llvm_unreachable("Switch should handle all register classes");
}

const RegisterBankInfo::InstructionMapping &
ARMRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
auto Opc = MI.getOpcode();
Expand Down
3 changes: 0 additions & 3 deletions llvm/lib/Target/ARM/ARMRegisterBankInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,6 @@ class ARMRegisterBankInfo final : public ARMGenRegisterBankInfo {
public:
ARMRegisterBankInfo(const TargetRegisterInfo &TRI);

const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC,
LLT) const override;

const InstructionMapping &
getInstrMapping(const MachineInstr &MI) const override;
};
Expand Down
6 changes: 0 additions & 6 deletions llvm/lib/Target/M68k/GISel/M68kRegisterBankInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,6 @@ const RegisterBankInfo::ValueMapping ValueMappings[] = {
M68kRegisterBankInfo::M68kRegisterBankInfo(const TargetRegisterInfo &TRI)
: M68kGenRegisterBankInfo() {}

const RegisterBank &
M68kRegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
LLT) const {
return getRegBank(M68k::GPRRegBankID);
}

const RegisterBankInfo::InstructionMapping &
M68kRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
auto Opc = MI.getOpcode();
Expand Down
3 changes: 0 additions & 3 deletions llvm/lib/Target/M68k/GISel/M68kRegisterBankInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,6 @@ class M68kRegisterBankInfo final : public M68kGenRegisterBankInfo {
public:
M68kRegisterBankInfo(const TargetRegisterInfo &TRI);

const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC,
LLT) const override;

const InstructionMapping &
getInstrMapping(const MachineInstr &MI) const override;
};
Expand Down
29 changes: 0 additions & 29 deletions llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,35 +75,6 @@ using namespace llvm;

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

const RegisterBank &
MipsRegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
LLT) const {
using namespace Mips;

switch (RC.getID()) {
case Mips::GPR32RegClassID:
case Mips::CPU16Regs_and_GPRMM16ZeroRegClassID:
case Mips::GPRMM16MovePPairFirstRegClassID:
case Mips::CPU16Regs_and_GPRMM16MovePPairSecondRegClassID:
case Mips::GPRMM16MoveP_and_CPU16Regs_and_GPRMM16ZeroRegClassID:
case Mips::GPRMM16MovePPairFirst_and_GPRMM16MovePPairSecondRegClassID:
case Mips::SP32RegClassID:
case Mips::GP32RegClassID:
return getRegBank(Mips::GPRBRegBankID);
case Mips::FGRCCRegClassID:
case Mips::FGR32RegClassID:
case Mips::FGR64RegClassID:
case Mips::AFGR64RegClassID:
case Mips::MSA128BRegClassID:
case Mips::MSA128HRegClassID:
case Mips::MSA128WRegClassID:
case Mips::MSA128DRegClassID:
return getRegBank(Mips::FPRBRegBankID);
default:
llvm_unreachable("Register class not supported");
}
}

// Instructions where use operands are floating point registers.
// Def operands are general purpose.
static bool isFloatingPointOpcodeUse(unsigned Opc) {
Expand Down
3 changes: 0 additions & 3 deletions llvm/lib/Target/Mips/MipsRegisterBankInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,6 @@ class MipsRegisterBankInfo final : public MipsGenRegisterBankInfo {
public:
MipsRegisterBankInfo(const TargetRegisterInfo &TRI);

const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC,
LLT) const override;

const InstructionMapping &
getInstrMapping(const MachineInstr &MI) const override;

Expand Down
20 changes: 1 addition & 19 deletions llvm/lib/Target/PowerPC/GISel/PPCRegisterBankInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,6 @@ const RegisterBank &
PPCRegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
LLT Ty) const {
switch (RC.getID()) {
case PPC::G8RCRegClassID:
case PPC::G8RC_NOX0RegClassID:
case PPC::G8RC_and_G8RC_NOX0RegClassID:
case PPC::GPRCRegClassID:
case PPC::GPRC_NOR0RegClassID:
case PPC::GPRC_and_GPRC_NOR0RegClassID:
return getRegBank(PPC::GPRRegBankID);
case PPC::VSFRCRegClassID:
case PPC::SPILLTOVSRRC_and_VSFRCRegClassID:
case PPC::SPILLTOVSRRC_and_VFRCRegClassID:
Expand All @@ -50,19 +43,8 @@ PPCRegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
case PPC::VSSRCRegClassID:
case PPC::F4RCRegClassID:
return getRegBank(PPC::FPRRegBankID);
case PPC::VSRCRegClassID:
case PPC::VRRCRegClassID:
case PPC::VRRC_with_sub_64_in_SPILLTOVSRRCRegClassID:
case PPC::VSRC_with_sub_64_in_SPILLTOVSRRCRegClassID:
case PPC::SPILLTOVSRRCRegClassID:
case PPC::VSLRCRegClassID:
case PPC::VSLRC_with_sub_64_in_SPILLTOVSRRCRegClassID:
return getRegBank(PPC::VECRegBankID);
case PPC::CRRCRegClassID:
case PPC::CRBITRCRegClassID:
return getRegBank(PPC::CRRegBankID);
default:
llvm_unreachable("Unexpected register class");
return PPCGenRegisterBankInfo::getRegBankFromRegClass(RC, Ty);
}
}

Expand Down
1 change: 1 addition & 0 deletions llvm/lib/Target/PowerPC/GISel/PPCRegisterBankInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ class PPCRegisterBankInfo final : public PPCGenRegisterBankInfo {

const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC,
LLT Ty) const override;

const InstructionMapping &
getInstrMapping(const MachineInstr &MI) const override;

Expand Down
45 changes: 0 additions & 45 deletions llvm/lib/Target/RISCV/GISel/RISCVRegisterBankInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,51 +112,6 @@ using namespace llvm;
RISCVRegisterBankInfo::RISCVRegisterBankInfo(unsigned HwMode)
: RISCVGenRegisterBankInfo(HwMode) {}

const RegisterBank &
RISCVRegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
LLT Ty) const {
switch (RC.getID()) {
default:
llvm_unreachable("Register class not supported");
case RISCV::GPRRegClassID:
case RISCV::GPRF16RegClassID:
case RISCV::GPRF32RegClassID:
case RISCV::GPRNoX0RegClassID:
case RISCV::GPRNoX0X2RegClassID:
case RISCV::GPRJALRRegClassID:
case RISCV::GPRJALRNonX7RegClassID:
case RISCV::GPRTCRegClassID:
case RISCV::GPRTCNonX7RegClassID:
case RISCV::GPRC_and_GPRTCRegClassID:
case RISCV::GPRCRegClassID:
case RISCV::GPRC_and_SR07RegClassID:
case RISCV::SR07RegClassID:
case RISCV::SPRegClassID:
case RISCV::GPRX0RegClassID:
return getRegBank(RISCV::GPRBRegBankID);
case RISCV::FPR64RegClassID:
case RISCV::FPR16RegClassID:
case RISCV::FPR32RegClassID:
case RISCV::FPR64CRegClassID:
case RISCV::FPR32CRegClassID:
return getRegBank(RISCV::FPRBRegBankID);
case RISCV::VMRegClassID:
case RISCV::VRRegClassID:
case RISCV::VRNoV0RegClassID:
case RISCV::VRM2RegClassID:
case RISCV::VRM2NoV0RegClassID:
case RISCV::VRM4RegClassID:
case RISCV::VRM4NoV0RegClassID:
case RISCV::VMV0RegClassID:
case RISCV::VRM2_with_sub_vrm1_0_in_VMV0RegClassID:
case RISCV::VRM4_with_sub_vrm1_0_in_VMV0RegClassID:
case RISCV::VRM8RegClassID:
case RISCV::VRM8NoV0RegClassID:
case RISCV::VRM8_with_sub_vrm1_0_in_VMV0RegClassID:
return getRegBank(RISCV::VRBRegBankID);
}
}

static const RegisterBankInfo::ValueMapping *getFPValueMapping(unsigned Size) {
unsigned Idx;
switch (Size) {
Expand Down
3 changes: 0 additions & 3 deletions llvm/lib/Target/RISCV/GISel/RISCVRegisterBankInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,6 @@ class RISCVRegisterBankInfo final : public RISCVGenRegisterBankInfo {
public:
RISCVRegisterBankInfo(unsigned HwMode);

const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC,
LLT Ty) const override;

const InstructionMapping &
getInstrMapping(const MachineInstr &MI) const override;

Expand Down
1 change: 1 addition & 0 deletions llvm/lib/Target/SPIRV/SPIRVRegisterBankInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

#include "SPIRVRegisterBankInfo.h"
#include "SPIRVRegisterInfo.h"
#include "llvm/ADT/Twine.h"
#include "llvm/CodeGen/RegisterBank.h"

#define GET_REGINFO_ENUM
Expand Down
27 changes: 0 additions & 27 deletions llvm/lib/Target/X86/GISel/X86RegisterBankInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,33 +44,6 @@ X86RegisterBankInfo::X86RegisterBankInfo(const TargetRegisterInfo &TRI) {
"GPRs should hold up to 64-bit");
}

const RegisterBank &
X86RegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
LLT) const {

if (X86::GR8RegClass.hasSubClassEq(&RC) ||
X86::GR16RegClass.hasSubClassEq(&RC) ||
X86::GR32RegClass.hasSubClassEq(&RC) ||
X86::GR64RegClass.hasSubClassEq(&RC) ||
X86::LOW32_ADDR_ACCESSRegClass.hasSubClassEq(&RC) ||
X86::LOW32_ADDR_ACCESS_RBPRegClass.hasSubClassEq(&RC))
return getRegBank(X86::GPRRegBankID);

if (X86::FR32XRegClass.hasSubClassEq(&RC) ||
X86::FR64XRegClass.hasSubClassEq(&RC) ||
X86::VR128XRegClass.hasSubClassEq(&RC) ||
X86::VR256XRegClass.hasSubClassEq(&RC) ||
X86::VR512RegClass.hasSubClassEq(&RC))
return getRegBank(X86::VECRRegBankID);

if (X86::RFP80RegClass.hasSubClassEq(&RC) ||
X86::RFP32RegClass.hasSubClassEq(&RC) ||
X86::RFP64RegClass.hasSubClassEq(&RC))
return getRegBank(X86::PSRRegBankID);

llvm_unreachable("Unsupported register kind yet.");
}

// \returns true if a given intrinsic only uses and defines FPRs.
static bool isFPIntrinsic(const MachineRegisterInfo &MRI,
const MachineInstr &MI) {
Expand Down
3 changes: 0 additions & 3 deletions llvm/lib/Target/X86/GISel/X86RegisterBankInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,6 @@ class X86RegisterBankInfo final : public X86GenRegisterBankInfo {
public:
X86RegisterBankInfo(const TargetRegisterInfo &TRI);

const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC,
LLT) const override;

InstructionMappings
getInstrAlternativeMappings(const MachineInstr &MI) const override;

Expand Down
45 changes: 45 additions & 0 deletions llvm/test/TableGen/RegBankFromRegClass.td
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// RUN: llvm-tblgen -gen-register-bank -I %p/../../include %s | FileCheck %s

include "llvm/Target/Target.td"

def MyTarget : Target;

def R0 : Register<"r0">;
def GR : RegisterClass<"MyTarget", [i32], 32, (add R0)>;

def F0 : Register<"f0">;
def FR : RegisterClass<"MyTarget", [f32], 32, (add F0)>;

def V0 : Register<"V0">;
def VR : RegisterClass<"MyTarget", [v4i8, f32], 32, (add V0)>;

def AllFloatR : RegisterClass<"MyTarget", [f32], 32, (add F0, V0)>;
def AnyR : RegisterClass<"MyTarget", [i32, f32, v4i8], 32, (add R0, F0, V0)>;

def GRRegBank : RegisterBank<"GRB", [GR]>;
def FRRegBank : RegisterBank<"FRB", [FR]>;
def VRRegBank : RegisterBank<"VRB", [VR]>;


// CHECK: #ifdef GET_TARGET_REGBANK_CLASS
// CHECK: const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC, LLT Ty) const override;

// CHECK: #ifdef GET_TARGET_REGBANK_IMPL
// CHECK: const RegisterBank &
// CHECK-NEXT: MyTargetGenRegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC, LLT) const {
// CHECK-NEXT: constexpr uint32_t InvalidRegBankID = uint32_t(MyTarget::InvalidRegBankID) & 3;
// CHECK-NEXT: static const uint32_t RegClass2RegBank[1] = {
// CHECK-NEXT: (uint32_t(InvalidRegBankID) << 0) |
// CHECK-NEXT: (uint32_t(InvalidRegBankID) << 2) |
// CHECK-NEXT: (uint32_t(MyTarget::FRRegBankID) << 4) | // FRRegClassID
// CHECK-NEXT: (uint32_t(MyTarget::GRRegBankID) << 6) | // GRRegClassID
// CHECK-NEXT: (uint32_t(MyTarget::VRRegBankID) << 8) // VRRegClassID
// CHECK-NEXT: };
// CHECK-NEXT: const unsigned RegClassID = RC.getID();
// CHECK-NEXT: if (LLVM_LIKELY(RegClassID < 5)) {
// CHECK-NEXT: unsigned RegBankID = (RegClass2RegBank[RegClassID / 16] >> ((RegClassID % 16) * 2)) & 3;
// CHECK-NEXT: if (RegBankID != InvalidRegBankID)
// CHECK-NEXT: return getRegBank(RegBankID);
// CHECK-NEXT: }
// CHECK-NEXT: llvm_unreachable(llvm::Twine("Target needs to handle register class ID 0x").concat(llvm::Twine::utohexstr(RegClassID)).str().c_str());
// CHECK-NEXT: }
Loading
Loading