mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 20:29:48 +00:00
Constrain register classes instead of emitting copies.
Sometimes register class constraints are trivial, like GR32->GR32_NOSP, or GPR->rGPR. Teach InstrEmitter to simply constrain the virtual register instead of emitting a copy in these cases. Normally, these copies are handled by the coalescer. This saves some coalescer work. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140340 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
91fb536a34
commit
08f5cdf5b3
@ -280,15 +280,17 @@ InstrEmitter::AddRegisterOperand(MachineInstr *MI, SDValue Op,
|
||||
MCID.OpInfo[IIOpNum].isOptionalDef();
|
||||
|
||||
// If the instruction requires a register in a different class, create
|
||||
// a new virtual register and copy the value into it.
|
||||
// a new virtual register and copy the value into it, but first attempt to
|
||||
// shrink VReg's register class within reason. For example, if VReg == GR32
|
||||
// and II requires a GR32_NOSP, just constrain VReg to GR32_NOSP.
|
||||
const unsigned MinRCSize = 4;
|
||||
if (II) {
|
||||
const TargetRegisterClass *SrcRC = MRI->getRegClass(VReg);
|
||||
const TargetRegisterClass *DstRC = 0;
|
||||
if (IIOpNum < II->getNumOperands())
|
||||
DstRC = TII->getRegClass(*II, IIOpNum, TRI);
|
||||
assert((DstRC || (MCID.isVariadic() && IIOpNum >= MCID.getNumOperands())) &&
|
||||
"Don't have operand info for this instruction!");
|
||||
if (DstRC && !SrcRC->hasSuperClassEq(DstRC)) {
|
||||
if (DstRC && !MRI->constrainRegClass(VReg, DstRC, MinRCSize)) {
|
||||
unsigned NewVReg = MRI->createVirtualRegister(DstRC);
|
||||
BuildMI(*MBB, InsertPos, Op.getNode()->getDebugLoc(),
|
||||
TII->get(TargetOpcode::COPY), NewVReg).addReg(VReg);
|
||||
|
Loading…
Reference in New Issue
Block a user