Skip to content

Commit

Permalink
GlobalISel: Add type argument to getRegBankFromRegClass
Browse files Browse the repository at this point in the history
AMDGPU can't unambiguously go back from the selected instruction
register class to the register bank without knowing if this was used
in a boolean context.
  • Loading branch information
arsenm committed Jan 3, 2020
1 parent 555fc92 commit 21309ea
Show file tree
Hide file tree
Showing 13 changed files with 43 additions and 30 deletions.
Expand Up @@ -574,7 +574,8 @@ bool InstructionSelector::executeMatchTable(
assert(State.MIs[InsnID] != nullptr && "Used insn before defined");
MachineOperand &MO = State.MIs[InsnID]->getOperand(OpIdx);
if (!MO.isReg() ||
&RBI.getRegBankFromRegClass(*TRI.getRegClass(RCEnum)) !=
&RBI.getRegBankFromRegClass(*TRI.getRegClass(RCEnum),
MRI.getType(MO.getReg())) !=
RBI.getRegBank(MO.getReg(), MRI, TRI)) {
if (handleReject() == RejectAndGiveUp)
return false;
Expand Down
5 changes: 3 additions & 2 deletions llvm/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h
Expand Up @@ -20,6 +20,7 @@
#include "llvm/ADT/iterator_range.h"
#include "llvm/CodeGen/Register.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/LowLevelTypeImpl.h"
#include <cassert>
#include <initializer_list>
#include <memory>
Expand Down Expand Up @@ -543,7 +544,7 @@ class RegisterBankInfo {
const RegisterBank *
getRegBankFromConstraints(const MachineInstr &MI, unsigned OpIdx,
const TargetInstrInfo &TII,
const TargetRegisterInfo &TRI) const;
const MachineRegisterInfo &MRI) const;

/// Helper method to apply something that is like the default mapping.
/// Basically, that means that \p OpdMapper.getMI() is left untouched
Expand Down Expand Up @@ -599,7 +600,7 @@ class RegisterBankInfo {
///
/// \todo This should be TableGen'ed.
virtual const RegisterBank &
getRegBankFromRegClass(const TargetRegisterClass &RC) const {
getRegBankFromRegClass(const TargetRegisterClass &RC, LLT Ty) const {
llvm_unreachable("The target must override this method");
}

Expand Down
20 changes: 13 additions & 7 deletions llvm/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp
Expand Up @@ -82,15 +82,18 @@ bool RegisterBankInfo::verify(const TargetRegisterInfo &TRI) const {
const RegisterBank *
RegisterBankInfo::getRegBank(Register Reg, const MachineRegisterInfo &MRI,
const TargetRegisterInfo &TRI) const {
if (Register::isPhysicalRegister(Reg))
return &getRegBankFromRegClass(getMinimalPhysRegClass(Reg, TRI));
if (Register::isPhysicalRegister(Reg)) {
// FIXME: This was probably a copy to a virtual register that does have a
// type we could use.
return &getRegBankFromRegClass(getMinimalPhysRegClass(Reg, TRI), LLT());
}

assert(Reg && "NoRegister does not have a register bank");
const RegClassOrRegBank &RegClassOrBank = MRI.getRegClassOrRegBank(Reg);
if (auto *RB = RegClassOrBank.dyn_cast<const RegisterBank *>())
return RB;
if (auto *RC = RegClassOrBank.dyn_cast<const TargetRegisterClass *>())
return &getRegBankFromRegClass(*RC);
return &getRegBankFromRegClass(*RC, MRI.getType(Reg));
return nullptr;
}

Expand All @@ -108,15 +111,18 @@ RegisterBankInfo::getMinimalPhysRegClass(Register Reg,

const RegisterBank *RegisterBankInfo::getRegBankFromConstraints(
const MachineInstr &MI, unsigned OpIdx, const TargetInstrInfo &TII,
const TargetRegisterInfo &TRI) const {
const MachineRegisterInfo &MRI) const {
const TargetRegisterInfo *TRI = MRI.getTargetRegisterInfo();

// The mapping of the registers may be available via the
// register class constraints.
const TargetRegisterClass *RC = MI.getRegClassConstraint(OpIdx, &TII, &TRI);
const TargetRegisterClass *RC = MI.getRegClassConstraint(OpIdx, &TII, TRI);

if (!RC)
return nullptr;

const RegisterBank &RegBank = getRegBankFromRegClass(*RC);
Register Reg = MI.getOperand(OpIdx).getReg();
const RegisterBank &RegBank = getRegBankFromRegClass(*RC, MRI.getType(Reg));
// Sanity check that the target properly implemented getRegBankFromRegClass.
assert(RegBank.covers(*RC) &&
"The mapping of the register bank does not make sense");
Expand Down Expand Up @@ -195,7 +201,7 @@ RegisterBankInfo::getInstrMappingImpl(const MachineInstr &MI) const {
if (!CurRegBank) {
// If this is a target specific instruction, we can deduce
// the register bank from the encoding constraints.
CurRegBank = getRegBankFromConstraints(MI, OpIdx, TII, TRI);
CurRegBank = getRegBankFromConstraints(MI, OpIdx, TII, MRI);
if (!CurRegBank) {
// All our attempts failed, give up.
CompleteMapping = false;
Expand Down
5 changes: 3 additions & 2 deletions llvm/lib/Target/AArch64/AArch64RegisterBankInfo.cpp
Expand Up @@ -222,8 +222,9 @@ unsigned AArch64RegisterBankInfo::copyCost(const RegisterBank &A,
return RegisterBankInfo::copyCost(A, B, Size);
}

const RegisterBank &AArch64RegisterBankInfo::getRegBankFromRegClass(
const TargetRegisterClass &RC) const {
const RegisterBank &
AArch64RegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
LLT) const {
switch (RC.getID()) {
case AArch64::FPR8RegClassID:
case AArch64::FPR16RegClassID:
Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/Target/AArch64/AArch64RegisterBankInfo.h
Expand Up @@ -132,8 +132,8 @@ class AArch64RegisterBankInfo final : public AArch64GenRegisterBankInfo {
unsigned copyCost(const RegisterBank &A, const RegisterBank &B,
unsigned Size) const override;

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

InstructionMappings
getInstrAlternativeMappings(const MachineInstr &MI) const override;
Expand Down
5 changes: 3 additions & 2 deletions llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp
Expand Up @@ -177,8 +177,9 @@ unsigned AMDGPURegisterBankInfo::getBreakDownCost(
return 1;
}

const RegisterBank &AMDGPURegisterBankInfo::getRegBankFromRegClass(
const TargetRegisterClass &RC) const {
const RegisterBank &
AMDGPURegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
LLT Ty) const {
if (&RC == &AMDGPU::SReg_1RegClass)
return AMDGPU::VCCRegBank;

Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.h
Expand Up @@ -155,8 +155,8 @@ class AMDGPURegisterBankInfo : public AMDGPUGenRegisterBankInfo {
unsigned getBreakDownCost(const ValueMapping &ValMapping,
const RegisterBank *CurBank = nullptr) const override;

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

InstructionMappings
getInstrAlternativeMappings(const MachineInstr &MI) const override;
Expand Down
5 changes: 3 additions & 2 deletions llvm/lib/Target/ARM/ARMRegisterBankInfo.cpp
Expand Up @@ -172,8 +172,9 @@ ARMRegisterBankInfo::ARMRegisterBankInfo(const TargetRegisterInfo &TRI)
#endif
}

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

switch (RC.getID()) {
Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/Target/ARM/ARMRegisterBankInfo.h
Expand Up @@ -32,8 +32,8 @@ class ARMRegisterBankInfo final : public ARMGenRegisterBankInfo {
public:
ARMRegisterBankInfo(const TargetRegisterInfo &TRI);

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

const InstructionMapping &
getInstrMapping(const MachineInstr &MI) const override;
Expand Down
5 changes: 3 additions & 2 deletions llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp
Expand Up @@ -76,8 +76,9 @@ using namespace llvm;
MipsRegisterBankInfo::MipsRegisterBankInfo(const TargetRegisterInfo &TRI)
: MipsGenRegisterBankInfo() {}

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

switch (RC.getID()) {
Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/Target/Mips/MipsRegisterBankInfo.h
Expand Up @@ -32,8 +32,8 @@ class MipsRegisterBankInfo final : public MipsGenRegisterBankInfo {
public:
MipsRegisterBankInfo(const TargetRegisterInfo &TRI);

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

const InstructionMapping &
getInstrMapping(const MachineInstr &MI) const override;
Expand Down
5 changes: 3 additions & 2 deletions llvm/lib/Target/X86/X86RegisterBankInfo.cpp
Expand Up @@ -40,8 +40,9 @@ X86RegisterBankInfo::X86RegisterBankInfo(const TargetRegisterInfo &TRI)
assert(RBGPR.getSize() == 64 && "GPRs should hold up to 64-bit");
}

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

if (X86::GR8RegClass.hasSubClassEq(&RC) ||
X86::GR16RegClass.hasSubClassEq(&RC) ||
Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/Target/X86/X86RegisterBankInfo.h
Expand Up @@ -64,8 +64,8 @@ class X86RegisterBankInfo final : public X86GenRegisterBankInfo {
public:
X86RegisterBankInfo(const TargetRegisterInfo &TRI);

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

InstructionMappings
getInstrAlternativeMappings(const MachineInstr &MI) const override;
Expand Down

0 comments on commit 21309ea

Please sign in to comment.