[llvm-commits] [llvm] r144498 - /llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp

Chandler Carruth chandlerc at gmail.com
Sun Nov 13 03:42:26 PST 2011


Author: chandlerc
Date: Sun Nov 13 05:42:26 2011
New Revision: 144498

URL: http://llvm.org/viewvc/llvm-project?rev=144498&view=rev
Log:
Hoist another gross nested loop into a helper method.

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

Modified: llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp?rev=144498&r1=144497&r2=144498&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp (original)
+++ llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp Sun Nov 13 05:42:26 2011
@@ -211,6 +211,9 @@
   MachineBasicBlock *selectBestSuccessor(MachineBasicBlock *BB,
                                          BlockChain &Chain,
                                          const BlockFilterSet *BlockFilter);
+  MachineBasicBlock *selectBestCandidateBlock(
+      BlockChain &Chain, SmallVectorImpl<MachineBasicBlock *> &WorkList,
+      const BlockFilterSet *BlockFilter);
   void buildChain(MachineBasicBlock *BB, BlockChain &Chain,
                   SmallVectorImpl<MachineBasicBlock *> &Blocks,
                   const BlockFilterSet *BlockFilter = 0);
@@ -361,6 +364,45 @@
   return BestSucc;
 }
 
+/// \brief Select the best block from a worklist.
+///
+/// This looks through the provided worklist as a list of candidate basic
+/// blocks and select the most profitable one to place. The definition of
+/// profitable only really makes sense in the context of a loop. This returns
+/// the most frequently visited block in the worklist, which in the case of
+/// a loop, is the one most desirable to be physically close to the rest of the
+/// loop body in order to improve icache behavior.
+///
+/// \returns The best block found, or null if none are viable.
+MachineBasicBlock *MachineBlockPlacement::selectBestCandidateBlock(
+    BlockChain &Chain, SmallVectorImpl<MachineBasicBlock *> &WorkList,
+    const BlockFilterSet *BlockFilter) {
+  MachineBasicBlock *BestBlock = 0;
+  BlockFrequency BestFreq;
+  for (SmallVectorImpl<MachineBasicBlock *>::iterator WBI = WorkList.begin(),
+                                                      WBE = WorkList.end();
+       WBI != WBE; ++WBI) {
+    if (BlockFilter && !BlockFilter->count(*WBI))
+      continue;
+    BlockChain &SuccChain = *BlockToChain[*WBI];
+    if (&SuccChain == &Chain) {
+      DEBUG(dbgs() << "    " << getBlockName(*WBI)
+                   << " -> Already merged!\n");
+      continue;
+    }
+    assert(SuccChain.LoopPredecessors == 0 && "Found CFG-violating block");
+
+    BlockFrequency CandidateFreq = MBFI->getBlockFreq(*WBI);
+    DEBUG(dbgs() << "    " << getBlockName(*WBI) << " -> " << CandidateFreq
+                 << " (freq)\n");
+    if (BestBlock && BestFreq >= CandidateFreq)
+      continue;
+    BestBlock = *WBI;
+    BestFreq = CandidateFreq;
+  }
+  return BestBlock;
+}
+
 void MachineBlockPlacement::buildChain(
     MachineBasicBlock *BB,
     BlockChain &Chain,
@@ -384,30 +426,9 @@
     // If an immediate successor isn't available, look for the best viable
     // block among those we've identified as not violating the loop's CFG at
     // this point. This won't be a fallthrough, but it will increase locality.
-    if (!BestSucc) {
-      BlockFrequency BestFreq;
-      for (SmallVectorImpl<MachineBasicBlock *>::iterator WBI = BlockWorkList.begin(),
-                                                          WBE = BlockWorkList.end();
-           WBI != WBE; ++WBI) {
-        if (BlockFilter && !BlockFilter->count(*WBI))
-          continue;
-        BlockChain &SuccChain = *BlockToChain[*WBI];
-        if (&SuccChain == &Chain) {
-          DEBUG(dbgs() << "    " << getBlockName(*WBI)
-                       << " -> Already merged!\n");
-          continue;
-        }
-        assert(SuccChain.LoopPredecessors == 0 && "Found CFG-violating block");
+    if (!BestSucc)
+      BestSucc = selectBestCandidateBlock(Chain, BlockWorkList, BlockFilter);
 
-        BlockFrequency CandidateFreq = MBFI->getBlockFreq(*WBI);
-        DEBUG(dbgs() << "    " << getBlockName(*WBI) << " -> " << CandidateFreq
-                     << " (freq)\n");
-        if (BestSucc && BestFreq >= CandidateFreq)
-          continue;
-        BestSucc = *WBI;
-        BestFreq = CandidateFreq;
-      }
-    }
     if (!BestSucc) {
       DEBUG(dbgs() << "Finished forming chain for header block "
                    << getBlockNum(*Chain.begin()) << "\n");





More information about the llvm-commits mailing list