@@ -2769,12 +2769,15 @@ bool SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI,
27692769 // available.
27702770 if (!TmpReg)
27712771 TmpReg = RS->scavengeRegisterBackwards (AMDGPU::SReg_32_XM0RegClass,
2772- MI, false , 0 );
2773- BuildMI (*MBB, *MI, DL, TII->get (AMDGPU::S_LSHR_B32))
2774- .addDef (TmpReg, RegState::Renamable)
2775- .addReg (FrameReg)
2776- .addImm (ST.getWavefrontSizeLog2 ())
2777- .setOperandDead (3 ); // Set SCC dead
2772+ MI, /* RestoreAfter=*/ false , 0 ,
2773+ /* AllowSpill=*/ false );
2774+ if (TmpReg) {
2775+ BuildMI (*MBB, *MI, DL, TII->get (AMDGPU::S_LSHR_B32))
2776+ .addDef (TmpReg, RegState::Renamable)
2777+ .addReg (FrameReg)
2778+ .addImm (ST.getWavefrontSizeLog2 ())
2779+ .setOperandDead (3 ); // Set SCC dead
2780+ }
27782781 MaterializedReg = TmpReg;
27792782 }
27802783
@@ -2799,23 +2802,23 @@ bool SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI,
27992802 TmpReg = RS->scavengeRegisterBackwards (AMDGPU::SReg_32_XM0RegClass,
28002803 MI, /* RestoreAfter=*/ false , 0 ,
28012804 /* AllowSpill=*/ false );
2802- if (!TmpReg)
2803- break ;
28042805 DstReg = TmpReg;
28052806 }
2806-
2807- auto AddI32 = BuildMI (*MBB, *MI, DL, MI->getDesc ())
2808- .addDef (DstReg, RegState::Renamable)
2809- .addReg (MaterializedReg, RegState::Kill)
2810- .add (OtherOp);
2811- if (DeadSCC)
2812- AddI32.setOperandDead (3 );
2813-
2814- MaterializedReg = DstReg;
2815-
2816- OtherOp.ChangeToRegister (MaterializedReg, false );
2817- OtherOp.setIsKill (true );
2818- OtherOp.setIsRenamable (true );
2807+ // Avoid clobbering framereg if scavenger could not find a free sgpr.
2808+ if (DstReg) {
2809+ auto AddI32 = BuildMI (*MBB, *MI, DL, MI->getDesc ())
2810+ .addDef (DstReg, RegState::Renamable)
2811+ .addReg (MaterializedReg, RegState::Kill)
2812+ .add (OtherOp);
2813+ if (DeadSCC)
2814+ AddI32.setOperandDead (3 );
2815+
2816+ MaterializedReg = DstReg;
2817+
2818+ OtherOp.ChangeToRegister (MaterializedReg, false );
2819+ OtherOp.setIsKill (true );
2820+ OtherOp.setIsRenamable (true );
2821+ }
28192822 FIOp->ChangeToImmediate (Offset);
28202823 } else {
28212824 // If we don't have any other offset to apply, we can just directly
0 commit comments