aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/RegisterScavenging.cpp
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2016-05-20 14:18:54 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2016-05-20 14:18:54 +0000
commit70b1eee793e751c3a0b1084347e6645bced90da2 (patch)
tree97f0f52e7031d148d9669c075f9a45626b8d0b46 /llvm/lib/CodeGen/RegisterScavenging.cpp
parent42bbe77009b0875524f9f14b176c757393bf5da3 (diff)
downloadllvm-70b1eee793e751c3a0b1084347e6645bced90da2.zip
llvm-70b1eee793e751c3a0b1084347e6645bced90da2.tar.gz
llvm-70b1eee793e751c3a0b1084347e6645bced90da2.tar.bz2
Skip entries with invalid indexes in the search loop in register scavenger
llvm-svn: 270219
Diffstat (limited to 'llvm/lib/CodeGen/RegisterScavenging.cpp')
-rw-r--r--llvm/lib/CodeGen/RegisterScavenging.cpp5
1 files changed, 4 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/RegisterScavenging.cpp b/llvm/lib/CodeGen/RegisterScavenging.cpp
index b7836b4..2cd5233 100644
--- a/llvm/lib/CodeGen/RegisterScavenging.cpp
+++ b/llvm/lib/CodeGen/RegisterScavenging.cpp
@@ -400,11 +400,14 @@ unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC,
unsigned NeedAlign = RC->getAlignment();
unsigned SI = Scavenged.size(), Diff = UINT_MAX;
+ int FIB = MFI.getObjectIndexBegin(), FIE = MFI.getObjectIndexEnd();
for (unsigned I = 0; I < Scavenged.size(); ++I) {
if (Scavenged[I].Reg != 0)
continue;
// Verify that this slot is valid for this register.
int FI = Scavenged[I].FrameIndex;
+ if (FI < FIB || FI >= FIE)
+ continue;
unsigned S = MFI.getObjectSize(FI);
unsigned A = MFI.getObjectAlignment(FI);
if (NeedSize > S || NeedAlign > A)
@@ -425,7 +428,7 @@ unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC,
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());
+ Scavenged.push_back(ScavengedInfo(FIE));
}
// Avoid infinite regress