Pulled CodeMetrics out of InlineCost.h and made it a bit more general, so it can...
[oota-llvm.git] / include / llvm / Analysis / CodeMetrics.h
1 //===- CodeMetrics.h - Measures the weight of a function---------*- 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 various weight measurements for a function, helping
11 // the Inliner and PartialSpecialization decide whether to duplicate its
12 // contents.
13 //
14 //===----------------------------------------------------------------------===//
15
16 #ifndef LLVM_ANALYSIS_CODEMETRICS_H
17 #define LLVM_ANALYSIS_CODEMETRICS_H
18
19 namespace llvm {
20   // CodeMetrics - Calculate size and a few similar metrics for a set of
21   // basic blocks.
22   struct CodeMetrics {
23     /// NeverInline - True if this callee should never be inlined into a
24     /// caller.
25     // bool NeverInline;
26
27     // True if this function contains a call to setjmp or _setjmp
28     bool callsSetJmp;
29
30     // True if this function calls itself
31     bool isRecursive;
32
33     // True if this function contains one or more indirect branches
34     bool containsIndirectBr;
35
36     /// usesDynamicAlloca - True if this function calls alloca (in the C sense).
37     bool usesDynamicAlloca;
38
39     /// NumInsts, NumBlocks - Keep track of how large each function is, which
40     /// is used to estimate the code size cost of inlining it.
41     unsigned NumInsts, NumBlocks;
42
43     /// NumBBInsts - Keeps track of basic block code size estimates.
44     DenseMap<const BasicBlock *, unsigned> NumBBInsts;
45
46     /// NumCalls - Keep track of the number of calls to 'big' functions.
47     unsigned NumCalls;
48
49     /// NumVectorInsts - Keep track of how many instructions produce vector
50     /// values.  The inliner is being more aggressive with inlining vector
51     /// kernels.
52     unsigned NumVectorInsts;
53
54     /// NumRets - Keep track of how many Ret instructions the block contains.
55     unsigned NumRets;
56
57     CodeMetrics() : callsSetJmp(false), isRecursive(false),
58                     containsIndirectBr(false), usesDynamicAlloca(false), 
59                     NumInsts(0), NumBlocks(0), NumCalls(0), NumVectorInsts(0), 
60                     NumRets(0) {}
61
62     /// analyzeBasicBlock - Add information about the specified basic block
63     /// to the current structure.
64     void analyzeBasicBlock(const BasicBlock *BB);
65
66     /// analyzeFunction - Add information about the specified function
67     /// to the current structure.
68     void analyzeFunction(Function *F);
69   };
70 }
71
72 #endif