Revert 51775.
[oota-llvm.git] / include / llvm / Transforms / Utils / InlineCost.h
1 //===- InlineCost.cpp - Cost analysis for inliner ---------------*- C++ -*-===//
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 bottom-up inlining of functions into callees.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef INLINECOST_H
15 #define INLINECOST_H
16
17 #include "llvm/ADT/SmallPtrSet.h"
18 #include <map>
19 #include <vector>
20
21 namespace llvm {
22
23   class Value;
24   class Function;
25   class CallSite;
26
27   /// InlineCostAnalyzer - Cost analyzer used by inliner.
28   class InlineCostAnalyzer {
29     struct ArgInfo {
30     public:
31       unsigned ConstantWeight;
32       unsigned AllocaWeight;
33       
34       ArgInfo(unsigned CWeight, unsigned AWeight)
35         : ConstantWeight(CWeight), AllocaWeight(AWeight) {}
36     };
37     
38     // FunctionInfo - For each function, calculate the size of it in blocks and
39     // instructions.
40     struct FunctionInfo {
41       // NumInsts, NumBlocks - Keep track of how large each function is, which is
42       // used to estimate the code size cost of inlining it.
43       unsigned NumInsts, NumBlocks;
44
45       // NumVectorInsts - Keep track how many instrctions produce vector values.
46       // The inliner is being more aggressive with inlining vector kernels.
47       unsigned NumVectorInsts;
48       
49       // ArgumentWeights - Each formal argument of the function is inspected to
50       // see if it is used in any contexts where making it a constant or alloca
51       // would reduce the code size.  If so, we add some value to the argument
52       // entry here.
53       std::vector<ArgInfo> ArgumentWeights;
54       
55       FunctionInfo() : NumInsts(0), NumBlocks(0), NumVectorInsts(0) {}
56       
57       /// analyzeFunction - Fill in the current structure with information gleaned
58       /// from the specified function.
59       void analyzeFunction(Function *F);
60
61       // CountCodeReductionForConstant - Figure out an approximation for how many
62       // instructions will be constant folded if the specified value is constant.
63       //
64       unsigned CountCodeReductionForConstant(Value *V);
65       
66       // CountCodeReductionForAlloca - Figure out an approximation of how much smaller
67       // the function will be if it is inlined into a context where an argument
68       // becomes an alloca.
69       //
70       unsigned CountCodeReductionForAlloca(Value *V);
71     };
72
73     std::map<const Function *, FunctionInfo>CachedFunctionInfo;
74
75   public:
76
77     // getInlineCost - The heuristic used to determine if we should inline the
78     // function call or not.
79     //
80     int getInlineCost(CallSite CS,
81                       SmallPtrSet<const Function *, 16> &NeverInline);
82
83     // getInlineFudgeFactor - Return a > 1.0 factor if the inliner should use a
84     // higher threshold to determine if the function call should be inlined.
85     float getInlineFudgeFactor(CallSite CS);
86   };
87 }
88
89 #endif