Fix a conversion from a forward iterator to a reverse iterator in
authorCameron Zwarich <zwarich@apple.com>
Sun, 17 Feb 2013 01:45:04 +0000 (01:45 +0000)
committerCameron Zwarich <zwarich@apple.com>
Sun, 17 Feb 2013 01:45:04 +0000 (01:45 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175383 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/MachineBasicBlock.cpp

index 3d754366ee454f4e80373f6e3c996ba4d5ffe1cd..f22a70716ebf6ccb4637052a1cec35117d758827 100644 (file)
@@ -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);
   }