Skip to content

Commit f6fc64a

Browse files
committed
[RegisterCoalescer]: Try inflated RC for coalescing
Change-Id: I0b11da920c4c2bcf6a8298e03470f2108490a1e6
1 parent 05a6bc6 commit f6fc64a

19 files changed

+9705
-7279
lines changed

llvm/lib/CodeGen/RegisterCoalescer.cpp

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -477,8 +477,9 @@ bool CoalescerPair::setRegisters(const MachineInstr *MI) {
477477
Flipped = true;
478478
}
479479

480-
const MachineRegisterInfo &MRI = MI->getMF()->getRegInfo();
481-
const TargetRegisterClass *SrcRC = MRI.getRegClass(Src);
480+
MachineRegisterInfo *MRI =
481+
const_cast<MachineRegisterInfo *>(&MI->getMF()->getRegInfo());
482+
const TargetRegisterClass *SrcRC = MRI->getRegClass(Src);
482483

483484
if (Dst.isPhysical()) {
484485
// Eliminate DstSub on a physreg.
@@ -499,7 +500,14 @@ bool CoalescerPair::setRegisters(const MachineInstr *MI) {
499500
}
500501
} else {
501502
// Both registers are virtual.
502-
const TargetRegisterClass *DstRC = MRI.getRegClass(Dst);
503+
const TargetRegisterClass *DstRC = MRI->getRegClass(Dst);
504+
505+
auto recomputeRegClasses = [&MRI](Register &Src, Register &Dst) {
506+
bool Success = false;
507+
Success = MRI->recomputeRegClass(Src);
508+
Success |= MRI->recomputeRegClass(Dst);
509+
return Success;
510+
};
503511

504512
// Both registers have subreg indices.
505513
if (SrcSub && DstSub) {
@@ -509,19 +517,42 @@ bool CoalescerPair::setRegisters(const MachineInstr *MI) {
509517

510518
NewRC = TRI.getCommonSuperRegClass(SrcRC, SrcSub, DstRC, DstSub, SrcIdx,
511519
DstIdx);
512-
if (!NewRC)
513-
return false;
520+
if (!NewRC) {
521+
if (recomputeRegClasses(Src, Dst)) {
522+
SrcRC = MRI->getRegClass(Src);
523+
DstRC = MRI->getRegClass(Dst);
524+
NewRC = TRI.getCommonSuperRegClass(SrcRC, SrcSub, DstRC, DstSub,
525+
SrcIdx, DstIdx);
526+
}
527+
if (!NewRC)
528+
return false;
529+
}
514530
} else if (DstSub) {
515531
// SrcReg will be merged with a sub-register of DstReg.
516532
SrcIdx = DstSub;
517533
NewRC = TRI.getMatchingSuperRegClass(DstRC, SrcRC, DstSub);
534+
if (!NewRC && recomputeRegClasses(Src, Dst)) {
535+
SrcRC = MRI->getRegClass(Src);
536+
DstRC = MRI->getRegClass(Dst);
537+
NewRC = TRI.getMatchingSuperRegClass(SrcRC, DstRC, DstSub);
538+
}
518539
} else if (SrcSub) {
519540
// DstReg will be merged with a sub-register of SrcReg.
520541
DstIdx = SrcSub;
521542
NewRC = TRI.getMatchingSuperRegClass(SrcRC, DstRC, SrcSub);
543+
if (!NewRC && recomputeRegClasses(Src, Dst)) {
544+
SrcRC = MRI->getRegClass(Src);
545+
DstRC = MRI->getRegClass(Dst);
546+
NewRC = TRI.getMatchingSuperRegClass(SrcRC, DstRC, SrcSub);
547+
}
522548
} else {
523549
// This is a straight copy without sub-registers.
524550
NewRC = TRI.getCommonSubClass(DstRC, SrcRC);
551+
if (!NewRC && recomputeRegClasses(Src, Dst)) {
552+
SrcRC = MRI->getRegClass(Src);
553+
DstRC = MRI->getRegClass(Dst);
554+
NewRC = TRI.getCommonSubClass(DstRC, SrcRC);
555+
}
525556
}
526557

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

0 commit comments

Comments
 (0)