[llvm] r178073 - Fix the register scavenger for targets that provide custom spilling
Hal Finkel
hfinkel at anl.gov
Tue Mar 26 14:20:15 PDT 2013
Author: hfinkel
Date: Tue Mar 26 16:20:15 2013
New Revision: 178073
URL: http://llvm.org/viewvc/llvm-project?rev=178073&view=rev
Log:
Fix the register scavenger for targets that provide custom spilling
As pointed out by Richard Sandiford, my recent updates to the register
scavenger broke targets that use custom spilling (because the new code assumed
that if there were no valid spill slots, than spilling would be impossible).
I don't have a test case, but it should be possible to create one for Thumb 1,
Mips 16, etc.
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=178073&r1=178072&r2=178073&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/RegisterScavenging.h (original)
+++ llvm/trunk/include/llvm/CodeGen/RegisterScavenging.h Tue Mar 26 16:20:15 2013
@@ -42,7 +42,7 @@ class RegScavenger {
/// Information on scavenged registers (held in a spill slot).
struct ScavengedInfo {
- ScavengedInfo(int FI) : FrameIndex(FI), Reg(0), Restore(NULL) {}
+ ScavengedInfo(int FI = -1) : FrameIndex(FI), Reg(0), Restore(NULL) {}
/// A spill slot used for scavenging a register post register allocation.
int FrameIndex;
@@ -130,7 +130,8 @@ public:
void getScavengingFrameIndices(SmallVectorImpl<int> &A) const {
for (SmallVector<ScavengedInfo, 2>::const_iterator I = Scavenged.begin(),
IE = Scavenged.end(); I != IE; ++I)
- A.push_back(I->FrameIndex);
+ if (I->FrameIndex >= 0)
+ A.push_back(I->FrameIndex);
}
/// scavengeRegister - Make a register of the specific register class
Modified: llvm/trunk/lib/CodeGen/RegisterScavenging.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegisterScavenging.cpp?rev=178073&r1=178072&r2=178073&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/RegisterScavenging.cpp (original)
+++ llvm/trunk/lib/CodeGen/RegisterScavenging.cpp Tue Mar 26 16:20:15 2013
@@ -371,8 +371,11 @@ unsigned RegScavenger::scavengeRegister(
if (Scavenged[SI].Reg == 0)
break;
- assert(SI < Scavenged.size() &&
- "Scavenger slots are live, unable to scavenge another register!");
+ if (SI < Scavenged.size()) {
+ // We need to scavenge a register but have no spill slot, the target
+ // must know how to do it (if not, we'll assert below).
+ Scavenged.push_back(ScavengedInfo());
+ }
// Avoid infinite regress
Scavenged[SI].Reg = SReg;
More information about the llvm-commits
mailing list