aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/MachineBasicBlock.cpp
diff options
context:
space:
mode:
authorCameron Zwarich <zwarich@apple.com>2013-02-17 01:45:04 +0000
committerCameron Zwarich <zwarich@apple.com>2013-02-17 01:45:04 +0000
commitddeabf78a0b04579dc03f3d3ff862fc05943db6c (patch)
treeb563c7d432c1a794e23bc872bd6853f12a2639c0 /llvm/lib/CodeGen/MachineBasicBlock.cpp
parentbfebb419844b1d9c63ad14d0cff51e19935a45a4 (diff)
downloadllvm-ddeabf78a0b04579dc03f3d3ff862fc05943db6c.zip
llvm-ddeabf78a0b04579dc03f3d3ff862fc05943db6c.tar.gz
llvm-ddeabf78a0b04579dc03f3d3ff862fc05943db6c.tar.bz2
Fix a conversion from a forward iterator to a reverse iterator in
MachineBasicBlock::SplitCriticalEdge. Since this is an iterator rather than an instr_iterator, the isBundled() check only passes if getFirstTerminator() returned end() and the garbage memory happens to lean that way. Multiple successors can be present without any terminator instructions in the case of exception handling with a fallthrough. llvm-svn: 175383
Diffstat (limited to 'llvm/lib/CodeGen/MachineBasicBlock.cpp')
-rw-r--r--llvm/lib/CodeGen/MachineBasicBlock.cpp13
1 files changed, 7 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/MachineBasicBlock.cpp b/llvm/lib/CodeGen/MachineBasicBlock.cpp
index 3d75436..f22a707 100644
--- a/llvm/lib/CodeGen/MachineBasicBlock.cpp
+++ b/llvm/lib/CodeGen/MachineBasicBlock.cpp
@@ -852,12 +852,13 @@ MachineBasicBlock::SplitCriticalEdge(MachineBasicBlock *Succ, Pass *P) {
// Update all intervals for registers whose uses may have been modified by
// updateTerminator().
iterator FirstTerminator = getFirstTerminator();
- MachineInstr *FirstTerminatorMI = FirstTerminator;
- if (FirstTerminatorMI->isBundled())
- FirstTerminatorMI = getBundleStart(FirstTerminatorMI);
- reverse_iterator PreTerminators =
- (FirstTerminator == begin()) ? rend()
- : reverse_iterator(FirstTerminatorMI);
+ reverse_iterator PreTerminators;
+ if (FirstTerminator == begin())
+ PreTerminators = rend();
+ else if (FirstTerminator == end())
+ PreTerminators = rbegin();
+ else
+ PreTerminators = reverse_iterator(FirstTerminator);
LIS->repairIntervalsInRange(this, rbegin(), PreTerminators, UsedRegs);
}