6aa4268f4271f1a0c533cb71ef92dcca2b96f915
[oota-llvm.git] / lib / CodeGen / MachineBlockPlacement.cpp
1 //===-- MachineBlockPlacement.cpp - Basic Block Code Layout optimization --===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements basic block placement transformations using the CFG
11 // structure and branch probability estimates.
12 //
13 // The pass strives to preserve the structure of the CFG (that is, retain
14 // a topological ordering of basic blocks) in the absense of a *strong* signal
15 // to the contrary from probabilities. However, within the CFG structure, it
16 // attempts to choose an ordering which favors placing more likely sequences of
17 // blocks adjacent to each other.
18 //
19 // The algorithm works from the inner-most loop within a function outward, and
20 // at each stage walks through the basic blocks, trying to coalesce them into
21 // sequential chains where allowed by the CFG (or demanded by heavy
22 // probabilities). Finally, it walks the blocks in topological order, and the
23 // first time it reaches a chain of basic blocks, it schedules them in the
24 // function in-order.
25 //
26 //===----------------------------------------------------------------------===//
27
28 #define DEBUG_TYPE "block-placement2"
29 #include "llvm/CodeGen/MachineBasicBlock.h"
30 #include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
31 #include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
32 #include "llvm/CodeGen/MachineFunction.h"
33 #include "llvm/CodeGen/MachineFunctionPass.h"
34 #include "llvm/CodeGen/MachineLoopInfo.h"
35 #include "llvm/CodeGen/MachineModuleInfo.h"
36 #include "llvm/CodeGen/Passes.h"
37 #include "llvm/Support/Allocator.h"
38 #include "llvm/Support/Debug.h"
39 #include "llvm/Support/ErrorHandling.h"
40 #include "llvm/ADT/DenseMap.h"
41 #include "llvm/ADT/PostOrderIterator.h"
42 #include "llvm/ADT/SCCIterator.h"
43 #include "llvm/ADT/SmallPtrSet.h"
44 #include "llvm/ADT/SmallVector.h"
45 #include "llvm/ADT/Statistic.h"
46 #include "llvm/Target/TargetInstrInfo.h"
47 #include "llvm/Target/TargetLowering.h"
48 #include <algorithm>
49 using namespace llvm;
50
51 STATISTIC(NumCondBranches, "Number of conditional branches");
52 STATISTIC(NumUncondBranches, "Number of uncondittional branches");
53 STATISTIC(CondBranchTakenFreq,
54           "Potential frequency of taking conditional branches");
55 STATISTIC(UncondBranchTakenFreq,
56           "Potential frequency of taking unconditional branches");
57
58 namespace {
59 /// \brief A structure for storing a weighted edge.
60 ///
61 /// This stores an edge and its weight, computed as the product of the
62 /// frequency that the starting block is entered with the probability of
63 /// a particular exit block.
64 struct WeightedEdge {
65   BlockFrequency EdgeFrequency;
66   MachineBasicBlock *From, *To;
67
68   bool operator<(const WeightedEdge &RHS) const {
69     return EdgeFrequency < RHS.EdgeFrequency;
70   }
71 };
72 }
73
74 namespace {
75 class BlockChain;
76 /// \brief Type for our function-wide basic block -> block chain mapping.
77 typedef DenseMap<MachineBasicBlock *, BlockChain *> BlockToChainMapType;
78 }
79
80 namespace {
81 /// \brief A chain of blocks which will be laid out contiguously.
82 ///
83 /// This is the datastructure representing a chain of consecutive blocks that
84 /// are profitable to layout together in order to maximize fallthrough
85 /// probabilities. We also can use a block chain to represent a sequence of
86 /// basic blocks which have some external (correctness) requirement for
87 /// sequential layout.
88 ///
89 /// Eventually, the block chains will form a directed graph over the function.
90 /// We provide an SCC-supporting-iterator in order to quicky build and walk the
91 /// SCCs of block chains within a function.
92 ///
93 /// The block chains also have support for calculating and caching probability
94 /// information related to the chain itself versus other chains. This is used
95 /// for ranking during the final layout of block chains.
96 class BlockChain {
97   /// \brief The sequence of blocks belonging to this chain.
98   ///
99   /// This is the sequence of blocks for a particular chain. These will be laid
100   /// out in-order within the function.
101   SmallVector<MachineBasicBlock *, 4> Blocks;
102
103   /// \brief A handle to the function-wide basic block to block chain mapping.
104   ///
105   /// This is retained in each block chain to simplify the computation of child
106   /// block chains for SCC-formation and iteration. We store the edges to child
107   /// basic blocks, and map them back to their associated chains using this
108   /// structure.
109   BlockToChainMapType &BlockToChain;
110
111 public:
112   /// \brief Construct a new BlockChain.
113   ///
114   /// This builds a new block chain representing a single basic block in the
115   /// function. It also registers itself as the chain that block participates
116   /// in with the BlockToChain mapping.
117   BlockChain(BlockToChainMapType &BlockToChain, MachineBasicBlock *BB)
118     : Blocks(1, BB), BlockToChain(BlockToChain), LoopPredecessors(0) {
119     assert(BB && "Cannot create a chain with a null basic block");
120     BlockToChain[BB] = this;
121   }
122
123   /// \brief Iterator over blocks within the chain.
124   typedef SmallVectorImpl<MachineBasicBlock *>::const_iterator iterator;
125
126   /// \brief Beginning of blocks within the chain.
127   iterator begin() const { return Blocks.begin(); }
128
129   /// \brief End of blocks within the chain.
130   iterator end() const { return Blocks.end(); }
131
132   /// \brief Merge a block chain into this one.
133   ///
134   /// This routine merges a block chain into this one. It takes care of forming
135   /// a contiguous sequence of basic blocks, updating the edge list, and
136   /// updating the block -> chain mapping. It does not free or tear down the
137   /// old chain, but the old chain's block list is no longer valid.
138   void merge(MachineBasicBlock *BB, BlockChain *Chain) {
139     assert(BB);
140     assert(!Blocks.empty());
141
142     // Fast path in case we don't have a chain already.
143     if (!Chain) {
144       assert(!BlockToChain[BB]);
145       Blocks.push_back(BB);
146       BlockToChain[BB] = this;
147       return;
148     }
149
150     assert(BB == *Chain->begin());
151     assert(Chain->begin() != Chain->end());
152
153     // Update the incoming blocks to point to this chain, and add them to the
154     // chain structure.
155     for (BlockChain::iterator BI = Chain->begin(), BE = Chain->end();
156          BI != BE; ++BI) {
157       Blocks.push_back(*BI);
158       assert(BlockToChain[*BI] == Chain && "Incoming blocks not in chain");
159       BlockToChain[*BI] = this;
160     }
161   }
162
163   /// \brief Count of predecessors within the loop currently being processed.
164   ///
165   /// This count is updated at each loop we process to represent the number of
166   /// in-loop predecessors of this chain.
167   unsigned LoopPredecessors;
168 };
169 }
170
171 namespace {
172 class MachineBlockPlacement : public MachineFunctionPass {
173   /// \brief A typedef for a block filter set.
174   typedef SmallPtrSet<MachineBasicBlock *, 16> BlockFilterSet;
175
176   /// \brief A handle to the branch probability pass.
177   const MachineBranchProbabilityInfo *MBPI;
178
179   /// \brief A handle to the function-wide block frequency pass.
180   const MachineBlockFrequencyInfo *MBFI;
181
182   /// \brief A handle to the loop info.
183   const MachineLoopInfo *MLI;
184
185   /// \brief A handle to the target's instruction info.
186   const TargetInstrInfo *TII;
187
188   /// \brief A handle to the target's lowering info.
189   const TargetLowering *TLI;
190
191   /// \brief Allocator and owner of BlockChain structures.
192   ///
193   /// We build BlockChains lazily by merging together high probability BB
194   /// sequences acording to the "Algo2" in the paper mentioned at the top of
195   /// the file. To reduce malloc traffic, we allocate them using this slab-like
196   /// allocator, and destroy them after the pass completes.
197   SpecificBumpPtrAllocator<BlockChain> ChainAllocator;
198
199   /// \brief Function wide BasicBlock to BlockChain mapping.
200   ///
201   /// This mapping allows efficiently moving from any given basic block to the
202   /// BlockChain it participates in, if any. We use it to, among other things,
203   /// allow implicitly defining edges between chains as the existing edges
204   /// between basic blocks.
205   DenseMap<MachineBasicBlock *, BlockChain *> BlockToChain;
206
207   void markChainSuccessors(BlockChain &Chain,
208                            MachineBasicBlock *LoopHeaderBB,
209                            SmallVectorImpl<MachineBasicBlock *> &Blocks,
210                            const BlockFilterSet *BlockFilter = 0);
211   void buildChain(MachineBasicBlock *BB, BlockChain &Chain,
212                   SmallVectorImpl<MachineBasicBlock *> &Blocks,
213                   const BlockFilterSet *BlockFilter = 0);
214   void buildLoopChains(MachineFunction &F, MachineLoop &L);
215   void buildCFGChains(MachineFunction &F);
216   void AlignLoops(MachineFunction &F);
217
218 public:
219   static char ID; // Pass identification, replacement for typeid
220   MachineBlockPlacement() : MachineFunctionPass(ID) {
221     initializeMachineBlockPlacementPass(*PassRegistry::getPassRegistry());
222   }
223
224   bool runOnMachineFunction(MachineFunction &F);
225
226   void getAnalysisUsage(AnalysisUsage &AU) const {
227     AU.addRequired<MachineBranchProbabilityInfo>();
228     AU.addRequired<MachineBlockFrequencyInfo>();
229     AU.addRequired<MachineLoopInfo>();
230     MachineFunctionPass::getAnalysisUsage(AU);
231   }
232
233   const char *getPassName() const { return "Block Placement"; }
234 };
235 }
236
237 char MachineBlockPlacement::ID = 0;
238 INITIALIZE_PASS_BEGIN(MachineBlockPlacement, "block-placement2",
239                       "Branch Probability Basic Block Placement", false, false)
240 INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo)
241 INITIALIZE_PASS_DEPENDENCY(MachineBlockFrequencyInfo)
242 INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
243 INITIALIZE_PASS_END(MachineBlockPlacement, "block-placement2",
244                     "Branch Probability Basic Block Placement", false, false)
245
246 FunctionPass *llvm::createMachineBlockPlacementPass() {
247   return new MachineBlockPlacement();
248 }
249
250 #ifndef NDEBUG
251 /// \brief Helper to print the name of a MBB.
252 ///
253 /// Only used by debug logging.
254 static std::string getBlockName(MachineBasicBlock *BB) {
255   std::string Result;
256   raw_string_ostream OS(Result);
257   OS << "BB#" << BB->getNumber()
258      << " (derived from LLVM BB '" << BB->getName() << "')";
259   OS.flush();
260   return Result;
261 }
262
263 /// \brief Helper to print the number of a MBB.
264 ///
265 /// Only used by debug logging.
266 static std::string getBlockNum(MachineBasicBlock *BB) {
267   std::string Result;
268   raw_string_ostream OS(Result);
269   OS << "BB#" << BB->getNumber();
270   OS.flush();
271   return Result;
272 }
273 #endif
274
275 void MachineBlockPlacement::markChainSuccessors(
276     BlockChain &Chain,
277     MachineBasicBlock *LoopHeaderBB,
278     SmallVectorImpl<MachineBasicBlock *> &BlockWorkList,
279     const BlockFilterSet *BlockFilter) {
280   // Walk all the blocks in this chain, marking their successors as having
281   // a predecessor placed.
282   for (BlockChain::iterator CBI = Chain.begin(), CBE = Chain.end();
283        CBI != CBE; ++CBI) {
284     // Add any successors for which this is the only un-placed in-loop
285     // predecessor to the worklist as a viable candidate for CFG-neutral
286     // placement. No subsequent placement of this block will violate the CFG
287     // shape, so we get to use heuristics to choose a favorable placement.
288     for (MachineBasicBlock::succ_iterator SI = (*CBI)->succ_begin(),
289                                           SE = (*CBI)->succ_end();
290          SI != SE; ++SI) {
291       if (BlockFilter && !BlockFilter->count(*SI))
292         continue;
293       BlockChain &SuccChain = *BlockToChain[*SI];
294       // Disregard edges within a fixed chain, or edges to the loop header.
295       if (&Chain == &SuccChain || *SI == LoopHeaderBB)
296         continue;
297
298       // This is a cross-chain edge that is within the loop, so decrement the
299       // loop predecessor count of the destination chain.
300       if (SuccChain.LoopPredecessors > 0 && --SuccChain.LoopPredecessors == 0)
301         BlockWorkList.push_back(*SI);
302     }
303   }
304 }
305
306 void MachineBlockPlacement::buildChain(
307     MachineBasicBlock *BB,
308     BlockChain &Chain,
309     SmallVectorImpl<MachineBasicBlock *> &BlockWorkList,
310     const BlockFilterSet *BlockFilter) {
311   const BranchProbability HotProb(4, 5); // 80%
312   assert(BB);
313   assert(BlockToChain[BB] == &Chain);
314   assert(*Chain.begin() == BB);
315   MachineBasicBlock *LoopHeaderBB = BB;
316   markChainSuccessors(Chain, LoopHeaderBB, BlockWorkList, BlockFilter);
317   BB = *llvm::prior(Chain.end());
318   for (;;) {
319     assert(BB);
320     assert(BlockToChain[BB] == &Chain);
321     assert(*llvm::prior(Chain.end()) == BB);
322
323     // Look for the best viable successor if there is one to place immediately
324     // after this block.
325     MachineBasicBlock *BestSucc = 0;
326     BranchProbability BestProb = BranchProbability::getZero();
327     DEBUG(dbgs() << "Attempting merge from: " << getBlockName(BB) << "\n");
328     for (MachineBasicBlock::succ_iterator SI = BB->succ_begin(),
329                                           SE = BB->succ_end();
330          SI != SE; ++SI) {
331       if (BlockFilter && !BlockFilter->count(*SI))
332         continue;
333       BlockChain &SuccChain = *BlockToChain[*SI];
334       if (&SuccChain == &Chain) {
335         DEBUG(dbgs() << "    " << getBlockName(*SI) << " -> Already merged!\n");
336         continue;
337       }
338
339       BranchProbability SuccProb = MBPI->getEdgeProbability(BB, *SI);
340
341       // Only consider successors which are either "hot", or wouldn't violate
342       // any CFG constraints.
343       if (SuccChain.LoopPredecessors != 0 && SuccProb < HotProb) {
344         DEBUG(dbgs() << "    " << getBlockName(*SI) << " -> CFG conflict\n");
345         continue;
346       }
347
348       DEBUG(dbgs() << "    " << getBlockName(*SI) << " -> " << SuccProb
349                    << " (prob)"
350                    << (SuccChain.LoopPredecessors != 0 ? " (CFG break)" : "")
351                    << "\n");
352       if (BestSucc && BestProb >= SuccProb)
353         continue;
354       BestSucc = *SI;
355       BestProb = SuccProb;
356     }
357
358     // If an immediate successor isn't available, look for the best viable
359     // block among those we've identified as not violating the loop's CFG at
360     // this point. This won't be a fallthrough, but it will increase locality.
361     if (!BestSucc) {
362       BlockFrequency BestFreq;
363       for (SmallVectorImpl<MachineBasicBlock *>::iterator WBI = BlockWorkList.begin(),
364                                                           WBE = BlockWorkList.end();
365            WBI != WBE; ++WBI) {
366         if (BlockFilter && !BlockFilter->count(*WBI))
367           continue;
368         BlockChain &SuccChain = *BlockToChain[*WBI];
369         if (&SuccChain == &Chain) {
370           DEBUG(dbgs() << "    " << getBlockName(*WBI)
371                        << " -> Already merged!\n");
372           continue;
373         }
374         assert(SuccChain.LoopPredecessors == 0 && "Found CFG-violating block");
375
376         BlockFrequency CandidateFreq = MBFI->getBlockFreq(*WBI);
377         DEBUG(dbgs() << "    " << getBlockName(*WBI) << " -> " << CandidateFreq
378                      << " (freq)\n");
379         if (BestSucc && BestFreq >= CandidateFreq)
380           continue;
381         BestSucc = *WBI;
382         BestFreq = CandidateFreq;
383       }
384     }
385     if (!BestSucc) {
386       DEBUG(dbgs() << "Finished forming chain for header block "
387                    << getBlockNum(*Chain.begin()) << "\n");
388       return;
389     }
390
391     // Place this block, updating the datastructures to reflect its placement.
392     BlockChain &SuccChain = *BlockToChain[BestSucc];
393     DEBUG(dbgs() << "Merging from " << getBlockNum(BB)
394                  << " to " << getBlockNum(BestSucc) << "\n");
395     markChainSuccessors(SuccChain, LoopHeaderBB, BlockWorkList, BlockFilter);
396     Chain.merge(BestSucc, &SuccChain);
397     BB = *llvm::prior(Chain.end());
398   }
399 }
400
401 /// \brief Forms basic block chains from the natural loop structures.
402 ///
403 /// These chains are designed to preserve the existing *structure* of the code
404 /// as much as possible. We can then stitch the chains together in a way which
405 /// both preserves the topological structure and minimizes taken conditional
406 /// branches.
407 void MachineBlockPlacement::buildLoopChains(MachineFunction &F,
408                                             MachineLoop &L) {
409   // First recurse through any nested loops, building chains for those inner
410   // loops.
411   for (MachineLoop::iterator LI = L.begin(), LE = L.end(); LI != LE; ++LI)
412     buildLoopChains(F, **LI);
413
414   SmallVector<MachineBasicBlock *, 16> BlockWorkList;
415   BlockFilterSet LoopBlockSet(L.block_begin(), L.block_end());
416
417   // FIXME: This is a really lame way of walking the chains in the loop: we
418   // walk the blocks, and use a set to prevent visiting a particular chain
419   // twice.
420   SmallPtrSet<BlockChain *, 4> UpdatedPreds;
421   for (MachineLoop::block_iterator BI = L.block_begin(),
422                                    BE = L.block_end();
423        BI != BE; ++BI) {
424     BlockChain &Chain = *BlockToChain[*BI];
425     if (!UpdatedPreds.insert(&Chain) || BI == L.block_begin())
426       continue;
427
428     assert(Chain.LoopPredecessors == 0);
429     for (BlockChain::iterator BCI = Chain.begin(), BCE = Chain.end();
430          BCI != BCE; ++BCI) {
431       assert(BlockToChain[*BCI] == &Chain);
432       for (MachineBasicBlock::pred_iterator PI = (*BCI)->pred_begin(),
433                                             PE = (*BCI)->pred_end();
434            PI != PE; ++PI) {
435         if (BlockToChain[*PI] == &Chain || !LoopBlockSet.count(*PI))
436           continue;
437         ++Chain.LoopPredecessors;
438       }
439     }
440
441     if (Chain.LoopPredecessors == 0)
442       BlockWorkList.push_back(*BI);
443   }
444
445   BlockChain &LoopChain = *BlockToChain[L.getHeader()];
446   buildChain(*L.block_begin(), LoopChain, BlockWorkList, &LoopBlockSet);
447
448   DEBUG({
449     if (LoopChain.LoopPredecessors)
450       dbgs() << "Loop chain contains a block without its preds placed!\n"
451              << "  Loop header:  " << getBlockName(*L.block_begin()) << "\n"
452              << "  Chain header: " << getBlockName(*LoopChain.begin()) << "\n";
453     for (BlockChain::iterator BCI = LoopChain.begin(), BCE = LoopChain.end();
454          BCI != BCE; ++BCI)
455       if (!LoopBlockSet.erase(*BCI))
456         dbgs() << "Loop chain contains a block not contained by the loop!\n"
457                << "  Loop header:  " << getBlockName(*L.block_begin()) << "\n"
458                << "  Chain header: " << getBlockName(*LoopChain.begin()) << "\n"
459                << "  Bad block:    " << getBlockName(*BCI) << "\n";
460
461     if (!LoopBlockSet.empty())
462       for (SmallPtrSet<MachineBasicBlock *, 16>::iterator LBI = LoopBlockSet.begin(), LBE = LoopBlockSet.end();
463            LBI != LBE; ++LBI)
464         dbgs() << "Loop contains blocks never placed into a chain!\n"
465                << "  Loop header:  " << getBlockName(*L.block_begin()) << "\n"
466                << "  Chain header: " << getBlockName(*LoopChain.begin()) << "\n"
467                << "  Bad block:    " << getBlockName(*LBI) << "\n";
468   });
469 }
470
471 void MachineBlockPlacement::buildCFGChains(MachineFunction &F) {
472   // Ensure that every BB in the function has an associated chain to simplify
473   // the assumptions of the remaining algorithm.
474   for (MachineFunction::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI)
475     BlockToChain[&*FI] =
476       new (ChainAllocator.Allocate()) BlockChain(BlockToChain, &*FI);
477
478   // Build any loop-based chains.
479   for (MachineLoopInfo::iterator LI = MLI->begin(), LE = MLI->end(); LI != LE;
480        ++LI)
481     buildLoopChains(F, **LI);
482
483   SmallVector<MachineBasicBlock *, 16> BlockWorkList;
484
485   SmallPtrSet<BlockChain *, 4> UpdatedPreds;
486   for (MachineFunction::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI) {
487     MachineBasicBlock *BB = &*FI;
488     BlockChain &Chain = *BlockToChain[BB];
489     if (!UpdatedPreds.insert(&Chain))
490       continue;
491
492     assert(Chain.LoopPredecessors == 0);
493     for (BlockChain::iterator BCI = Chain.begin(), BCE = Chain.end();
494          BCI != BCE; ++BCI) {
495       assert(BlockToChain[*BCI] == &Chain);
496       for (MachineBasicBlock::pred_iterator PI = (*BCI)->pred_begin(),
497                                             PE = (*BCI)->pred_end();
498            PI != PE; ++PI) {
499         if (BlockToChain[*PI] == &Chain)
500           continue;
501         ++Chain.LoopPredecessors;
502       }
503     }
504
505     if (Chain.LoopPredecessors == 0)
506       BlockWorkList.push_back(BB);
507   }
508
509   BlockChain &FunctionChain = *BlockToChain[&F.front()];
510   buildChain(&F.front(), FunctionChain, BlockWorkList);
511
512   typedef SmallPtrSet<MachineBasicBlock *, 16> FunctionBlockSetType;
513   DEBUG({
514     FunctionBlockSetType FunctionBlockSet;
515     for (MachineFunction::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI)
516       FunctionBlockSet.insert(FI);
517
518     for (BlockChain::iterator BCI = FunctionChain.begin(), BCE = FunctionChain.end();
519          BCI != BCE; ++BCI)
520       if (!FunctionBlockSet.erase(*BCI))
521         dbgs() << "Function chain contains a block not in the function!\n"
522                << "  Bad block:    " << getBlockName(*BCI) << "\n";
523
524     if (!FunctionBlockSet.empty())
525       for (SmallPtrSet<MachineBasicBlock *, 16>::iterator FBI = FunctionBlockSet.begin(),
526            FBE = FunctionBlockSet.end(); FBI != FBE; ++FBI)
527         dbgs() << "Function contains blocks never placed into a chain!\n"
528                << "  Bad block:    " << getBlockName(*FBI) << "\n";
529   });
530
531   // Splice the blocks into place.
532   MachineFunction::iterator InsertPos = F.begin();
533   SmallVector<MachineOperand, 4> Cond; // For AnalyzeBranch.
534   for (BlockChain::iterator BI = FunctionChain.begin(), BE = FunctionChain.end();
535        BI != BE; ++BI) {
536     DEBUG(dbgs() << (BI == FunctionChain.begin() ? "Placing chain "
537                                                   : "          ... ")
538           << getBlockName(*BI) << "\n");
539     if (InsertPos != MachineFunction::iterator(*BI))
540       F.splice(InsertPos, *BI);
541     else
542       ++InsertPos;
543
544     // Update the terminator of the previous block.
545     if (BI == FunctionChain.begin())
546       continue;
547     MachineBasicBlock *PrevBB = llvm::prior(MachineFunction::iterator(*BI));
548
549     // FIXME: It would be awesome of updateTerminator would just return rather
550     // than assert when the branch cannot be analyzed in order to remove this
551     // boiler plate.
552     Cond.clear();
553     MachineBasicBlock *TBB = 0, *FBB = 0; // For AnalyzeBranch.
554     if (!TII->AnalyzeBranch(*PrevBB, TBB, FBB, Cond))
555       PrevBB->updateTerminator();
556   }
557
558   // Fixup the last block.
559   Cond.clear();
560   MachineBasicBlock *TBB = 0, *FBB = 0; // For AnalyzeBranch.
561   if (!TII->AnalyzeBranch(F.back(), TBB, FBB, Cond))
562     F.back().updateTerminator();
563 }
564
565 /// \brief Recursive helper to align a loop and any nested loops.
566 static void AlignLoop(MachineFunction &F, MachineLoop *L, unsigned Align) {
567   // Recurse through nested loops.
568   for (MachineLoop::iterator I = L->begin(), E = L->end(); I != E; ++I)
569     AlignLoop(F, *I, Align);
570
571   L->getTopBlock()->setAlignment(Align);
572 }
573
574 /// \brief Align loop headers to target preferred alignments.
575 void MachineBlockPlacement::AlignLoops(MachineFunction &F) {
576   if (F.getFunction()->hasFnAttr(Attribute::OptimizeForSize))
577     return;
578
579   unsigned Align = TLI->getPrefLoopAlignment();
580   if (!Align)
581     return;  // Don't care about loop alignment.
582
583   for (MachineLoopInfo::iterator I = MLI->begin(), E = MLI->end(); I != E; ++I)
584     AlignLoop(F, *I, Align);
585 }
586
587 bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &F) {
588   // Check for single-block functions and skip them.
589   if (llvm::next(F.begin()) == F.end())
590     return false;
591
592   MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
593   MBFI = &getAnalysis<MachineBlockFrequencyInfo>();
594   MLI = &getAnalysis<MachineLoopInfo>();
595   TII = F.getTarget().getInstrInfo();
596   TLI = F.getTarget().getTargetLowering();
597   assert(BlockToChain.empty());
598
599   buildCFGChains(F);
600   AlignLoops(F);
601
602   BlockToChain.clear();
603
604   // We always return true as we have no way to track whether the final order
605   // differs from the original order.
606   return true;
607 }
608
609 namespace {
610 /// \brief A pass to compute block placement statistics.
611 ///
612 /// A separate pass to compute interesting statistics for evaluating block
613 /// placement. This is separate from the actual placement pass so that they can
614 /// be computed in the absense of any placement transformations or when using
615 /// alternative placement strategies.
616 class MachineBlockPlacementStats : public MachineFunctionPass {
617   /// \brief A handle to the branch probability pass.
618   const MachineBranchProbabilityInfo *MBPI;
619
620   /// \brief A handle to the function-wide block frequency pass.
621   const MachineBlockFrequencyInfo *MBFI;
622
623 public:
624   static char ID; // Pass identification, replacement for typeid
625   MachineBlockPlacementStats() : MachineFunctionPass(ID) {
626     initializeMachineBlockPlacementStatsPass(*PassRegistry::getPassRegistry());
627   }
628
629   bool runOnMachineFunction(MachineFunction &F);
630
631   void getAnalysisUsage(AnalysisUsage &AU) const {
632     AU.addRequired<MachineBranchProbabilityInfo>();
633     AU.addRequired<MachineBlockFrequencyInfo>();
634     AU.setPreservesAll();
635     MachineFunctionPass::getAnalysisUsage(AU);
636   }
637
638   const char *getPassName() const { return "Block Placement Stats"; }
639 };
640 }
641
642 char MachineBlockPlacementStats::ID = 0;
643 INITIALIZE_PASS_BEGIN(MachineBlockPlacementStats, "block-placement-stats",
644                       "Basic Block Placement Stats", false, false)
645 INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo)
646 INITIALIZE_PASS_DEPENDENCY(MachineBlockFrequencyInfo)
647 INITIALIZE_PASS_END(MachineBlockPlacementStats, "block-placement-stats",
648                     "Basic Block Placement Stats", false, false)
649
650 FunctionPass *llvm::createMachineBlockPlacementStatsPass() {
651   return new MachineBlockPlacementStats();
652 }
653
654 bool MachineBlockPlacementStats::runOnMachineFunction(MachineFunction &F) {
655   // Check for single-block functions and skip them.
656   if (llvm::next(F.begin()) == F.end())
657     return false;
658
659   MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
660   MBFI = &getAnalysis<MachineBlockFrequencyInfo>();
661
662   for (MachineFunction::iterator I = F.begin(), E = F.end(); I != E; ++I) {
663     BlockFrequency BlockFreq = MBFI->getBlockFreq(I);
664     Statistic &NumBranches = (I->succ_size() > 1) ? NumCondBranches
665                                                   : NumUncondBranches;
666     Statistic &BranchTakenFreq = (I->succ_size() > 1) ? CondBranchTakenFreq
667                                                       : UncondBranchTakenFreq;
668     for (MachineBasicBlock::succ_iterator SI = I->succ_begin(),
669                                           SE = I->succ_end();
670          SI != SE; ++SI) {
671       // Skip if this successor is a fallthrough.
672       if (I->isLayoutSuccessor(*SI))
673         continue;
674
675       BlockFrequency EdgeFreq = BlockFreq * MBPI->getEdgeProbability(I, *SI);
676       ++NumBranches;
677       BranchTakenFreq += EdgeFreq.getFrequency();
678     }
679   }
680
681   return false;
682 }
683