cbf5b891f8b9276074fab80ecc32f6208f0b269f
[oota-llvm.git] / lib / CodeGen / CodePlacementOpt.cpp
1 //===-- CodePlacementOpt.cpp - Code Placement pass. -----------------------===//
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 the pass that optimize code placement and align loop
11 // headers to target specific alignment boundary.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #define DEBUG_TYPE "code-placement"
16 #include "llvm/CodeGen/MachineLoopInfo.h"
17 #include "llvm/CodeGen/MachineFunctionPass.h"
18 #include "llvm/CodeGen/Passes.h"
19 #include "llvm/Target/TargetInstrInfo.h"
20 #include "llvm/Target/TargetLowering.h"
21 #include "llvm/Target/TargetMachine.h"
22 #include "llvm/Support/Compiler.h"
23 #include "llvm/Support/Debug.h"
24 #include "llvm/ADT/Statistic.h"
25 using namespace llvm;
26
27 STATISTIC(NumLoopsAligned,  "Number of loops aligned");
28 STATISTIC(NumIntraElim,     "Number of intra loop branches eliminated");
29 STATISTIC(NumIntraMoved,    "Number of intra loop branches moved");
30
31 namespace {
32   class CodePlacementOpt : public MachineFunctionPass {
33     const MachineLoopInfo *MLI;
34     const TargetInstrInfo *TII;
35     const TargetLowering  *TLI;
36
37   public:
38     static char ID;
39     CodePlacementOpt() : MachineFunctionPass(&ID) {}
40
41     virtual bool runOnMachineFunction(MachineFunction &MF);
42     virtual const char *getPassName() const {
43       return "Code Placement Optimizater";
44     }
45
46     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
47       AU.addRequired<MachineLoopInfo>();
48       AU.addPreservedID(MachineDominatorsID);
49       MachineFunctionPass::getAnalysisUsage(AU);
50     }
51
52   private:
53     bool HasFallthrough(MachineBasicBlock *MBB);
54     bool HasAnalyzableTerminator(MachineBasicBlock *MBB);
55     void Splice(MachineFunction &MF,
56                 MachineFunction::iterator InsertPt,
57                 MachineFunction::iterator Begin,
58                 MachineFunction::iterator End);
59     bool EliminateUnconditionalJumpsToTop(MachineFunction &MF,
60                                           MachineLoop *L);
61     bool MoveDiscontiguousLoopBlocks(MachineFunction &MF,
62                                      MachineLoop *L);
63     bool OptimizeIntraLoopEdgesInLoopNest(MachineFunction &MF, MachineLoop *L);
64     bool OptimizeIntraLoopEdges(MachineFunction &MF);
65     bool AlignLoops(MachineFunction &MF);
66     bool AlignLoop(MachineFunction &MF, MachineLoop *L, unsigned Align);
67   };
68
69   char CodePlacementOpt::ID = 0;
70 } // end anonymous namespace
71
72 FunctionPass *llvm::createCodePlacementOptPass() {
73   return new CodePlacementOpt();
74 }
75
76 /// HasFallthrough - Test whether the given branch has a fallthrough, either as
77 /// a plain fallthrough or as a fallthrough case of a conditional branch.
78 ///
79 bool CodePlacementOpt::HasFallthrough(MachineBasicBlock *MBB) {
80   MachineBasicBlock *TBB = 0, *FBB = 0;
81   SmallVector<MachineOperand, 4> Cond;
82   if (TII->AnalyzeBranch(*MBB, TBB, FBB, Cond))
83     return false;
84   // This conditional branch has no fallthrough.
85   if (FBB)
86     return false;
87   // An unconditional branch has no fallthrough.
88   if (Cond.empty() && TBB)
89     return false;
90   // It has a fallthrough.
91   return true;
92 }
93
94 /// HasAnalyzableTerminator - Test whether AnalyzeBranch will succeed on MBB.
95 /// This is called before major changes are begun to test whether it will be
96 /// possible to complete the changes.
97 ///
98 /// Target-specific code is hereby encouraged to make AnalyzeBranch succeed
99 /// whenever possible.
100 ///
101 bool CodePlacementOpt::HasAnalyzableTerminator(MachineBasicBlock *MBB) {
102   // Conservatively ignore EH landing pads.
103   if (MBB->isLandingPad()) return false;
104
105   // Ignore blocks which look like they might have EH-related control flow.
106   // At the time of this writing, there are blocks which AnalyzeBranch
107   // thinks end in single uncoditional branches, yet which have two CFG
108   // successors. Code in this file is not prepared to reason about such things.
109   if (!MBB->empty() && MBB->back().isEHLabel())
110     return false;
111
112   // Aggressively handle return blocks and similar constructs.
113   if (MBB->succ_empty()) return true;
114
115   // Ask the target's AnalyzeBranch if it can handle this block.
116   MachineBasicBlock *TBB = 0, *FBB = 0;
117   SmallVector<MachineOperand, 4> Cond;
118   // Make the the terminator is understood.
119   if (TII->AnalyzeBranch(*MBB, TBB, FBB, Cond))
120     return false;
121   // Make sure we have the option of reversing the condition.
122   if (!Cond.empty() && TII->ReverseBranchCondition(Cond))
123     return false;
124   return true;
125 }
126
127 /// Splice - Move the sequence of instructions [Begin,End) to just before
128 /// InsertPt. Update branch instructions as needed to account for broken
129 /// fallthrough edges and to take advantage of newly exposed fallthrough
130 /// opportunities.
131 ///
132 void CodePlacementOpt::Splice(MachineFunction &MF,
133                               MachineFunction::iterator InsertPt,
134                               MachineFunction::iterator Begin,
135                               MachineFunction::iterator End) {
136   assert(Begin != MF.begin() && End != MF.begin() && InsertPt != MF.begin() &&
137          "Splice can't change the entry block!");
138   MachineFunction::iterator OldBeginPrior = prior(Begin);
139   MachineFunction::iterator OldEndPrior = prior(End);
140
141   MF.splice(InsertPt, Begin, End);
142
143   prior(Begin)->updateTerminator();
144   OldBeginPrior->updateTerminator();
145   OldEndPrior->updateTerminator();
146 }
147
148 /// EliminateUnconditionalJumpsToTop - Move blocks which unconditionally jump
149 /// to the loop top to the top of the loop so that they have a fall through.
150 /// This can introduce a branch on entry to the loop, but it can eliminate a
151 /// branch within the loop. See the @simple case in
152 /// test/CodeGen/X86/loop_blocks.ll for an example of this.
153 bool CodePlacementOpt::EliminateUnconditionalJumpsToTop(MachineFunction &MF,
154                                                         MachineLoop *L) {
155   bool Changed = false;
156   MachineBasicBlock *TopMBB = L->getTopBlock();
157
158   bool BotHasFallthrough = HasFallthrough(L->getBottomBlock());
159
160   if (TopMBB == MF.begin() ||
161       HasAnalyzableTerminator(prior(MachineFunction::iterator(TopMBB)))) {
162   new_top:
163     for (MachineBasicBlock::pred_iterator PI = TopMBB->pred_begin(),
164          PE = TopMBB->pred_end(); PI != PE; ++PI) {
165       MachineBasicBlock *Pred = *PI;
166       if (Pred == TopMBB) continue;
167       if (HasFallthrough(Pred)) continue;
168       if (!L->contains(Pred)) continue;
169
170       // Verify that we can analyze all the loop entry edges before beginning
171       // any changes which will require us to be able to analyze them.
172       if (Pred == MF.begin())
173         continue;
174       if (!HasAnalyzableTerminator(Pred))
175         continue;
176       if (!HasAnalyzableTerminator(prior(MachineFunction::iterator(Pred))))
177         continue;
178
179       // Move the block.
180       Changed = true;
181
182       // Move it and all the blocks that can reach it via fallthrough edges
183       // exclusively, to keep existing fallthrough edges intact.
184       MachineFunction::iterator Begin = Pred;
185       MachineFunction::iterator End = llvm::next(Begin);
186       while (Begin != MF.begin()) {
187         MachineFunction::iterator Prior = prior(Begin);
188         if (Prior == MF.begin())
189           break;
190         // Stop when a non-fallthrough edge is found.
191         if (!HasFallthrough(Prior))
192           break;
193         // Stop if a block which could fall-through out of the loop is found.
194         if (Prior->isSuccessor(End))
195           break;
196         // If we've reached the top, stop scanning.
197         if (Prior == MachineFunction::iterator(TopMBB)) {
198           // We know top currently has a fall through (because we just checked
199           // it) which would be lost if we do the transformation, so it isn't
200           // worthwhile to do the transformation unless it would expose a new
201           // fallthrough edge.
202           if (!Prior->isSuccessor(End))
203             goto next_pred;
204           // Otherwise we can stop scanning and procede to move the blocks.
205           break;
206         }
207         // If we hit a switch or something complicated, don't move anything
208         // for this predecessor.
209         if (!HasAnalyzableTerminator(prior(MachineFunction::iterator(Prior))))
210           break;
211         // Ok, the block prior to Begin will be moved along with the rest.
212         // Extend the range to include it.
213         Begin = Prior;
214         ++NumIntraMoved;
215       }
216
217       // Move the blocks.
218       Splice(MF, TopMBB, Begin, End);
219
220       // Update TopMBB.
221       TopMBB = L->getTopBlock();
222
223       // We have a new loop top. Iterate on it. We shouldn't have to do this
224       // too many times if BranchFolding has done a reasonable job.
225       goto new_top;
226     next_pred:;
227     }
228   }
229
230   // If the loop previously didn't exit with a fall-through and it now does,
231   // we eliminated a branch.
232   if (Changed &&
233       !BotHasFallthrough &&
234       HasFallthrough(L->getBottomBlock())) {
235     ++NumIntraElim;
236   }
237
238   return Changed;
239 }
240
241 /// MoveDiscontiguousLoopBlocks - Move any loop blocks that are not in the
242 /// portion of the loop contiguous with the header. This usually makes the loop
243 /// contiguous, provided that AnalyzeBranch can handle all the relevant
244 /// branching. See the @cfg_islands case in test/CodeGen/X86/loop_blocks.ll
245 /// for an example of this.
246 bool CodePlacementOpt::MoveDiscontiguousLoopBlocks(MachineFunction &MF,
247                                                    MachineLoop *L) {
248   bool Changed = false;
249   MachineBasicBlock *TopMBB = L->getTopBlock();
250   MachineBasicBlock *BotMBB = L->getBottomBlock();
251
252   // Determine a position to move orphaned loop blocks to. If TopMBB is not
253   // entered via fallthrough and BotMBB is exited via fallthrough, prepend them
254   // to the top of the loop to avoid loosing that fallthrough. Otherwise append
255   // them to the bottom, even if it previously had a fallthrough, on the theory
256   // that it's worth an extra branch to keep the loop contiguous.
257   MachineFunction::iterator InsertPt =
258     llvm::next(MachineFunction::iterator(BotMBB));
259   bool InsertAtTop = false;
260   if (TopMBB != MF.begin() &&
261       !HasFallthrough(prior(MachineFunction::iterator(TopMBB))) &&
262       HasFallthrough(BotMBB)) {
263     InsertPt = TopMBB;
264     InsertAtTop = true;
265   }
266
267   // Keep a record of which blocks are in the portion of the loop contiguous
268   // with the loop header.
269   SmallPtrSet<MachineBasicBlock *, 8> ContiguousBlocks;
270   for (MachineFunction::iterator I = TopMBB,
271        E = llvm::next(MachineFunction::iterator(BotMBB)); I != E; ++I)
272     ContiguousBlocks.insert(I);
273
274   // Find non-contigous blocks and fix them.
275   if (InsertPt != MF.begin() && HasAnalyzableTerminator(prior(InsertPt)))
276     for (MachineLoop::block_iterator BI = L->block_begin(), BE = L->block_end();
277          BI != BE; ++BI) {
278       MachineBasicBlock *BB = *BI;
279
280       // Verify that we can analyze all the loop entry edges before beginning
281       // any changes which will require us to be able to analyze them.
282       if (!HasAnalyzableTerminator(BB))
283         continue;
284       if (!HasAnalyzableTerminator(prior(MachineFunction::iterator(BB))))
285         continue;
286
287       // If the layout predecessor is part of the loop, this block will be
288       // processed along with it. This keeps them in their relative order.
289       if (BB != MF.begin() &&
290           L->contains(prior(MachineFunction::iterator(BB))))
291         continue;
292
293       // Check to see if this block is already contiguous with the main
294       // portion of the loop.
295       if (!ContiguousBlocks.insert(BB))
296         continue;
297
298       // Move the block.
299       Changed = true;
300
301       // Process this block and all loop blocks contiguous with it, to keep
302       // them in their relative order.
303       MachineFunction::iterator Begin = BB;
304       MachineFunction::iterator End = llvm::next(MachineFunction::iterator(BB));
305       for (; End != MF.end(); ++End) {
306         if (!L->contains(End)) break;
307         if (!HasAnalyzableTerminator(End)) break;
308         ContiguousBlocks.insert(End);
309         ++NumIntraMoved;
310       }
311
312       // If we're inserting at the bottom of the loop, and the code we're
313       // moving originally had fall-through successors, bring the sucessors
314       // up with the loop blocks to preserve the fall-through edges.
315       if (!InsertAtTop)
316         for (; End != MF.end(); ++End) {
317           if (L->contains(End)) break;
318           if (!HasAnalyzableTerminator(End)) break;
319           if (!HasFallthrough(prior(End))) break;
320         }
321
322       // Move the blocks. This may invalidate TopMBB and/or BotMBB, but
323       // we don't need them anymore at this point.
324       Splice(MF, InsertPt, Begin, End);
325     }
326
327   return Changed;
328 }
329
330 /// OptimizeIntraLoopEdgesInLoopNest - Reposition loop blocks to minimize
331 /// intra-loop branching and to form contiguous loops.
332 ///
333 /// This code takes the approach of making minor changes to the existing
334 /// layout to fix specific loop-oriented problems. Also, it depends on
335 /// AnalyzeBranch, which can't understand complex control instructions.
336 ///
337 bool CodePlacementOpt::OptimizeIntraLoopEdgesInLoopNest(MachineFunction &MF,
338                                                         MachineLoop *L) {
339   bool Changed = false;
340
341   // Do optimization for nested loops.
342   for (MachineLoop::iterator I = L->begin(), E = L->end(); I != E; ++I)
343     Changed |= OptimizeIntraLoopEdgesInLoopNest(MF, *I);
344
345   // Do optimization for this loop.
346   Changed |= EliminateUnconditionalJumpsToTop(MF, L);
347   Changed |= MoveDiscontiguousLoopBlocks(MF, L);
348
349   return Changed;
350 }
351
352 /// OptimizeIntraLoopEdges - Reposition loop blocks to minimize
353 /// intra-loop branching and to form contiguous loops.
354 ///
355 bool CodePlacementOpt::OptimizeIntraLoopEdges(MachineFunction &MF) {
356   bool Changed = false;
357
358   if (!TLI->shouldOptimizeCodePlacement())
359     return Changed;
360
361   // Do optimization for each loop in the function.
362   for (MachineLoopInfo::iterator I = MLI->begin(), E = MLI->end();
363        I != E; ++I)
364     if (!(*I)->getParentLoop())
365       Changed |= OptimizeIntraLoopEdgesInLoopNest(MF, *I);
366
367   return Changed;
368 }
369
370 /// AlignLoops - Align loop headers to target preferred alignments.
371 ///
372 bool CodePlacementOpt::AlignLoops(MachineFunction &MF) {
373   const Function *F = MF.getFunction();
374   if (F->hasFnAttr(Attribute::OptimizeForSize))
375     return false;
376
377   unsigned Align = TLI->getPrefLoopAlignment();
378   if (!Align)
379     return false;  // Don't care about loop alignment.
380
381   bool Changed = false;
382
383   for (MachineLoopInfo::iterator I = MLI->begin(), E = MLI->end();
384        I != E; ++I)
385     Changed |= AlignLoop(MF, *I, Align);
386
387   return Changed;
388 }
389
390 /// AlignLoop - Align loop headers to target preferred alignments.
391 ///
392 bool CodePlacementOpt::AlignLoop(MachineFunction &MF, MachineLoop *L,
393                                  unsigned Align) {
394   bool Changed = false;
395
396   // Do alignment for nested loops.
397   for (MachineLoop::iterator I = L->begin(), E = L->end(); I != E; ++I)
398     Changed |= AlignLoop(MF, *I, Align);
399
400   L->getTopBlock()->setAlignment(Align);
401   Changed = true;
402   ++NumLoopsAligned;
403
404   return Changed;
405 }
406
407 bool CodePlacementOpt::runOnMachineFunction(MachineFunction &MF) {
408   MLI = &getAnalysis<MachineLoopInfo>();
409   if (MLI->empty())
410     return false;  // No loops.
411
412   TLI = MF.getTarget().getTargetLowering();
413   TII = MF.getTarget().getInstrInfo();
414
415   bool Changed = OptimizeIntraLoopEdges(MF);
416
417   Changed |= AlignLoops(MF);
418
419   return Changed;
420 }