[llvm-commits] [llvm] r50999 - /llvm/trunk/lib/CodeGen/BranchFolding.cpp

Dale Johannesen dalej at apple.com
Mon May 12 13:33:57 PDT 2008


Author: johannes
Date: Mon May 12 15:33:57 2008
New Revision: 50999

URL: http://llvm.org/viewvc/llvm-project?rev=50999&view=rev
Log:
Further rework of tail merge algorithm.  Not quite
semantically identical, but little difference in
either results or execution speed; but it's much
easier to read, at least IMO.


Modified:
    llvm/trunk/lib/CodeGen/BranchFolding.cpp

Modified: llvm/trunk/lib/CodeGen/BranchFolding.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/BranchFolding.cpp?rev=50999&r1=50998&r2=50999&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/BranchFolding.cpp (original)
+++ llvm/trunk/lib/CodeGen/BranchFolding.cpp Mon May 12 15:33:57 2008
@@ -74,10 +74,13 @@
     unsigned ComputeSameTails(unsigned CurHash, unsigned minCommonTailLength);
     void RemoveBlocksWithHash(unsigned CurHash, MachineBasicBlock* SuccBB,
                                                 MachineBasicBlock* PredBB);
+    unsigned CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB,
+                                       unsigned maxCommonTailLength);
 
     typedef std::pair<unsigned,MachineBasicBlock*> MergePotentialsElt;
     typedef std::vector<MergePotentialsElt>::iterator MPIterator;
     std::vector<MergePotentialsElt> MergePotentials;
+
     typedef std::pair<MPIterator, MachineBasicBlock::iterator> SameTailElt;
     std::vector<SameTailElt> SameTails;
 
@@ -422,42 +425,6 @@
   return Time;
 }
 
-/// ShouldSplitFirstBlock - We need to either split MBB1 at MBB1I or MBB2 at
-/// MBB2I and then insert an unconditional branch in the other block.  Determine
-/// which is the best to split
-static bool ShouldSplitFirstBlock(MachineBasicBlock *MBB1,
-                                  MachineBasicBlock::iterator MBB1I,
-                                  MachineBasicBlock *MBB2,
-                                  MachineBasicBlock::iterator MBB2I,
-                                  MachineBasicBlock *PredBB) {
-  // If one block is the entry block, split the other one; we can't generate
-  // a branch to the entry block, as its label is not emitted.
-  MachineBasicBlock *Entry = MBB1->getParent()->begin();
-  if (MBB1 == Entry)
-    return false;
-  if (MBB2 == Entry)
-    return true;
-
-  // If one block falls through into the common successor, choose that
-  // one to split; it is one instruction less to do that.
-  if (PredBB) {
-    if (MBB1 == PredBB)
-      return true;
-    else if (MBB2 == PredBB)
-      return false;
-  }
-  // TODO: if we had some notion of which block was hotter, we could split
-  // the hot block, so it is the fall-through.  Since we don't have profile info
-  // make a decision based on which will hurt most to split.
-  unsigned MBB1Time = EstimateRuntime(MBB1->begin(), MBB1I);
-  unsigned MBB2Time = EstimateRuntime(MBB2->begin(), MBB2I);
-  
-  // If the MBB1 prefix takes "less time" to run than the MBB2 prefix, split the
-  // MBB1 block so it falls through.  This will penalize the MBB2 path, but will
-  // have a lower overall impact on the program execution.
-  return MBB1Time < MBB2Time;
-}
-
 // CurMBB needs to add an unconditional branch to SuccMBB (we removed these
 // branches temporarily for tail merging).  In the case where CurMBB ends
 // with a conditional branch to the next block, optimize by reversing the
@@ -565,6 +532,44 @@
   }
 }
 
+/// CreateCommonTailOnlyBlock - None of the blocks to be tail-merged consist
+/// only of the common tail.  Create a block that does by splitting one.
+unsigned BranchFolder::CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB,
+                                             unsigned maxCommonTailLength) {
+  unsigned i, commonTailIndex;
+  unsigned TimeEstimate = ~0U;
+  for (i=0, commonTailIndex=0; i<SameTails.size(); i++) {
+    // Use PredBB if possible; that doesn't require a new branch.
+    if (SameTails[i].first->second==PredBB) {
+      commonTailIndex = i;
+      break;
+    }
+    // Otherwise, make a (fairly bogus) choice based on estimate of
+    // how long it will take the various blocks to execute.
+    unsigned t = EstimateRuntime(SameTails[i].first->second->begin(), 
+                                 SameTails[i].second);
+    if (t<=TimeEstimate) {
+      TimeEstimate = t;
+      commonTailIndex = i;
+    }
+  }
+
+  MachineBasicBlock::iterator BBI = SameTails[commonTailIndex].second;
+  MachineBasicBlock *MBB = SameTails[commonTailIndex].first->second;
+
+  DOUT << "\nSplitting " << MBB->getNumber() << ", size " << 
+          maxCommonTailLength;
+
+  MachineBasicBlock *newMBB = SplitMBBAt(*MBB, BBI);
+  SameTails[commonTailIndex].first->second = newMBB;
+  SameTails[commonTailIndex].second = newMBB->begin();
+  // If we split PredBB, newMBB is the new predecessor.
+  if (PredBB==MBB)
+    PredBB = newMBB;
+
+  return commonTailIndex;
+}
+
 // See if any of the blocks in MergePotentials (which all have a common single
 // successor, or all have no successor) can be tail-merged.  If there is a
 // successor, any blocks in MergePotentials that are not tail-merged and
@@ -575,10 +580,6 @@
 
 bool BranchFolder::TryMergeBlocks(MachineBasicBlock *SuccBB,
                                   MachineBasicBlock* PredBB) {
-  // We cannot jump to the entry block, which affects various choices below.
-  MachineBasicBlock *Entry = MergePotentials.begin()->second->
-                              getParent()->begin();
-
   // It doesn't make sense to save a single instruction since tail merging
   // will add a jump.
   // FIXME: Ask the target to provide the threshold?
@@ -608,78 +609,43 @@
     }
 
     // If one of the blocks is the entire common tail (and not the entry
-    // block, which we can't jump to), treat all blocks with this same
-    // tail at once.
-    unsigned int i;
-    for (i=0; i<SameTails.size(); i++) {
+    // block, which we can't jump to), we can treat all blocks with this same
+    // tail at once.  Use PredBB if that is one of the possibilities, as that
+    // will not introduce any extra branches.
+    MachineBasicBlock *EntryBB = MergePotentials.begin()->second->
+                                getParent()->begin();
+    unsigned int commonTailIndex, i;
+    for (commonTailIndex=SameTails.size(), i=0; i<SameTails.size(); i++) {
       MachineBasicBlock *MBB = SameTails[i].first->second;
-      if (MBB->begin() == SameTails[i].second && MBB != Entry) 
-        break;
-    }
-    if (i!=SameTails.size()) {
-      MachineBasicBlock *MBB = SameTails[i].first->second;
-      // MBB is common tail.  Adjust all other BB's to jump to this one.
-      // Traversal must be forwards so erases work.
-      DOUT << "\nUsing common tail " << MBB->getNumber() << " for ";
-      for (unsigned int j=0; j<SameTails.size(); ++j) {
-        if (i==j)
-          continue;
-        DOUT << SameTails[j].first->second->getNumber() << ",";
-        // Hack the end off BB j, making it jump to BB i instead.
-        ReplaceTailWithBranchTo(SameTails[j].second, MBB);
-        // This modifies BB j, so remove it from the worklist.
-        MergePotentials.erase(SameTails[j].first);
+      if (MBB->begin() == SameTails[i].second && MBB != EntryBB) {
+        commonTailIndex = i;
+        if (MBB==PredBB)
+          break;
       }
-      DOUT << "\n";
-      // We leave i in the worklist in case there are other blocks that
-      // match it with a smaller number of instructions.
-      MadeChange = true;
-      continue;        
     }
 
-    // Otherwise, merge the 2 blocks in SameTails that are latest in
-    // MergePotentials; these are at indices 0 and 1 in SameTails.
-    MachineBasicBlock::iterator BBI1 = (SameTails[0]).second;
-    MachineBasicBlock::iterator BBI2 = (SameTails[1]).second;
-    MachineBasicBlock *MBB1 = (SameTails[0]).first->second;
-    MachineBasicBlock *MBB2 = (SameTails[1]).first->second;
-
-    DOUT << "\nMerging " << MBB1->getNumber() << "," <<
-        MBB2->getNumber() << ", size " << maxCommonTailLength;
-
-    // Neither block is the entire common tail; split the tail of one block
-    // to make it redundant with the other tail.  We cannot jump to the
-    // entry block, so if one block is the entry block, split the other one.
-
-    // The second half of the split block will remain in SameTails, and will
-    // consist entirely of common code.  Thus in the case where there are
-    // multiple blocks that would all need to be split, the next iteration of
-    // the outer loop will handle all the rest of them.
-
-    // Decide whether we want to split MBB1 or MBB2.
-    if (ShouldSplitFirstBlock(MBB1, BBI1, MBB2, BBI2, PredBB)) {
-      MBB1 = SplitMBBAt(*MBB1, BBI1);
-      BBI1 = MBB1->begin();
-      SameTails[0].first->second = MBB1;
-    } else {
-      MBB2 = SplitMBBAt(*MBB2, BBI2);
-      BBI2 = MBB2->begin();
-      SameTails[1].first->second = MBB2;
-    }
-    
-    if (MBB2->begin() == BBI2 && MBB2 != Entry) {
-      // Hack the end off MBB1, making it jump to MBB2 instead.
-      ReplaceTailWithBranchTo(BBI1, MBB2);
-      // This modifies MBB1, so remove it from the worklist.
-      MergePotentials.erase(SameTails[0].first);
-    } else {
-      assert(MBB1->begin() == BBI1 && MBB1 != Entry && 
-             "Didn't split block correctly?");
-      // Hack the end off MBB2, making it jump to MBB1 instead.
-      ReplaceTailWithBranchTo(BBI2, MBB1);
-      // This modifies MBB2, so remove it from the worklist.
-      MergePotentials.erase(SameTails[1].first);
+    if (commonTailIndex==SameTails.size()) {
+      // None of the blocks consist entirely of the common tail.
+      // Split a block so that one does.
+      commonTailIndex = CreateCommonTailOnlyBlock(PredBB,  maxCommonTailLength);
     }
+
+    MachineBasicBlock *MBB = SameTails[commonTailIndex].first->second;
+    // MBB is common tail.  Adjust all other BB's to jump to this one.
+    // Traversal must be forwards so erases work.
+    DOUT << "\nUsing common tail " << MBB->getNumber() << " for ";
+    for (unsigned int i=0; i<SameTails.size(); ++i) {
+      if (commonTailIndex==i)
+        continue;
+      DOUT << SameTails[i].first->second->getNumber() << ",";
+      // Hack the end off BB i, making it jump to BB commonTailIndex instead.
+      ReplaceTailWithBranchTo(SameTails[i].second, MBB);
+      // BB i is no longer a predecessor of SuccBB; remove it from the worklist.
+      MergePotentials.erase(SameTails[i].first);
+    }
+    DOUT << "\n";
+    // We leave commonTailIndex in the worklist in case there are other blocks
+    // that match it with a smaller number of instructions.
     MadeChange = true;
   }
   return MadeChange;
@@ -782,12 +748,11 @@
     if (MergePotentials.size() >= 2)
       MadeChange |= TryMergeBlocks(I, PredBB);
     // Reinsert an unconditional branch if needed.
-    // The 1 below can be either an original single predecessor, or a result
-    // of removing blocks in TryMergeBlocks.
+    // The 1 below can occur as a result of removing blocks in TryMergeBlocks.
     PredBB = prior(I);      // this may have been changed in TryMergeBlocks
     if (MergePotentials.size()==1 && 
-        (MergePotentials.begin())->second != PredBB)
-      FixTail((MergePotentials.begin())->second, I, TII);
+        MergePotentials.begin()->second != PredBB)
+      FixTail(MergePotentials.begin()->second, I, TII);
     }
   }
   return MadeChange;
@@ -827,7 +792,8 @@
 ///
 bool BranchFolder::CanFallThrough(MachineBasicBlock *CurBB,
                                   bool BranchUnAnalyzable,
-                                  MachineBasicBlock *TBB, MachineBasicBlock *FBB,
+                                  MachineBasicBlock *TBB, 
+                                  MachineBasicBlock *FBB,
                                   const std::vector<MachineOperand> &Cond) {
   MachineFunction::iterator Fallthrough = CurBB;
   ++Fallthrough;





More information about the llvm-commits mailing list