Skip to content

Commit 6141f53

Browse files
fix: fold the offset into FIOp if scavenger couldn't find free sgpr
1 parent c69df65 commit 6141f53

File tree

3 files changed

+42
-60
lines changed

3 files changed

+42
-60
lines changed

llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)