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