whitespace fix.
[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
42       /// is used to estimate the code size cost of inlining it.
43       unsigned NumInsts, NumBlocks;
44
45       /// NumVectorInsts - Keep track how many instrctions produce vector
46       /// values.  The inliner is being more aggressive with inlining vector
47       /// kernels.
48       unsigned NumVectorInsts;
49       
50       /// ArgumentWeights - Each formal argument of the function is inspected to
51       /// see if it is used in any contexts where making it a constant or alloca
52       /// would reduce the code size.  If so, we add some value to the argument
53       /// entry here.
54       std::vector<ArgInfo> ArgumentWeights;
55       
56       FunctionInfo() : NumInsts(0), NumBlocks(0), NumVectorInsts(0) {}
57       
58       /// analyzeFunction - Fill in the current structure with information
59       /// gleaned from the specified function.
60       void analyzeFunction(Function *F);
61
62       /// CountCodeReductionForConstant - Figure out an approximation for how
63       /// many instructions will be constant folded if the specified value is
64       /// constant.
65       unsigned CountCodeReductionForConstant(Value *V);
66       
67       /// CountCodeReductionForAlloca - Figure out an approximation of how much
68       /// smaller the function will be if it is inlined into a context where an
69       /// argument becomes an alloca.
70       ///
71       unsigned CountCodeReductionForAlloca(Value *V);
72     };
73
74     std::map<const Function *, FunctionInfo> CachedFunctionInfo;
75
76   public:
77
78     /// getInlineCost - The heuristic used to determine if we should inline the
79     /// function call or not.
80     ///
81     int getInlineCost(CallSite CS,
82                       SmallPtrSet<const Function *, 16> &NeverInline);
83
84     /// getInlineFudgeFactor - Return a > 1.0 factor if the inliner should use a
85     /// higher threshold to determine if the function call should be inlined.
86     float getInlineFudgeFactor(CallSite CS);
87   };
88 }
89
90 #endif