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.
|
||||
bool checkAllSuperRegsMarked(const BitVector &RegisterSet,
|
||||
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
|
||||
// skip constraining as the instruction defining the register would constrain
|
||||
// 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) {
|
||||
assert((!isTargetSpecificOpcode(II.getOpcode()) || RegMO.isUse()) &&
|
||||
"Register class constraint is required unless either the "
|
||||
|
|
Loading…
Reference in New Issue