blob: 54121afefda09bd8b3c1cbea9891cf59f0f638b2 [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 Chengfb8075d2008-02-28 00:43:03 +000027 public:
28 static char ID;
Evan Chengbbf1db72009-05-07 05:42:24 +000029 CodePlacementOpt() : MachineFunctionPass(&ID) {}
Evan Chengfb8075d2008-02-28 00:43:03 +000030
31 virtual bool runOnMachineFunction(MachineFunction &MF);
Evan Chengbbf1db72009-05-07 05:42:24 +000032 virtual const char *getPassName() const {
33 return "Code Placement Optimizater";
34 }
Evan Chengfb8075d2008-02-28 00:43:03 +000035
36 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
37 AU.addRequired<MachineLoopInfo>();
38 AU.addPreserved<MachineLoopInfo>();
Evan Cheng8b56a902008-09-22 22:21:38 +000039 AU.addPreservedID(MachineDominatorsID);
Evan Chengfb8075d2008-02-28 00:43:03 +000040 MachineFunctionPass::getAnalysisUsage(AU);
41 }
42 };
43
Evan Chengbbf1db72009-05-07 05:42:24 +000044 char CodePlacementOpt::ID = 0;
Evan Chengfb8075d2008-02-28 00:43:03 +000045} // end anonymous namespace
46
Evan Chengbbf1db72009-05-07 05:42:24 +000047FunctionPass *llvm::createCodePlacementOptPass() {
48 return new CodePlacementOpt();
49}
Evan Chengfb8075d2008-02-28 00:43:03 +000050
Evan Chengbbf1db72009-05-07 05:42:24 +000051bool CodePlacementOpt::runOnMachineFunction(MachineFunction &MF) {
Evan Chengfb8075d2008-02-28 00:43:03 +000052 const MachineLoopInfo *MLI = &getAnalysis<MachineLoopInfo>();
53
Dan Gohmana8c763b2008-08-14 18:13:49 +000054 if (MLI->empty())
Evan Chengfb8075d2008-02-28 00:43:03 +000055 return false; // No loops.
56
Evan Cheng4f658e92008-02-29 17:52:15 +000057 const TargetLowering *TLI = MF.getTarget().getTargetLowering();
58 if (!TLI)
59 return false;
60
61 unsigned Align = TLI->getPrefLoopAlignment();
Evan Chengfb8075d2008-02-28 00:43:03 +000062 if (!Align)
63 return false; // Don't care about loop alignment.
64
Devang Patel4ae641f2008-10-01 23:18:38 +000065 const Function *F = MF.getFunction();
Devang Patele4d4b8c2008-10-06 17:30:07 +000066 if (F->hasFnAttr(Attribute::OptimizeForSize))
Devang Patel4ae641f2008-10-01 23:18:38 +000067 return false;
68
Evan Chengfb8075d2008-02-28 00:43:03 +000069 for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) {
70 MachineBasicBlock *MBB = I;
Evan Chengdf908412008-11-27 01:16:00 +000071 if (MLI->isLoopHeader(MBB)) {
72 MachineBasicBlock *PredBB = prior(I);
73 if (MLI->getLoopFor(MBB) == MLI->getLoopFor(PredBB))
74 // If previously BB is in the same loop, don't align this BB. We want
75 // to prevent adding noop's inside a loop.
76 continue;
Evan Chengfb8075d2008-02-28 00:43:03 +000077 MBB->setAlignment(Align);
Evan Chengdf908412008-11-27 01:16:00 +000078 }
Evan Chengfb8075d2008-02-28 00:43:03 +000079 }
80
81 return true;
82}