diff --git a/llvm/lib/CodeGen/IfConversion.cpp b/llvm/lib/CodeGen/IfConversion.cpp
index 37c729d..9b69bf1 100644
--- a/llvm/lib/CodeGen/IfConversion.cpp
+++ b/llvm/lib/CodeGen/IfConversion.cpp
@@ -16,6 +16,7 @@
 #include "llvm/CodeGen/MachineModuleInfo.h"
 #include "llvm/CodeGen/MachineFunctionPass.h"
 #include "llvm/Target/TargetInstrInfo.h"
+#include "llvm/Target/TargetLowering.h"
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/ADT/Statistic.h"
@@ -37,22 +38,24 @@
     /// BBInfo - One per MachineBasicBlock, this is used to cache the result
     /// if-conversion feasibility analysis. This includes results from
     /// TargetInstrInfo::AnalyzeBranch() (i.e. TBB, FBB, and Cond), and its
-    /// classification, and common merge block of its successors (if it's a
+    /// classification, and common tail block of its successors (if it's a
     /// diamond shape).
     struct BBInfo {
       BBICKind Kind;
-      MachineBasicBlock *EBB;
-      MachineBasicBlock *TBB;
-      MachineBasicBlock *FBB;
-      MachineBasicBlock *CMBB;
+      MachineBasicBlock *BB;
+      MachineBasicBlock *TrueBB;
+      MachineBasicBlock *FalseBB;
+      MachineBasicBlock *TailBB;
       std::vector<MachineOperand> Cond;
-      BBInfo() : Kind(ICInvalid), EBB(0), TBB(0), FBB(0), CMBB(0) {}
+      unsigned Size;
+      BBInfo() : Kind(ICInvalid), BB(0), TrueBB(0), FalseBB(0), TailBB(0), Size(0) {}
     };
 
     /// BBAnalysis - Results of if-conversion feasibility analysis indexed by
     /// basic block number.
     std::vector<BBInfo> BBAnalysis;
 
+    const TargetLowering *TLI;
     const TargetInstrInfo *TII;
     bool MadeChange;
   public:
@@ -72,7 +75,7 @@
     void PredicateBlock(MachineBasicBlock *BB,
                         std::vector<MachineOperand> &Cond,
                         bool IgnoreTerm = false);
-    void MergeBlocks(MachineBasicBlock *TBB, MachineBasicBlock *FBB);
+    void MergeBlocks(BBInfo &TrueBBI, BBInfo &FalseBBI);
   };
   char IfConverter::ID = 0;
 }
@@ -80,6 +83,7 @@
 FunctionPass *llvm::createIfConverterPass() { return new IfConverter(); }
 
 bool IfConverter::runOnMachineFunction(MachineFunction &MF) {
+  TLI = MF.getTarget().getTargetLowering();
   TII = MF.getTarget().getInstrInfo();
   if (!TII) return false;
 
@@ -95,7 +99,7 @@
   InitialFunctionAnalysis(MF, Candidates);
 
   for (unsigned i = 0, e = Candidates.size(); i != e; ++i) {
-    BBInfo &BBI = BBAnalysis[i];
+    BBInfo &BBI = BBAnalysis[Candidates[i]];
     switch (BBI.Kind) {
     default: assert(false && "Unexpected!");
       break;
@@ -111,11 +115,11 @@
 }
 
 static MachineBasicBlock *findFalseBlock(MachineBasicBlock *BB,
-                                         MachineBasicBlock *TBB) {
+                                         MachineBasicBlock *TrueBB) {
   for (MachineBasicBlock::succ_iterator SI = BB->succ_begin(),
          E = BB->succ_end(); SI != E; ++SI) {
     MachineBasicBlock *SuccBB = *SI;
-    if (SuccBB != TBB)
+    if (SuccBB != TrueBB)
       return SuccBB;
   }
   return NULL;
@@ -126,36 +130,49 @@
 
   if (BBI.Kind != ICInvalid)
     return;  // Always analyzed.
-  BBI.EBB = BB;
+  BBI.BB = BB;
+  BBI.Size = std::distance(BB->begin(), BB->end());
 
   // Look for 'root' of a simple (non-nested) triangle or diamond.
   BBI.Kind = ICNotClassfied;
-  if (TII->AnalyzeBranch(*BB, BBI.TBB, BBI.FBB, BBI.Cond)
-      || !BBI.TBB || BBI.Cond.size() == 0)
+  if (TII->AnalyzeBranch(*BB, BBI.TrueBB, BBI.FalseBB, BBI.Cond)
+      || !BBI.TrueBB || BBI.Cond.size() == 0)
     return;
-  // Can't do it if 'true' block is already marked as to be if-converted.
-  AnalyzeBlock(BBI.TBB);
-  BBInfo &TBBI = BBAnalysis[BBI.TBB->getNumber()];
-  if (TBBI.Kind != ICNotClassfied)
+
+  // Not a candidate if 'true' block has another predecessor.
+  // FIXME: Use or'd predicate or predicated cmp.
+  if (BBI.TrueBB->pred_size() > 1)
+    return;
+
+  // Not a candidate if 'true' block is going to be if-converted.
+  AnalyzeBlock(BBI.TrueBB);
+  BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()];
+  if (TrueBBI.Kind != ICNotClassfied)
     return;
 
   // No false branch. This BB must end with a conditional branch and a
   // fallthrough.
-  if (!BBI.FBB)
-    BBI.FBB = findFalseBlock(BB, BBI.TBB);  
-  assert(BBI.FBB && "Expected to find the fallthrough block!");
+  if (!BBI.FalseBB)
+    BBI.FalseBB = findFalseBlock(BB, BBI.TrueBB);  
+  assert(BBI.FalseBB && "Expected to find the fallthrough block!");
 
-  // Can't do it if 'false' block is already marked as to be if-converted.
-  AnalyzeBlock(BBI.FBB);
-  BBInfo &FBBI = BBAnalysis[BBI.FBB->getNumber()];
-  if (FBBI.Kind != ICNotClassfied)
+  // Not a candidate if 'false' block has another predecessor.
+  // FIXME: Invert condition and swap 'true' / 'false' blocks?
+  if (BBI.FalseBB->pred_size() > 1)
+    return;
+
+  // Not a candidate if 'false' block is going to be if-converted.
+  AnalyzeBlock(BBI.FalseBB);
+  BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
+  if (FalseBBI.Kind != ICNotClassfied)
     return;
 
   // TODO: Only handle very simple cases for now.
-  if (TBBI.FBB || FBBI.FBB || TBBI.Cond.size() > 1 || FBBI.Cond.size() > 1)
+  if (TrueBBI.FalseBB || FalseBBI.FalseBB ||
+      TrueBBI.Cond.size() || FalseBBI.Cond.size())
     return;
 
-  if (TBBI.TBB && TBBI.TBB == BBI.FBB) {
+  if (TrueBBI.TrueBB && TrueBBI.TrueBB == BBI.FalseBB) {
     // Triangle:
     //   EBB
     //   | \_
@@ -164,19 +181,19 @@
     //   |  /
     //   FBB
     BBI.Kind = ICTriangleEntry;
-    TBBI.Kind = FBBI.Kind = ICTriangle;
-  } else if (TBBI.TBB == FBBI.TBB) {
+    TrueBBI.Kind = FalseBBI.Kind = ICTriangle;
+  } else if (TrueBBI.TrueBB == FalseBBI.TrueBB) {
     // Diamond:
     //   EBB
     //   / \_
     //  |   |
     // TBB FBB
     //   \ /
-    //   MBB
+    //  TailBB
     // Note MBB can be empty in case both TBB and FBB are return blocks.
     BBI.Kind = ICDiamondEntry;
-    TBBI.Kind = FBBI.Kind = ICDiamond;
-    BBI.CMBB = TBBI.TBB;
+    TrueBBI.Kind = FalseBBI.Kind = ICDiamond;
+    BBI.TailBB = TrueBBI.TrueBB;
   }
   return;
 }
@@ -194,24 +211,55 @@
   }
 }
 
+/// TransferPreds - Transfer all the predecessors of FromBB to ToBB.
+///
+static void TransferPreds(MachineBasicBlock *ToBB, MachineBasicBlock *FromBB) {
+   std::vector<MachineBasicBlock*> Preds(FromBB->pred_begin(),
+                                         FromBB->pred_end());
+    for (unsigned i = 0, e = Preds.size(); i != e; ++i) {
+      MachineBasicBlock *Pred = Preds[i];
+      Pred->removeSuccessor(FromBB);
+      if (!Pred->isSuccessor(ToBB))
+        Pred->addSuccessor(ToBB);
+    }
+}
+
+/// TransferSuccs - Transfer all the successors of FromBB to ToBB.
+///
+static void TransferSuccs(MachineBasicBlock *ToBB, MachineBasicBlock *FromBB) {
+   std::vector<MachineBasicBlock*> Succs(FromBB->succ_begin(),
+                                         FromBB->succ_end());
+    for (unsigned i = 0, e = Succs.size(); i != e; ++i) {
+      MachineBasicBlock *Succ = Succs[i];
+      FromBB->removeSuccessor(Succ);
+      if (!ToBB->isSuccessor(Succ))
+        ToBB->addSuccessor(Succ);
+    }
+}
+
 /// IfConvertTriangle - If convert a triangle sub-CFG.
 ///
 bool IfConverter::IfConvertTriangle(BBInfo &BBI) {
-  if (isBlockPredicable(BBI.TBB)) {
+  if (isBlockPredicable(BBI.TrueBB)) {
+    BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()];
+    BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
+
     // Predicate the 'true' block after removing its branch.
-    TII->RemoveBranch(*BBI.TBB);
-    PredicateBlock(BBI.TBB, BBI.Cond);
+    TrueBBI.Size -= TII->RemoveBranch(*BBI.TrueBB);
+    PredicateBlock(BBI.TrueBB, BBI.Cond);
 
     // Join the 'true' and 'false' blocks by copying the instructions
     // from the 'false' block to the 'true' block.
-    MergeBlocks(BBI.TBB, BBI.FBB);
+    BBI.TrueBB->removeSuccessor(BBI.FalseBB);
+    MergeBlocks(TrueBBI, FalseBBI);
 
-    // Adjust entry block, it should have but a single unconditional
-    // branch.
-    BBI.EBB->removeSuccessor(BBI.FBB);
-    TII->RemoveBranch(*BBI.EBB);
-    std::vector<MachineOperand> NoCond;
-    TII->InsertBranch(*BBI.EBB, BBI.TBB, NULL, NoCond);
+    // Now merge the entry of the triangle with the true block.
+    BBI.Size -= TII->RemoveBranch(*BBI.BB);
+    MergeBlocks(BBI, TrueBBI);
+
+    // Update block info.
+    TrueBBI.Kind = ICInvalid;
+    FalseBBI.Kind = ICInvalid;
 
     // FIXME: Must maintain LiveIns.
     NumIfConvBBs++;
@@ -223,14 +271,14 @@
 /// IfConvertDiamond - If convert a diamond sub-CFG.
 ///
 bool IfConverter::IfConvertDiamond(BBInfo &BBI) {
-  if (isBlockPredicable(BBI.TBB) && isBlockPredicable(BBI.FBB)) {
+  if (isBlockPredicable(BBI.TrueBB) && isBlockPredicable(BBI.FalseBB)) {
     std::vector<MachineInstr*> Dups;
-    if (!BBI.CMBB) {
+    if (!BBI.TailBB) {
       // No common merge block. Check if the terminators (e.g. return) are
       // the same or predicable.
-      MachineBasicBlock::iterator TT = BBI.TBB->getFirstTerminator();
-      MachineBasicBlock::iterator FT = BBI.FBB->getFirstTerminator();
-      while (TT != BBI.TBB->end() && FT != BBI.FBB->end()) {
+      MachineBasicBlock::iterator TT = BBI.TrueBB->getFirstTerminator();
+      MachineBasicBlock::iterator FT = BBI.FalseBB->getFirstTerminator();
+      while (TT != BBI.TrueBB->end() && FT != BBI.FalseBB->end()) {
         if (TT->isIdenticalTo(FT))
           Dups.push_back(TT);  // Will erase these later.
         else if (!TT->isPredicable() && !FT->isPredicable())
@@ -240,37 +288,65 @@
       }
       // One of the two pathes have more terminators, make sure they are all
       // predicable.
-      while (TT != BBI.TBB->end())
+      while (TT != BBI.TrueBB->end())
         if (!TT->isPredicable())
           return false; // Can't if-convert. Abort!
-      while (FT != BBI.FBB->end())
+      while (FT != BBI.FalseBB->end())
         if (!FT->isPredicable())
           return false; // Can't if-convert. Abort!
     }
 
+    BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()];
+    BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
+
     // Remove the duplicated instructions from the 'true' block.
-    for (unsigned i = 0, e = Dups.size(); i != e; ++i)
+    for (unsigned i = 0, e = Dups.size(); i != e; ++i) {
       Dups[i]->eraseFromParent();
+      --TrueBBI.Size;
+    }
     
     // Predicate the 'true' block after removing its branch.
-    TII->RemoveBranch(*BBI.TBB);
-    PredicateBlock(BBI.TBB, BBI.Cond);
+    TrueBBI.Size -= TII->RemoveBranch(*BBI.TrueBB);
+    PredicateBlock(BBI.TrueBB, BBI.Cond);
 
     // Predicate the 'false' block.
     std::vector<MachineOperand> NewCond(BBI.Cond);
     TII->ReverseBranchCondition(NewCond);
-    PredicateBlock(BBI.FBB, NewCond, true);
+    PredicateBlock(BBI.FalseBB, NewCond, true);
 
-    // Join the 'true' and 'false' blocks by copying the instructions
+    // Merge the 'true' and 'false' blocks by copying the instructions
     // from the 'false' block to the 'true' block.
-    MergeBlocks(BBI.TBB, BBI.FBB);
+    MergeBlocks(TrueBBI, FalseBBI);
 
-    // Adjust entry block, it should have but a single unconditional
-    // branch .
-    BBI.EBB->removeSuccessor(BBI.FBB);
-    TII->RemoveBranch(*BBI.EBB);
-    std::vector<MachineOperand> NoCond;
-    TII->InsertBranch(*BBI.EBB, BBI.TBB, NULL, NoCond);
+    // Remove the conditional branch from entry to the blocks.
+    BBI.Size -= TII->RemoveBranch(*BBI.BB);
+
+    // Merge the combined block into the entry of the diamond if the entry
+    // block is the only predecessor. Otherwise, insert an unconditional
+    // branch.
+    BBInfo *CvtBBI = &TrueBBI;
+    if (BBI.TrueBB->pred_size() == 1) {
+      BBI.BB->removeSuccessor(BBI.TrueBB);
+      MergeBlocks(BBI, TrueBBI);
+      CvtBBI = &BBI;
+    } else {
+      std::vector<MachineOperand> NoCond;
+      TII->InsertBranch(*BBI.BB, BBI.TrueBB, NULL, NoCond);
+    }
+
+    // If the if-converted block fallthrough into the tail block, then
+    // fold the tail block in as well.
+    if (BBI.TailBB && CvtBBI->BB->succ_size() == 1) {
+      CvtBBI->Size -= TII->RemoveBranch(*CvtBBI->BB);
+      CvtBBI->BB->removeSuccessor(BBI.TailBB);
+      BBInfo TailBBI = BBAnalysis[BBI.TailBB->getNumber()];
+      MergeBlocks(*CvtBBI, TailBBI);
+      TailBBI.Kind = ICInvalid;
+    }
+
+    // Update block info.
+    TrueBBI.Kind = ICInvalid;
+    FalseBBI.Kind = ICInvalid;
 
     // FIXME: Must maintain LiveIns.
     NumIfConvBBs += 2;
@@ -283,6 +359,10 @@
 /// cases, that means all the instructions in the block has M_PREDICABLE flag.
 /// It assume all the terminator instructions can be converted or deleted.
 bool IfConverter::isBlockPredicable(MachineBasicBlock *BB) const {
+  const BBInfo &BBI = BBAnalysis[BB->getNumber()];
+  if (BBI.Size == 0 || BBI.Size > TLI->getIfCvtBlockSizeLimit())
+    return false;
+
   for (MachineBasicBlock::iterator I = BB->begin(), E = BB->end();
        I != E; ++I) {
     if (TII->isTerminatorInstr(I->getOpcode()))
@@ -309,8 +389,13 @@
   }
 }
 
-/// MergeBlocks - Move all instructions from FBB to the end of TBB.
+/// MergeBlocks - Move all instructions from FromBB to the end of ToBB.
 ///
-void IfConverter::MergeBlocks(MachineBasicBlock *TBB, MachineBasicBlock *FBB) {
-  TBB->splice(TBB->end(), FBB, FBB->begin(), FBB->end());
+void IfConverter::MergeBlocks(BBInfo &ToBBI, BBInfo &FromBBI) {
+  ToBBI.BB->splice(ToBBI.BB->end(),
+                   FromBBI.BB, FromBBI.BB->begin(), FromBBI.BB->end());
+  TransferPreds(ToBBI.BB, FromBBI.BB);
+  TransferSuccs(ToBBI.BB, FromBBI.BB);
+  ToBBI.Size += FromBBI.Size;
+  FromBBI.Size = 0;
 }
