aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/RegisterScavenging.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen/RegisterScavenging.cpp')
-rw-r--r--llvm/lib/CodeGen/RegisterScavenging.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/RegisterScavenging.cpp b/llvm/lib/CodeGen/RegisterScavenging.cpp
index c0a07ec4c91d..424ad7419165 100644
--- a/llvm/lib/CodeGen/RegisterScavenging.cpp
+++ b/llvm/lib/CodeGen/RegisterScavenging.cpp
@@ -533,6 +533,22 @@ Register RegScavenger::scavengeRegister(const TargetRegisterClass *RC,
Candidates.reset(*AI);
}
+ // If we have already scavenged some registers, remove them from the
+ // candidates. If we end up recursively calling eliminateFrameIndex, we don't
+ // want to be clobbering previously scavenged registers or their associated
+ // stack slots.
+ for (ScavengedInfo &SI : Scavenged) {
+ if (SI.Reg) {
+ if (isRegUsed(SI.Reg)) {
+ LLVM_DEBUG(
+ dbgs() << "Removing " << printReg(SI.Reg, TRI) <<
+ " from scavenging candidates since it was already scavenged\n");
+ for (MCRegAliasIterator AI(SI.Reg, TRI, true); AI.isValid(); ++AI)
+ Candidates.reset(*AI);
+ }
+ }
+ }
+
// Try to find a register that's unused if there is one, as then we won't
// have to spill.
BitVector Available = getRegsAvailable(RC);
@@ -553,6 +569,12 @@ Register RegScavenger::scavengeRegister(const TargetRegisterClass *RC,
if (!AllowSpill)
return 0;
+#ifndef NDEBUG
+ for (ScavengedInfo &SI : Scavenged) {
+ assert(SI.Reg != SReg && "scavenged a previously scavenged register");
+ }
+#endif
+
ScavengedInfo &Scavenged = spill(SReg, *RC, SPAdj, I, UseMI);
Scavenged.Restore = &*std::prev(UseMI);