| //===- CodeMetrics.h - Measures the weight of a function---------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file implements various weight measurements for code, helping |
| // the Inliner and other passes decide whether to duplicate its contents. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_ANALYSIS_CODEMETRICS_H |
| #define LLVM_ANALYSIS_CODEMETRICS_H |
| |
| #include "llvm/ADT/DenseMap.h" |
| |
| namespace llvm { |
| |
| class TargetData; |
| |
| // CodeMetrics - Calculate size and a few similar metrics for a set of |
| // basic blocks. |
| struct CodeMetrics { |
| /// NeverInline - True if this callee should never be inlined into a |
| /// caller. |
| // bool NeverInline; |
| |
| // True if this function contains a call to setjmp or _setjmp |
| bool callsSetJmp; |
| |
| // True if this function calls itself |
| bool isRecursive; |
| |
| // True if this function contains one or more indirect branches |
| bool containsIndirectBr; |
| |
| /// usesDynamicAlloca - True if this function calls alloca (in the C sense). |
| bool usesDynamicAlloca; |
| |
| /// NumInsts, NumBlocks - Keep track of how large each function is, which |
| /// is used to estimate the code size cost of inlining it. |
| unsigned NumInsts, NumBlocks; |
| |
| /// NumBBInsts - Keeps track of basic block code size estimates. |
| DenseMap<const BasicBlock *, unsigned> NumBBInsts; |
| |
| /// NumCalls - Keep track of the number of calls to 'big' functions. |
| unsigned NumCalls; |
| |
| /// NumInlineCandidates - Keep track of the number of calls to internal |
| /// functions with only a single caller. These are likely targets for |
| /// future inlining, likely exposed by interleaved devirtualization. |
| unsigned NumInlineCandidates; |
| |
| /// NumVectorInsts - Keep track of how many instructions produce vector |
| /// values. The inliner is being more aggressive with inlining vector |
| /// kernels. |
| unsigned NumVectorInsts; |
| |
| /// NumRets - Keep track of how many Ret instructions the block contains. |
| unsigned NumRets; |
| |
| CodeMetrics() : callsSetJmp(false), isRecursive(false), |
| containsIndirectBr(false), usesDynamicAlloca(false), |
| NumInsts(0), NumBlocks(0), NumCalls(0), |
| NumInlineCandidates(0), NumVectorInsts(0), |
| NumRets(0) {} |
| |
| /// analyzeBasicBlock - Add information about the specified basic block |
| /// to the current structure. |
| void analyzeBasicBlock(const BasicBlock *BB, const TargetData *TD = 0); |
| |
| /// analyzeFunction - Add information about the specified function |
| /// to the current structure. |
| void analyzeFunction(Function *F, const TargetData *TD = 0); |
| |
| /// CountCodeReductionForConstant - Figure out an approximation for how |
| /// many instructions will be constant folded if the specified value is |
| /// constant. |
| unsigned CountCodeReductionForConstant(Value *V); |
| |
| /// CountBonusForConstant - Figure out an approximation for how much |
| /// per-call performance boost we can expect if the specified value is |
| /// constant. |
| unsigned CountBonusForConstant(Value *V); |
| |
| /// CountCodeReductionForAlloca - Figure out an approximation of how much |
| /// smaller the function will be if it is inlined into a context where an |
| /// argument becomes an alloca. |
| /// |
| unsigned CountCodeReductionForAlloca(Value *V); |
| }; |
| } |
| |
| #endif |