Skip to content

Commit f523a93

Browse files
committed
[RegisterCoalescer]: Try inflated RC for coalescing
Change-Id: Iff80066d6eda0189bb39a7a5680d23fa87adb08d
1 parent 5722e23 commit f523a93

9 files changed

+4748
-4629
lines changed

llvm/lib/CodeGen/RegisterCoalescer.cpp

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,30 @@ static bool isSplitEdge(const MachineBasicBlock *MBB) {
456456
return true;
457457
}
458458

459+
static const TargetRegisterClass *
460+
getLargestLegalRegClass(Register Reg, const MachineFunction *MF,
461+
const MachineRegisterInfo &MRI) {
462+
const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo();
463+
const TargetRegisterClass *OldRC = MRI.getRegClass(Reg);
464+
const TargetRegisterInfo *TRI = MRI.getTargetRegisterInfo();
465+
const TargetRegisterClass *NewRC = TRI->getLargestLegalSuperClass(OldRC, *MF);
466+
// Stop early if there is no room to grow.
467+
if (NewRC == OldRC)
468+
return OldRC;
469+
470+
// Accumulate constraints from all uses.
471+
for (MachineOperand &MO : MRI.reg_nodbg_operands(Reg)) {
472+
// Apply the effect of the given operand to NewRC.
473+
MachineInstr *MI = MO.getParent();
474+
unsigned OpNo = &MO - &MI->getOperand(0);
475+
NewRC = MI->getRegClassConstraintEffect(OpNo, NewRC, TII, TRI);
476+
if (!NewRC || NewRC == OldRC) {
477+
return OldRC;
478+
}
479+
}
480+
return NewRC;
481+
}
482+
459483
bool CoalescerPair::setRegisters(const MachineInstr *MI) {
460484
SrcReg = DstReg = Register();
461485
SrcIdx = DstIdx = 0;
@@ -477,7 +501,9 @@ bool CoalescerPair::setRegisters(const MachineInstr *MI) {
477501
Flipped = true;
478502
}
479503

480-
const MachineRegisterInfo &MRI = MI->getMF()->getRegInfo();
504+
const MachineFunction *MF = MI->getMF();
505+
506+
const MachineRegisterInfo &MRI = MF->getRegInfo();
481507
const TargetRegisterClass *SrcRC = MRI.getRegClass(Src);
482508

483509
if (Dst.isPhysical()) {
@@ -509,19 +535,41 @@ bool CoalescerPair::setRegisters(const MachineInstr *MI) {
509535

510536
NewRC = TRI.getCommonSuperRegClass(SrcRC, SrcSub, DstRC, DstSub, SrcIdx,
511537
DstIdx);
512-
if (!NewRC)
513-
return false;
538+
if (!NewRC) {
539+
auto SuperDstRC = getLargestLegalRegClass(Dst, MF, MRI);
540+
if (SuperDstRC != DstRC)
541+
NewRC = TRI.getCommonSuperRegClass(SrcRC, SrcSub, SuperDstRC, DstSub,
542+
SrcIdx, DstIdx);
543+
if (!NewRC)
544+
return false;
545+
}
514546
} else if (DstSub) {
515547
// SrcReg will be merged with a sub-register of DstReg.
516548
SrcIdx = DstSub;
517549
NewRC = TRI.getMatchingSuperRegClass(DstRC, SrcRC, DstSub);
550+
if (!NewRC) {
551+
auto SuperDstRC = getLargestLegalRegClass(Dst, MF, MRI);
552+
if (SuperDstRC != DstRC)
553+
NewRC = TRI.getMatchingSuperRegClass(SuperDstRC, SrcRC, DstSub);
554+
}
518555
} else if (SrcSub) {
519556
// DstReg will be merged with a sub-register of SrcReg.
520557
DstIdx = SrcSub;
521558
NewRC = TRI.getMatchingSuperRegClass(SrcRC, DstRC, SrcSub);
559+
if (!NewRC) {
560+
auto SuperDstRC = getLargestLegalRegClass(Dst, MF, MRI);
561+
if (SuperDstRC != DstRC)
562+
NewRC = TRI.getMatchingSuperRegClass(SrcRC, SuperDstRC, SrcSub);
563+
}
564+
522565
} else {
523566
// This is a straight copy without sub-registers.
524567
NewRC = TRI.getCommonSubClass(DstRC, SrcRC);
568+
if (!NewRC) {
569+
auto SuperDstRC = getLargestLegalRegClass(Dst, MF, MRI);
570+
if (SuperDstRC != DstRC)
571+
NewRC = TRI.getCommonSubClass(SuperDstRC, SrcRC);
572+
}
525573
}
526574

527575
// The combined constraint may be impossible to satisfy.

0 commit comments

Comments
 (0)