Heavily refactor code:
[oota-llvm.git] / lib / Transforms / IPO / InlineSimple.cpp
1 //===- InlineSimple.cpp - Code to perform simple function inlining --------===//
2 //
3 // This file implements bottom-up inlining of functions into callees.
4 //
5 //===----------------------------------------------------------------------===//
6
7 #include "Inliner.h"
8 #include "llvm/Function.h"
9 #include "llvm/iMemory.h"
10 #include "llvm/Support/CallSite.h"
11 #include "llvm/Transforms/IPO.h"
12
13 namespace {
14   struct SimpleInliner : public Inliner {
15     int getInlineCost(CallSite CS);
16   };
17   RegisterOpt<SimpleInliner> X("inline", "Function Integration/Inlining");
18 }
19
20 Pass *createFunctionInliningPass() { return new SimpleInliner(); }
21
22
23 // getInlineCost - The heuristic used to determine if we should inline the
24 // function call or not.
25 //
26 int SimpleInliner::getInlineCost(CallSite CS) {
27   Instruction *TheCall = CS.getInstruction();
28   const Function *Callee = CS.getCalledFunction();
29   const Function *Caller = TheCall->getParent()->getParent();
30
31   // Don't inline a directly recursive call.
32   if (Caller == Callee) return 2000000000;
33
34   // InlineCost - This value measures how good of an inline candidate this call
35   // site is to inline.  A lower inline cost make is more likely for the call to
36   // be inlined.  This value may go negative.
37   //
38   int InlineCost = 0;
39
40   // If there is only one call of the function, and it has internal linkage,
41   // make it almost guaranteed to be inlined.
42   //
43   if (Callee->use_size() == 1 && Callee->hasInternalLinkage())
44     InlineCost -= 30000;
45
46   // Add to the inline quality for properties that make the call valueable to
47   // inline.  This includes factors that indicate that the result of inlining
48   // the function will be optimizable.  Currently this just looks at arguments
49   // passed into the function.
50   //
51   for (CallSite::arg_iterator I = CS.arg_begin(), E = CS.arg_end();
52        I != E; ++I) {
53     // Each argument passed in has a cost at both the caller and the callee
54     // sides.  This favors functions that take many arguments over functions
55     // that take few arguments.
56     InlineCost -= 20;
57
58     // If this is a function being passed in, it is very likely that we will be
59     // able to turn an indirect function call into a direct function call.
60     if (isa<Function>(I))
61       InlineCost -= 100;
62
63     // If a constant, global variable or alloca is passed in, inlining this
64     // function is likely to allow significant future optimization possibilities
65     // (constant propagation, scalar promotion, and scalarization), so encourage
66     // the inlining of the function.
67     //
68     else if (isa<Constant>(I) || isa<GlobalVariable>(I) || isa<AllocaInst>(I))
69       InlineCost -= 60;
70   }
71
72   // Now that we have considered all of the factors that make the call site more
73   // likely to be inlined, look at factors that make us not want to inline it.
74   // As soon as the inline quality gets negative, bail out.
75
76   // Look at the size of the callee.  Each basic block counts as 20 units, and
77   // each instruction counts as 10.
78   for (Function::const_iterator BB = Callee->begin(), E = Callee->end();
79        BB != E; ++BB)
80     InlineCost += BB->size()*10 + 20;
81
82   // Don't inline into something too big, which would make it bigger.  Here, we
83   // count each basic block as a single unit.
84   for (Function::const_iterator BB = Caller->begin(), E = Caller->end();
85        BB != E; ++BB)
86     InlineCost++;
87
88   return InlineCost;
89 }