//===- 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
