[llvm] r354816 - RegisterScavenger: Allow fail without spill
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 25 12:29:04 PST 2019
Author: arsenm
Date: Mon Feb 25 12:29:04 2019
New Revision: 354816
URL: http://llvm.org/viewvc/llvm-project?rev=354816&view=rev
Log:
RegisterScavenger: Allow fail without spill
AMDGPU wants to use this in some contexts where
the spilling is either impossible, or a worse alternative
to doing something else.
Modified:
llvm/trunk/include/llvm/CodeGen/RegisterScavenging.h
llvm/trunk/lib/CodeGen/RegisterScavenging.cpp
Modified: llvm/trunk/include/llvm/CodeGen/RegisterScavenging.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/RegisterScavenging.h?rev=354816&r1=354815&r2=354816&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/RegisterScavenging.h (original)
+++ llvm/trunk/include/llvm/CodeGen/RegisterScavenging.h Mon Feb 25 12:29:04 2019
@@ -157,10 +157,15 @@ public:
/// Returns the scavenged register.
/// This is deprecated as it depends on the quality of the kill flags being
/// present; Use scavengeRegisterBackwards() instead!
+ ///
+ /// If \p AllowSpill is false, fail if a spill is required to make the
+ /// register available, and return NoRegister.
unsigned scavengeRegister(const TargetRegisterClass *RC,
- MachineBasicBlock::iterator I, int SPAdj);
- unsigned scavengeRegister(const TargetRegisterClass *RegClass, int SPAdj) {
- return scavengeRegister(RegClass, MBBI, SPAdj);
+ MachineBasicBlock::iterator I, int SPAdj,
+ bool AllowSpill = true);
+ unsigned scavengeRegister(const TargetRegisterClass *RegClass, int SPAdj,
+ bool AllowSpill = true) {
+ return scavengeRegister(RegClass, MBBI, SPAdj, AllowSpill);
}
/// Make a register of the specific register class available from the current
@@ -169,9 +174,13 @@ public:
/// SPAdj is the stack adjustment due to call frame, it's passed along to
/// eliminateFrameIndex().
/// Returns the scavenged register.
+ ///
+ /// If \p AllowSpill is false, fail if a spill is required to make the
+ /// register available, and return NoRegister.
unsigned scavengeRegisterBackwards(const TargetRegisterClass &RC,
MachineBasicBlock::iterator To,
- bool RestoreAfter, int SPAdj);
+ bool RestoreAfter, int SPAdj,
+ bool AllowSpill = true);
/// Tell the scavenger a register is used.
void setRegUsed(unsigned Reg, LaneBitmask LaneMask = LaneBitmask::getAll());
Modified: llvm/trunk/lib/CodeGen/RegisterScavenging.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegisterScavenging.cpp?rev=354816&r1=354815&r2=354816&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/RegisterScavenging.cpp (original)
+++ llvm/trunk/lib/CodeGen/RegisterScavenging.cpp Mon Feb 25 12:29:04 2019
@@ -533,7 +533,7 @@ RegScavenger::spill(unsigned Reg, const
unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC,
MachineBasicBlock::iterator I,
- int SPAdj) {
+ int SPAdj, bool AllowSpill) {
MachineInstr &MI = *I;
const MachineFunction &MF = *MI.getMF();
// Consider all allocatable registers in the register class initially
@@ -564,6 +564,9 @@ unsigned RegScavenger::scavengeRegister(
return SReg;
}
+ if (!AllowSpill)
+ return 0;
+
ScavengedInfo &Scavenged = spill(SReg, *RC, SPAdj, I, UseMI);
Scavenged.Restore = &*std::prev(UseMI);
@@ -575,7 +578,8 @@ unsigned RegScavenger::scavengeRegister(
unsigned RegScavenger::scavengeRegisterBackwards(const TargetRegisterClass &RC,
MachineBasicBlock::iterator To,
- bool RestoreAfter, int SPAdj) {
+ bool RestoreAfter, int SPAdj,
+ bool AllowSpill) {
const MachineBasicBlock &MBB = *To->getParent();
const MachineFunction &MF = *MBB.getParent();
@@ -589,21 +593,25 @@ unsigned RegScavenger::scavengeRegisterB
MachineBasicBlock::iterator SpillBefore = P.second;
assert(Reg != 0 && "No register left to scavenge!");
// Found an available register?
- if (SpillBefore != MBB.end()) {
- MachineBasicBlock::iterator ReloadAfter =
- RestoreAfter ? std::next(MBBI) : MBBI;
- MachineBasicBlock::iterator ReloadBefore = std::next(ReloadAfter);
- if (ReloadBefore != MBB.end())
- LLVM_DEBUG(dbgs() << "Reload before: " << *ReloadBefore << '\n');
- ScavengedInfo &Scavenged = spill(Reg, RC, SPAdj, SpillBefore, ReloadBefore);
- Scavenged.Restore = &*std::prev(SpillBefore);
- LiveUnits.removeReg(Reg);
- LLVM_DEBUG(dbgs() << "Scavenged register with spill: " << printReg(Reg, TRI)
- << " until " << *SpillBefore);
- } else {
+ if (SpillBefore == MBB.end()) {
LLVM_DEBUG(dbgs() << "Scavenged free register: " << printReg(Reg, TRI)
- << '\n');
+ << '\n');
+ return Reg;
}
+
+ if (!AllowSpill)
+ return 0;
+
+ MachineBasicBlock::iterator ReloadAfter =
+ RestoreAfter ? std::next(MBBI) : MBBI;
+ MachineBasicBlock::iterator ReloadBefore = std::next(ReloadAfter);
+ if (ReloadBefore != MBB.end())
+ LLVM_DEBUG(dbgs() << "Reload before: " << *ReloadBefore << '\n');
+ ScavengedInfo &Scavenged = spill(Reg, RC, SPAdj, SpillBefore, ReloadBefore);
+ Scavenged.Restore = &*std::prev(SpillBefore);
+ LiveUnits.removeReg(Reg);
+ LLVM_DEBUG(dbgs() << "Scavenged register with spill: " << printReg(Reg, TRI)
+ << " until " << *SpillBefore);
return Reg;
}
More information about the llvm-commits
mailing list