blob: 5c2c6989b71611d5dfe267ca68d52fa4d0a3562b [file] [log] [blame]
Devang Patel6899b312007-07-25 18:00:25 +00001//===- BasicInliner.cpp - Basic function level inliner --------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Devang Patel6899b312007-07-25 18:00:25 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file defines a simple function based inliner that does not use
11// call graph information.
12//
13//===----------------------------------------------------------------------===//
14
15#define DEBUG_TYPE "basicinliner"
16
17#include "llvm/Module.h"
18#include "llvm/Function.h"
19#include "llvm/Transforms/Utils/BasicInliner.h"
20#include "llvm/Transforms/Utils/Cloning.h"
21#include "llvm/Support/CallSite.h"
22#include "llvm/Support/CommandLine.h"
23#include "llvm/Support/Debug.h"
24#include "llvm/ADT/SmallPtrSet.h"
25#include <vector>
Devang Patel6899b312007-07-25 18:00:25 +000026
27using namespace llvm;
28
Dan Gohman844731a2008-05-13 00:00:25 +000029static cl::opt<unsigned>
30BasicInlineThreshold("inline-threshold", cl::Hidden, cl::init(200),
31 cl::desc("Control the amount of basic inlining to perform (default = 200)"));
Devang Patel6899b312007-07-25 18:00:25 +000032
33namespace llvm {
34
35 /// BasicInlinerImpl - BasicInliner implemantation class. This hides
36 /// container info, used by basic inliner, from public interface.
37 struct VISIBILITY_HIDDEN BasicInlinerImpl {
38
39 BasicInlinerImpl(const BasicInlinerImpl&); // DO NOT IMPLEMENT
40 void operator=(const BasicInlinerImpl&); // DO NO IMPLEMENT
41 public:
42 BasicInlinerImpl(TargetData *T) : TD(T) {}
43
44 /// addFunction - Add function into the list of functions to process.
45 /// All functions must be inserted using this interface before invoking
46 /// inlineFunctions().
47 void addFunction(Function *F) {
48 Functions.push_back(F);
49 }
50
51 /// neverInlineFunction - Sometimes a function is never to be inlined
52 /// because of one or other reason.
53 void neverInlineFunction(Function *F) {
54 NeverInline.insert(F);
55 }
56
57 /// inlineFuctions - Walk all call sites in all functions supplied by
58 /// client. Inline as many call sites as possible. Delete completely
59 /// inlined functions.
60 void inlineFunctions();
61
62 private:
63 TargetData *TD;
64 std::vector<Function *> Functions;
Devang Patel29381fb2007-07-27 18:34:27 +000065 SmallPtrSet<const Function *, 16> NeverInline;
Devang Patel6899b312007-07-25 18:00:25 +000066 SmallPtrSet<Function *, 8> DeadFunctions;
67 InlineCostAnalyzer CA;
68 };
69
70/// inlineFuctions - Walk all call sites in all functions supplied by
71/// client. Inline as many call sites as possible. Delete completely
72/// inlined functions.
73void BasicInlinerImpl::inlineFunctions() {
74
75 // Scan through and identify all call sites ahead of time so that we only
76 // inline call sites in the original functions, not call sites that result
77 // from inlining other functions.
78 std::vector<CallSite> CallSites;
79
80 for (std::vector<Function *>::iterator FI = Functions.begin(),
81 FE = Functions.end(); FI != FE; ++FI) {
82 Function *F = *FI;
83 for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB)
84 for (BasicBlock::iterator I = BB->begin(); I != BB->end(); ++I) {
85 CallSite CS = CallSite::get(I);
86 if (CS.getInstruction() && CS.getCalledFunction()
87 && !CS.getCalledFunction()->isDeclaration())
88 CallSites.push_back(CS);
89 }
90 }
91
92 DOUT << ": " << CallSites.size() << " call sites.\n";
93
94 // Inline call sites.
95 bool Changed = false;
96 do {
97 Changed = false;
98 for (unsigned index = 0; index != CallSites.size() && !CallSites.empty(); ++index) {
99 CallSite CS = CallSites[index];
100 if (Function *Callee = CS.getCalledFunction()) {
101
102 // Eliminate calls taht are never inlinable.
103 if (Callee->isDeclaration() ||
104 CS.getInstruction()->getParent()->getParent() == Callee) {
105 CallSites.erase(CallSites.begin() + index);
106 --index;
107 continue;
108 }
109 int InlineCost = CA.getInlineCost(CS, NeverInline);
110 if (InlineCost >= (int) BasicInlineThreshold) {
111 DOUT << " NOT Inlining: cost = " << InlineCost
112 << ", call: " << *CS.getInstruction();
113 continue;
114 }
115
116 DOUT << " Inlining: cost=" << InlineCost
117 <<", call: " << *CS.getInstruction();
118
119 // Inline
120 if (InlineFunction(CS, NULL, TD)) {
121 if (Callee->use_empty() && Callee->hasInternalLinkage())
122 DeadFunctions.insert(Callee);
123 Changed = true;
124 CallSites.erase(CallSites.begin() + index);
125 --index;
126 }
127 }
128 }
129 } while (Changed);
130
131 // Remove completely inlined functions from module.
132 for(SmallPtrSet<Function *, 8>::iterator I = DeadFunctions.begin(),
133 E = DeadFunctions.end(); I != E; ++I) {
134 Function *D = *I;
135 Module *M = D->getParent();
136 M->getFunctionList().remove(D);
137 }
138}
139
140BasicInliner::BasicInliner(TargetData *TD) {
141 Impl = new BasicInlinerImpl(TD);
142}
143
144BasicInliner::~BasicInliner() {
145 delete Impl;
146}
147
148/// addFunction - Add function into the list of functions to process.
149/// All functions must be inserted using this interface before invoking
150/// inlineFunctions().
151void BasicInliner::addFunction(Function *F) {
152 Impl->addFunction(F);
153}
154
155/// neverInlineFunction - Sometimes a function is never to be inlined because
156/// of one or other reason.
157void BasicInliner::neverInlineFunction(Function *F) {
158 Impl->neverInlineFunction(F);
159}
160
161/// inlineFuctions - Walk all call sites in all functions supplied by
162/// client. Inline as many call sites as possible. Delete completely
163/// inlined functions.
164void BasicInliner::inlineFunctions() {
165 Impl->inlineFunctions();
166}
167
168}