summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustin Bogner <mail@justinbogner.com>2016-05-23 21:40:52 +0000
committerJustin Bogner <mail@justinbogner.com>2016-05-23 21:40:52 +0000
commit4a57bb5a3b74bdad9b0518009a7d7ac7ca2ac650 (patch)
tree052aa0ad906b35df954bb868c3c3bae892c76481
parent9873e2c46794407531737f5b6560488a02cb4a69 (diff)
downloadbcm5719-llvm-4a57bb5a3b74bdad9b0518009a7d7ac7ca2ac650.tar.gz
bcm5719-llvm-4a57bb5a3b74bdad9b0518009a7d7ac7ca2ac650.zip
PrologEpilogInserter: Avoid an infinite loop when MinCSFrameIndex == 0
Before r269750 we did the comparisons in this loop in signed ints so that it DTRT when MinCSFrameIndex was 0. This was changed because it's now possible for MinCSFrameIndex to be UINT_MAX, but that introduced a bug when we were comparing `>= 0` - this is tautological in unsigned. Rework the comparisons here to avoid issues with unsigned wrapping. No test. I couldn't find a way to get any of the StackGrowsUp in-tree targets to reach the code that sets MinCSFrameIndex. llvm-svn: 270492
-rw-r--r--llvm/lib/CodeGen/PrologEpilogInserter.cpp6
1 files changed, 3 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp
index a119b1c62eb..f61c0cb6da0 100644
--- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp
+++ b/llvm/lib/CodeGen/PrologEpilogInserter.cpp
@@ -654,9 +654,9 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
DEBUG(dbgs() << "alloc FI(" << i << ") at SP[" << -Offset << "]\n");
MFI->setObjectOffset(i, -Offset); // Set the computed offset
}
- } else {
- unsigned MaxCSFI = MaxCSFrameIndex, MinCSFI = MinCSFrameIndex;
- for (unsigned i = MaxCSFI; i >= MinCSFI; --i) {
+ } else if (MaxCSFrameIndex >= MinCSFrameIndex) {
+ // Be careful about underflow in comparisons agains MinCSFrameIndex.
+ for (unsigned i = MaxCSFrameIndex; i != MinCSFrameIndex - 1; --i) {
unsigned Align = MFI->getObjectAlignment(i);
// Adjust to alignment boundary
Offset = alignTo(Offset, Align, Skew);
OpenPOWER on IntegriCloud