X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=include%2Fllvm%2FAnalysis%2FCodeMetrics.h;h=2f5969129e0281c9b95c2aadc38a359b7f5c7a20;hp=711607834921134f68e818bbbd87aaa2c46300ac;hb=0d1a277d93e4cd69c75a7b91b14a152028d52ef6;hpb=f2286b0152f0b942e82d8e809186e5cc0d247131 diff --git a/include/llvm/Analysis/CodeMetrics.h b/include/llvm/Analysis/CodeMetrics.h index 71160783492..2f5969129e0 100644 --- a/include/llvm/Analysis/CodeMetrics.h +++ b/include/llvm/Analysis/CodeMetrics.h @@ -16,78 +16,92 @@ #define LLVM_ANALYSIS_CODEMETRICS_H #include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/IR/CallSite.h" namespace llvm { - class BasicBlock; - class Function; - class Instruction; - class TargetData; - class Value; - - /// \brief Check whether an instruction is likely to be "free" when lowered. - bool isInstructionFree(const Instruction *I, const TargetData *TD = 0); - - /// \brief Check whether a call will lower to something small. +class AssumptionCache; +class BasicBlock; +class Loop; +class Function; +class Instruction; +class DataLayout; +class TargetTransformInfo; +class Value; + +/// \brief Check whether a call will lower to something small. +/// +/// This tests checks whether this callsite will lower to something +/// significantly cheaper than a traditional call, often a single +/// instruction. Note that if isInstructionFree(CS.getInstruction()) would +/// return true, so will this function. +bool callIsSmall(ImmutableCallSite CS); + +/// \brief Utility to calculate the size and a few similar metrics for a set +/// of basic blocks. +struct CodeMetrics { + /// \brief True if this function contains a call to setjmp or other functions + /// with attribute "returns twice" without having the attribute itself. + bool exposesReturnsTwice; + + /// \brief True if this function calls itself. + bool isRecursive; + + /// \brief True if this function cannot be duplicated. /// - /// This tests checks whether calls to this function will lower to something - /// significantly cheaper than a traditional call, often a single - /// instruction. - bool callIsSmall(const Function *F); - - /// \brief Utility to calculate the size and a few similar metrics for a set - /// of basic blocks. - struct CodeMetrics { - /// \brief True if this function contains a call to setjmp or other functions - /// with attribute "returns twice" without having the attribute itself. - bool exposesReturnsTwice; + /// True if this function contains one or more indirect branches, or it contains + /// one or more 'noduplicate' instructions. + bool notDuplicatable; - /// \brief True if this function calls itself. - bool isRecursive; + /// \brief True if this function calls alloca (in the C sense). + bool usesDynamicAlloca; - /// \brief True if this function contains one or more indirect branches. - bool containsIndirectBr; + /// \brief Number of instructions in the analyzed blocks. + unsigned NumInsts; - /// \brief True if this function calls alloca (in the C sense). - bool usesDynamicAlloca; + /// \brief Number of analyzed blocks. + unsigned NumBlocks; - /// \brief Number of instructions in the analyzed blocks. - unsigned NumInsts; + /// \brief Keeps track of basic block code size estimates. + DenseMap NumBBInsts; - /// \brief Number of analyzed blocks. - unsigned NumBlocks; + /// \brief Keep track of the number of calls to 'big' functions. + unsigned NumCalls; - /// \brief Keeps track of basic block code size estimates. - DenseMap NumBBInsts; + /// \brief The number of calls to internal functions with a single caller. + /// + /// These are likely targets for future inlining, likely exposed by + /// interleaved devirtualization. + unsigned NumInlineCandidates; - /// \brief Keep track of the number of calls to 'big' functions. - unsigned NumCalls; + /// \brief How many instructions produce vector values. + /// + /// The inliner is more aggressive with inlining vector kernels. + unsigned NumVectorInsts; - /// \brief The number of calls to internal functions with a single caller. - /// - /// These are likely targets for future inlining, likely exposed by - /// interleaved devirtualization. - unsigned NumInlineCandidates; + /// \brief How many 'ret' instructions the blocks contain. + unsigned NumRets; - /// \brief How many instructions produce vector values. - /// - /// The inliner is more aggressive with inlining vector kernels. - unsigned NumVectorInsts; + CodeMetrics() + : exposesReturnsTwice(false), isRecursive(false), notDuplicatable(false), + usesDynamicAlloca(false), NumInsts(0), NumBlocks(0), NumCalls(0), + NumInlineCandidates(0), NumVectorInsts(0), NumRets(0) {} - /// \brief How many 'ret' instructions the blocks contain. - unsigned NumRets; + /// \brief Add information about a block to the current state. + void analyzeBasicBlock(const BasicBlock *BB, const TargetTransformInfo &TTI, + SmallPtrSetImpl &EphValues); - CodeMetrics() : exposesReturnsTwice(false), isRecursive(false), - containsIndirectBr(false), usesDynamicAlloca(false), - NumInsts(0), NumBlocks(0), NumCalls(0), - NumInlineCandidates(0), NumVectorInsts(0), - NumRets(0) {} + /// \brief Collect a loop's ephemeral values (those used only by an assume + /// or similar intrinsics in the loop). + static void collectEphemeralValues(const Loop *L, AssumptionCache *AC, + SmallPtrSetImpl &EphValues); - /// \brief Add information about a block to the current state. - void analyzeBasicBlock(const BasicBlock *BB, const TargetData *TD = 0); + /// \brief Collect a functions's ephemeral values (those used only by an + /// assume or similar intrinsics in the function). + static void collectEphemeralValues(const Function *L, AssumptionCache *AC, + SmallPtrSetImpl &EphValues); +}; - /// \brief Add information about a function to the current state. - void analyzeFunction(Function *F, const TargetData *TD = 0); - }; } #endif