forked from OSchip/llvm-project
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
This commit is contained in:
parent
bfebb41984
commit
ddeabf78a0
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue