blob: 924a96930b591f23be4de134d1229b7875b3c2b4 [file] [log] [blame]
Evan Chengbbf1db72009-05-07 05:42:24 +00001//===-- CodePlacementOpt.cpp - Code Placement pass. -----------------------===//
Evan Chengfb8075d2008-02-28 00:43:03 +00002//
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//
Evan Chengbbf1db72009-05-07 05:42:24 +000010// This file implements the pass that optimize code placement and align loop
11// headers to target specific alignment boundary.
Evan Chengfb8075d2008-02-28 00:43:03 +000012//
13//===----------------------------------------------------------------------===//
14
Evan Chengbbf1db72009-05-07 05:42:24 +000015#define DEBUG_TYPE "code-placement"
Evan Chengfb8075d2008-02-28 00:43:03 +000016#include "llvm/CodeGen/MachineLoopInfo.h"
17#include "llvm/CodeGen/MachineFunctionPass.h"
18#include "llvm/CodeGen/Passes.h"
19#include "llvm/Target/TargetLowering.h"
20#include "llvm/Target/TargetMachine.h"
Evan Chengfb8075d2008-02-28 00:43:03 +000021#include "llvm/Support/Compiler.h"
22#include "llvm/Support/Debug.h"
23using namespace llvm;
24
25namespace {
Evan Chengbbf1db72009-05-07 05:42:24 +000026 class CodePlacementOpt : public MachineFunctionPass {
Evan Cheng7132e122009-05-07 05:49:39 +000027 const MachineLoopInfo *MLI;
28
Evan Chengfb8075d2008-02-28 00:43:03 +000029 public:
30 static char ID;
Evan Chengbbf1db72009-05-07 05:42:24 +000031 CodePlacementOpt() : MachineFunctionPass(&ID) {}
Evan Chengfb8075d2008-02-28 00:43:03 +000032
33 virtual bool runOnMachineFunction(MachineFunction &MF);
Evan Chengbbf1db72009-05-07 05:42:24 +000034 virtual const char *getPassName() const {
35 return "Code Placement Optimizater";
36 }
Evan Chengfb8075d2008-02-28 00:43:03 +000037
38 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
39 AU.addRequired<MachineLoopInfo>();
40 AU.addPreserved<MachineLoopInfo>();
Evan Cheng8b56a902008-09-22 22:21:38 +000041 AU.addPreservedID(MachineDominatorsID);
Evan Chengfb8075d2008-02-28 00:43:03 +000042 MachineFunctionPass::getAnalysisUsage(AU);
43 }
Evan Cheng7132e122009-05-07 05:49:39 +000044
45 private:
46 bool AlignLoops(MachineFunction &MF);
Evan Chengfb8075d2008-02-28 00:43:03 +000047 };
48
Evan Chengbbf1db72009-05-07 05:42:24 +000049 char CodePlacementOpt::ID = 0;
Evan Chengfb8075d2008-02-28 00:43:03 +000050} // end anonymous namespace
51
Evan Chengbbf1db72009-05-07 05:42:24 +000052FunctionPass *llvm::createCodePlacementOptPass() {
53 return new CodePlacementOpt();
54}
Evan Chengfb8075d2008-02-28 00:43:03 +000055
Evan Cheng7132e122009-05-07 05:49:39 +000056/// AlignLoops - Align loop headers to target preferred alignments.
57///
58bool CodePlacementOpt::AlignLoops(MachineFunction &MF) {
Evan Cheng4f658e92008-02-29 17:52:15 +000059 const TargetLowering *TLI = MF.getTarget().getTargetLowering();
60 if (!TLI)
61 return false;
62
63 unsigned Align = TLI->getPrefLoopAlignment();
Evan Chengfb8075d2008-02-28 00:43:03 +000064 if (!Align)
65 return false; // Don't care about loop alignment.
66
Devang Patel4ae641f2008-10-01 23:18:38 +000067 const Function *F = MF.getFunction();
Devang Patele4d4b8c2008-10-06 17:30:07 +000068 if (F->hasFnAttr(Attribute::OptimizeForSize))
Devang Patel4ae641f2008-10-01 23:18:38 +000069 return false;
70
Evan Cheng7132e122009-05-07 05:49:39 +000071 bool Changed = false;
Evan Chengfb8075d2008-02-28 00:43:03 +000072 for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) {
73 MachineBasicBlock *MBB = I;
Evan Chengdf908412008-11-27 01:16:00 +000074 if (MLI->isLoopHeader(MBB)) {
75 MachineBasicBlock *PredBB = prior(I);
76 if (MLI->getLoopFor(MBB) == MLI->getLoopFor(PredBB))
77 // If previously BB is in the same loop, don't align this BB. We want
78 // to prevent adding noop's inside a loop.
79 continue;
Evan Chengfb8075d2008-02-28 00:43:03 +000080 MBB->setAlignment(Align);
Evan Cheng7132e122009-05-07 05:49:39 +000081 Changed = true;
Evan Chengdf908412008-11-27 01:16:00 +000082 }
Evan Chengfb8075d2008-02-28 00:43:03 +000083 }
84
Evan Cheng7132e122009-05-07 05:49:39 +000085 return Changed;
86}
87
88bool CodePlacementOpt::runOnMachineFunction(MachineFunction &MF) {
89 MLI = &getAnalysis<MachineLoopInfo>();
90 if (MLI->empty())
91 return false; // No loops.
92
93 bool Changed = false;
94 Changed |= AlignLoops(MF);
95
96 return Changed;
Evan Chengfb8075d2008-02-28 00:43:03 +000097}