Changes For Bug 352
[oota-llvm.git] / lib / CodeGen / BranchFolding.cpp
index 980852e8cdb477501813eeed0d778eb9d2637c0e..cca9f93553c60a215ac0981eb8247364ca02eff3 100644 (file)
@@ -20,6 +20,7 @@
 #include "llvm/CodeGen/MachineFunctionPass.h"
 #include "llvm/Target/TargetInstrInfo.h"
 #include "llvm/Target/TargetMachine.h"
+#include "llvm/ADT/STLExtras.h"
 using namespace llvm;
 
 namespace {
@@ -27,8 +28,8 @@ namespace {
     virtual bool runOnMachineFunction(MachineFunction &MF);
     virtual const char *getPassName() const { return "Branch Folder"; }
   private:
-    bool OptimizeBlock(MachineBasicBlock *MBB, const TargetInstrInfo &TII);
-
+    bool OptimizeBlock(MachineFunction::iterator MBB,
+                       const TargetInstrInfo &TII);
 
     bool isUncondBranch(const MachineInstr *MI, const TargetInstrInfo &TII) {
       return TII.isBarrier(MI->getOpcode()) && TII.isBranch(MI->getOpcode());
@@ -95,7 +96,7 @@ static void ReplaceUsesOfBlockWith(MachineBasicBlock *BB,
 
   // If BB falls through into Old, insert an unconditional branch to New.
   MachineFunction::iterator BBSucc = BB; ++BBSucc;
-  if (&*BBSucc == Old)
+  if (BBSucc != BB->getParent()->end() && &*BBSucc == Old)
     TII.insertGoto(*BB, *New);
 
   std::vector<MachineBasicBlock*> Succs(BB->succ_begin(), BB->succ_end());
@@ -107,13 +108,13 @@ static void ReplaceUsesOfBlockWith(MachineBasicBlock *BB,
 }
 
 
-bool BranchFolder::OptimizeBlock(MachineBasicBlock *MBB,
+bool BranchFolder::OptimizeBlock(MachineFunction::iterator MBB,
                                  const TargetInstrInfo &TII) {
   // If this block is empty, make everyone use it's fall-through, not the block
   // explicitly.
   if (MBB->empty()) {
     if (MBB->pred_empty()) return false;
-    MachineFunction::iterator FallThrough = MBB; ++FallThrough;
+    MachineFunction::iterator FallThrough =next(MBB);
     assert(FallThrough != MBB->getParent()->end() &&
            "Fell off the end of the function!");
     while (!MBB->pred_empty()) {
@@ -138,7 +139,7 @@ bool BranchFolder::OptimizeBlock(MachineBasicBlock *MBB,
 
       // If MBB does not end with a barrier, add a goto instruction to the end.
       if (Pred->empty() || !TII.isBarrier(Pred->back().getOpcode()))
-        TII.insertGoto(*Pred, *++MachineFunction::iterator(MBB));
+        TII.insertGoto(*Pred, *next(MBB));
 
       // Update the CFG now.
       Pred->removeSuccessor(Pred->succ_begin());
@@ -170,10 +171,11 @@ bool BranchFolder::OptimizeBlock(MachineBasicBlock *MBB,
   if (isUncondBranch(--MBB->end(), TII)) {
     MachineBasicBlock::iterator MI = --MBB->end();
     MachineInstr *UncondBr = MI;
-    MachineFunction::iterator FallThrough = MBB; ++FallThrough;
+    MachineFunction::iterator FallThrough = next(MBB);
 
-    MachineBasicBlock *UncondDest = MI->getOperand(0).getMachineBasicBlock();
-    if (UncondDest == &*FallThrough) {
+    MachineFunction::iterator UncondDest =
+      MI->getOperand(0).getMachineBasicBlock();
+    if (UncondDest == FallThrough) {
       // Just delete the branch.  This does not effect the CFG.
       MBB->erase(UncondBr);
       return true;
@@ -186,7 +188,8 @@ bool BranchFolder::OptimizeBlock(MachineBasicBlock *MBB,
       // We assume that conditional branches always have the branch dest as the
       // last operand.  This could be generalized in the future if needed.
       unsigned LastOpnd = MI->getNumOperands()-1;
-      if (MI->getOperand(LastOpnd).getMachineBasicBlock() == &*FallThrough) {
+      if (MachineFunction::iterator(
+            MI->getOperand(LastOpnd).getMachineBasicBlock()) == FallThrough) {
         // Change the cond branch to go to the uncond dest, nuke the uncond,
         // then reverse the condition.
         MI->getOperand(LastOpnd).setMachineBasicBlock(UncondDest);