@@ -438,15 +438,38 @@ void SIFoldOperands::foldOperand(
438
438
439
439
bool FoldingImm = OpToFold.isImm ();
440
440
441
- // In order to fold immediates into copies, we need to change the
442
- // copy to a MOV.
443
441
if (FoldingImm && UseMI->isCopy ()) {
444
442
unsigned DestReg = UseMI->getOperand (0 ).getReg ();
445
443
const TargetRegisterClass *DestRC
446
444
= TargetRegisterInfo::isVirtualRegister (DestReg) ?
447
445
MRI->getRegClass (DestReg) :
448
446
TRI->getPhysRegClass (DestReg);
449
447
448
+ unsigned SrcReg = UseMI->getOperand (1 ).getReg ();
449
+ if (TargetRegisterInfo::isVirtualRegister (DestReg) &&
450
+ TargetRegisterInfo::isVirtualRegister (SrcReg)) {
451
+ const TargetRegisterClass * SrcRC = MRI->getRegClass (SrcReg);
452
+ if (TRI->isSGPRClass (SrcRC) && TRI->hasVGPRs (DestRC)) {
453
+ MachineRegisterInfo::use_iterator NextUse;
454
+ SmallVector<FoldCandidate, 4 > CopyUses;
455
+ for (MachineRegisterInfo::use_iterator
456
+ Use = MRI->use_begin (DestReg), E = MRI->use_end ();
457
+ Use != E; Use = NextUse) {
458
+ NextUse = std::next (Use);
459
+ FoldCandidate FC = FoldCandidate (Use->getParent (),
460
+ Use.getOperandNo (), &UseMI->getOperand (1 ));
461
+ CopyUses.push_back (FC);
462
+ }
463
+ for (auto & F : CopyUses) {
464
+ foldOperand (*F.OpToFold , F.UseMI , F.UseOpNo ,
465
+ FoldList, CopiesToReplace);
466
+ }
467
+ }
468
+ }
469
+
470
+ // In order to fold immediates into copies, we need to change the
471
+ // copy to a MOV.
472
+
450
473
unsigned MovOp = TII->getMovOpcode (DestRC);
451
474
if (MovOp == AMDGPU::COPY)
452
475
return ;
0 commit comments