@@ -477,8 +477,9 @@ bool CoalescerPair::setRegisters(const MachineInstr *MI) {
477
477
Flipped = true ;
478
478
}
479
479
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);
482
483
483
484
if (Dst.isPhysical ()) {
484
485
// Eliminate DstSub on a physreg.
@@ -499,7 +500,14 @@ bool CoalescerPair::setRegisters(const MachineInstr *MI) {
499
500
}
500
501
} else {
501
502
// 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
+ };
503
511
504
512
// Both registers have subreg indices.
505
513
if (SrcSub && DstSub) {
@@ -509,19 +517,42 @@ bool CoalescerPair::setRegisters(const MachineInstr *MI) {
509
517
510
518
NewRC = TRI.getCommonSuperRegClass (SrcRC, SrcSub, DstRC, DstSub, SrcIdx,
511
519
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
+ }
514
530
} else if (DstSub) {
515
531
// SrcReg will be merged with a sub-register of DstReg.
516
532
SrcIdx = DstSub;
517
533
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
+ }
518
539
} else if (SrcSub) {
519
540
// DstReg will be merged with a sub-register of SrcReg.
520
541
DstIdx = SrcSub;
521
542
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
+ }
522
548
} else {
523
549
// This is a straight copy without sub-registers.
524
550
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
+ }
525
556
}
526
557
527
558
// The combined constraint may be impossible to satisfy.
0 commit comments