summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHal Finkel <hfinkel@anl.gov>2013-03-26 21:20:15 +0000
committerHal Finkel <hfinkel@anl.gov>2013-03-26 21:20:15 +0000
commit1fa2f945ea6e8efef2e9f73833af5550f1b8a1ad (patch)
tree19388a3ea3e566e248a255239968782ddbfc14f0
parent3f617d25d63131920d9637184e1ac19c8092a5e3 (diff)
downloadbcm5719-llvm-1fa2f945ea6e8efef2e9f73833af5550f1b8a1ad.tar.gz
bcm5719-llvm-1fa2f945ea6e8efef2e9f73833af5550f1b8a1ad.zip
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. llvm-svn: 178073
-rw-r--r--llvm/include/llvm/CodeGen/RegisterScavenging.h5
-rw-r--r--llvm/lib/CodeGen/RegisterScavenging.cpp7
2 files changed, 8 insertions, 4 deletions
diff --git a/llvm/include/llvm/CodeGen/RegisterScavenging.h b/llvm/include/llvm/CodeGen/RegisterScavenging.h
index 0eb2b2ab07f..49d16892f87 100644
--- a/llvm/include/llvm/CodeGen/RegisterScavenging.h
+++ b/llvm/include/llvm/CodeGen/RegisterScavenging.h
@@ -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
diff --git a/llvm/lib/CodeGen/RegisterScavenging.cpp b/llvm/lib/CodeGen/RegisterScavenging.cpp
index 4c85644e1a3..6b85cd93cf3 100644
--- a/llvm/lib/CodeGen/RegisterScavenging.cpp
+++ b/llvm/lib/CodeGen/RegisterScavenging.cpp
@@ -371,8 +371,11 @@ unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC,
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;
OpenPOWER on IntegriCloud