forked from OSchip/llvm-project
GlobalISel: Use a callback to compute constrained reg class for unallocatble registers
Summary: constrainOperandRegClass() currently fails if it tries to constrain the register class of an operand that is defeined with an unallocatable register class. This patch resolves this by adding a target callback to compute register constriants in this case. This is required by the AMDGPU because many of its instructions have source opreands defined with the unallocatable register classe VS_32 which is a union of two allocatable register classes VGPR_32 and SReg_32. Reviewers: dsanders, aditya_nandakumar Reviewed By: aditya_nandakumar Subscribers: rovka, kristof.beyls, tpr, llvm-commits Differential Revision: https://reviews.llvm.org/D45991 llvm-svn: 331485
This commit is contained in:
parent
6e713d9866
commit
abc9871d60
|
|
@ -995,6 +995,12 @@ public:
|
||||||
/// of the set as well.
|
/// of the set as well.
|
||||||
bool checkAllSuperRegsMarked(const BitVector &RegisterSet,
|
bool checkAllSuperRegsMarked(const BitVector &RegisterSet,
|
||||||
ArrayRef<MCPhysReg> Exceptions = ArrayRef<MCPhysReg>()) const;
|
ArrayRef<MCPhysReg> Exceptions = ArrayRef<MCPhysReg>()) const;
|
||||||
|
|
||||||
|
virtual const TargetRegisterClass *
|
||||||
|
getConstrainedRegClassForOperand(const MachineOperand &MO,
|
||||||
|
const MachineRegisterInfo &MRI) const {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,13 @@ unsigned llvm::constrainOperandRegClass(
|
||||||
// register class constraints on some of their operands: If it's a use, we can
|
// register class constraints on some of their operands: If it's a use, we can
|
||||||
// skip constraining as the instruction defining the register would constrain
|
// skip constraining as the instruction defining the register would constrain
|
||||||
// it.
|
// it.
|
||||||
|
|
||||||
|
// We can't constrain unallocatable register classes, because we can't create
|
||||||
|
// virtual registers for these classes, so we need to let targets handled this
|
||||||
|
// case.
|
||||||
|
if (RegClass && !RegClass->isAllocatable())
|
||||||
|
RegClass = TRI.getConstrainedRegClassForOperand(RegMO, MRI);
|
||||||
|
|
||||||
if (!RegClass) {
|
if (!RegClass) {
|
||||||
assert((!isTargetSpecificOpcode(II.getOpcode()) || RegMO.isUse()) &&
|
assert((!isTargetSpecificOpcode(II.getOpcode()) || RegMO.isUse()) &&
|
||||||
"Register class constraint is required unless either the "
|
"Register class constraint is required unless either the "
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue