Misuse of MRI.getRegClass in multiple target's FastIsel code

This code or subtle variations of it appears in multiple targets. It tries to convert from a register to a register class using getRegClass, but getRegClass is really supposed to take a register class enum value and get the register class object for it. It doesn’t convert a register to a class. In fact there’s not always a single or canonical class for a given register.

What is the right way to do this?

unsigned SrcReg = Reg + VA.getValNo();
unsigned DestReg = VA.getLocReg();
// Avoid a cross-class copy. This is very unlikely.
if (!MRI.getRegClass(SrcReg)->contains(DestReg))
return false;

MachineRegisterInfo::getRegClass does take a virtual register and returns the TargetRegisterClass of that register. You're thinking about TargetRegisterInfo::getRegClass.


Yeah I just noticed that. Thanks!