[llvm-commits] [llvm] r83998 - in /llvm/trunk: include/llvm/Analysis/InlineCost.h include/llvm/Transforms/Utils/BasicInliner.h include/llvm/Transforms/Utils/InlineCost.h lib/Analysis/InlineCost.cpp lib/Transforms/IPO/InlineAlways.cpp lib/Transfor

Devang Patel devang.patel at gmail.com
Tue Oct 13 11:46:49 PDT 2009


On Tue, Oct 13, 2009 at 11:30 AM, Dan Gohman <gohman at apple.com> wrote:
> Author: djg
> Date: Tue Oct 13 13:30:07 2009
> New Revision: 83998
>
> URL: http://llvm.org/viewvc/llvm-project?rev=83998&view=rev
> Log:
> Move the InlineCost code from Transforms/Utils to Analysis.

Thanks Dan!
I'd rename this as CodeSizeEstimate or something like that because we
intend to use it to estimate code size for loop transformations e.g.
loop rotate, loop unswitch etc..

>
> Added:
>    llvm/trunk/include/llvm/Analysis/InlineCost.h
>      - copied, changed from r83997, llvm/trunk/include/llvm/Transforms/Utils/InlineCost.h
>    llvm/trunk/lib/Analysis/InlineCost.cpp
>      - copied, changed from r83997, llvm/trunk/lib/Transforms/Utils/InlineCost.cpp
> Removed:
>    llvm/trunk/include/llvm/Transforms/Utils/InlineCost.h
> Modified:
>    llvm/trunk/include/llvm/Transforms/Utils/BasicInliner.h
>    llvm/trunk/lib/Transforms/IPO/InlineAlways.cpp
>    llvm/trunk/lib/Transforms/IPO/InlineSimple.cpp
>    llvm/trunk/lib/Transforms/IPO/Inliner.cpp
>
> Copied: llvm/trunk/include/llvm/Analysis/InlineCost.h (from r83997, llvm/trunk/include/llvm/Transforms/Utils/InlineCost.h)
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/InlineCost.h?p2=llvm/trunk/include/llvm/Analysis/InlineCost.h&p1=llvm/trunk/include/llvm/Transforms/Utils/InlineCost.h&r1=83997&r2=83998&rev=83998&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/Utils/InlineCost.h (original)
> +++ llvm/trunk/include/llvm/Analysis/InlineCost.h Tue Oct 13 13:30:07 2009
> @@ -11,8 +11,8 @@
>  //
>  //===----------------------------------------------------------------------===//
>
> -#ifndef LLVM_TRANSFORMS_UTILS_INLINECOST_H
> -#define LLVM_TRANSFORMS_UTILS_INLINECOST_H
> +#ifndef LLVM_ANALYSIS_INLINECOST_H
> +#define LLVM_ANALYSIS_INLINECOST_H
>
>  #include <cassert>
>  #include <climits>
>
> Modified: llvm/trunk/include/llvm/Transforms/Utils/BasicInliner.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/BasicInliner.h?rev=83998&r1=83997&r2=83998&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/Utils/BasicInliner.h (original)
> +++ llvm/trunk/include/llvm/Transforms/Utils/BasicInliner.h Tue Oct 13 13:30:07 2009
> @@ -15,7 +15,7 @@
>  #ifndef BASICINLINER_H
>  #define BASICINLINER_H
>
> -#include "llvm/Transforms/Utils/InlineCost.h"
> +#include "llvm/Analysis/InlineCost.h"
>
>  namespace llvm {
>
>
> Removed: llvm/trunk/include/llvm/Transforms/Utils/InlineCost.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/InlineCost.h?rev=83997&view=auto
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/Utils/InlineCost.h (original)
> +++ llvm/trunk/include/llvm/Transforms/Utils/InlineCost.h (removed)
> @@ -1,172 +0,0 @@
> -//===- InlineCost.cpp - Cost analysis for inliner ---------------*- 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 heuristics for inlining decisions.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#ifndef LLVM_TRANSFORMS_UTILS_INLINECOST_H
> -#define LLVM_TRANSFORMS_UTILS_INLINECOST_H
> -
> -#include <cassert>
> -#include <climits>
> -#include <map>
> -#include <vector>
> -
> -namespace llvm {
> -
> -  class Value;
> -  class Function;
> -  class BasicBlock;
> -  class CallSite;
> -  template<class PtrType, unsigned SmallSize>
> -  class SmallPtrSet;
> -
> -  namespace InlineConstants {
> -    // Various magic constants used to adjust heuristics.
> -    const int CallPenalty = 5;
> -    const int LastCallToStaticBonus = -15000;
> -    const int ColdccPenalty = 2000;
> -    const int NoreturnPenalty = 10000;
> -  }
> -
> -  /// InlineCost - Represent the cost of inlining a function. This
> -  /// supports special values for functions which should "always" or
> -  /// "never" be inlined. Otherwise, the cost represents a unitless
> -  /// amount; smaller values increase the likelyhood of the function
> -  /// being inlined.
> -  class InlineCost {
> -    enum Kind {
> -      Value,
> -      Always,
> -      Never
> -    };
> -
> -    // This is a do-it-yourself implementation of
> -    //   int Cost : 30;
> -    //   unsigned Type : 2;
> -    // We used to use bitfields, but they were sometimes miscompiled (PR3822).
> -    enum { TYPE_BITS = 2 };
> -    enum { COST_BITS = unsigned(sizeof(unsigned)) * CHAR_BIT - TYPE_BITS };
> -    unsigned TypedCost; // int Cost : COST_BITS; unsigned Type : TYPE_BITS;
> -
> -    Kind getType() const {
> -      return Kind(TypedCost >> COST_BITS);
> -    }
> -
> -    int getCost() const {
> -      // Sign-extend the bottom COST_BITS bits.
> -      return (int(TypedCost << TYPE_BITS)) >> TYPE_BITS;
> -    }
> -
> -    InlineCost(int C, int T) {
> -      TypedCost = (unsigned(C << TYPE_BITS) >> TYPE_BITS) | (T << COST_BITS);
> -      assert(getCost() == C && "Cost exceeds InlineCost precision");
> -    }
> -  public:
> -    static InlineCost get(int Cost) { return InlineCost(Cost, Value); }
> -    static InlineCost getAlways() { return InlineCost(0, Always); }
> -    static InlineCost getNever() { return InlineCost(0, Never); }
> -
> -    bool isVariable() const { return getType() == Value; }
> -    bool isAlways() const { return getType() == Always; }
> -    bool isNever() const { return getType() == Never; }
> -
> -    /// getValue() - Return a "variable" inline cost's amount. It is
> -    /// an error to call this on an "always" or "never" InlineCost.
> -    int getValue() const {
> -      assert(getType() == Value && "Invalid access of InlineCost");
> -      return getCost();
> -    }
> -  };
> -
> -  /// InlineCostAnalyzer - Cost analyzer used by inliner.
> -  class InlineCostAnalyzer {
> -    struct ArgInfo {
> -    public:
> -      unsigned ConstantWeight;
> -      unsigned AllocaWeight;
> -
> -      ArgInfo(unsigned CWeight, unsigned AWeight)
> -        : ConstantWeight(CWeight), AllocaWeight(AWeight) {}
> -    };
> -
> -    // RegionInfo - Calculate size and a few related metrics for a set of
> -    // basic blocks.
> -    struct RegionInfo {
> -      /// NeverInline - True if this callee should never be inlined into a
> -      /// caller.
> -      bool NeverInline;
> -
> -      /// 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;
> -
> -      /// 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;
> -
> -      /// ArgumentWeights - Each formal argument of the function is inspected to
> -      /// see if it is used in any contexts where making it a constant or alloca
> -      /// would reduce the code size.  If so, we add some value to the argument
> -      /// entry here.
> -      std::vector<ArgInfo> ArgumentWeights;
> -
> -      RegionInfo() : NeverInline(false), usesDynamicAlloca(false), NumInsts(0),
> -                     NumBlocks(0), NumVectorInsts(0), NumRets(0) {}
> -
> -      /// analyzeBasicBlock - Add information about the specified basic block
> -      /// to the current structure.
> -      void analyzeBasicBlock(const BasicBlock *BB);
> -
> -      /// analyzeFunction - Add information about the specified function
> -      /// to the current structure.
> -      void analyzeFunction(Function *F);
> -
> -      /// CountCodeReductionForConstant - Figure out an approximation for how
> -      /// many instructions will be constant folded if the specified value is
> -      /// constant.
> -      unsigned CountCodeReductionForConstant(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);
> -    };
> -
> -    std::map<const Function *, RegionInfo> CachedFunctionInfo;
> -
> -  public:
> -
> -    /// getInlineCost - The heuristic used to determine if we should inline the
> -    /// function call or not.
> -    ///
> -    InlineCost getInlineCost(CallSite CS,
> -                             SmallPtrSet<const Function *, 16> &NeverInline);
> -
> -    /// getInlineFudgeFactor - Return a > 1.0 factor if the inliner should use a
> -    /// higher threshold to determine if the function call should be inlined.
> -    float getInlineFudgeFactor(CallSite CS);
> -
> -    /// resetCachedFunctionInfo - erase any cached cost info for this function.
> -    void resetCachedCostInfo(Function* Caller) {
> -      CachedFunctionInfo[Caller].NumBlocks = 0;
> -    }
> -  };
> -}
> -
> -#endif
>
> Copied: llvm/trunk/lib/Analysis/InlineCost.cpp (from r83997, llvm/trunk/lib/Transforms/Utils/InlineCost.cpp)
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InlineCost.cpp?p2=llvm/trunk/lib/Analysis/InlineCost.cpp&p1=llvm/trunk/lib/Transforms/Utils/InlineCost.cpp&r1=83997&r2=83998&rev=83998&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/InlineCost.cpp (original)
> +++ llvm/trunk/lib/Analysis/InlineCost.cpp Tue Oct 13 13:30:07 2009
> @@ -11,7 +11,7 @@
>  //
>  //===----------------------------------------------------------------------===//
>
> -#include "llvm/Transforms/Utils/InlineCost.h"
> +#include "llvm/Analysis/InlineCost.h"
>  #include "llvm/Support/CallSite.h"
>  #include "llvm/CallingConv.h"
>  #include "llvm/IntrinsicInst.h"
>
> Modified: llvm/trunk/lib/Transforms/IPO/InlineAlways.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/InlineAlways.cpp?rev=83998&r1=83997&r2=83998&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/InlineAlways.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/InlineAlways.cpp Tue Oct 13 13:30:07 2009
> @@ -19,11 +19,11 @@
>  #include "llvm/Module.h"
>  #include "llvm/Type.h"
>  #include "llvm/Analysis/CallGraph.h"
> +#include "llvm/Analysis/InlineCost.h"
>  #include "llvm/Support/CallSite.h"
>  #include "llvm/Support/Compiler.h"
>  #include "llvm/Transforms/IPO.h"
>  #include "llvm/Transforms/IPO/InlinerPass.h"
> -#include "llvm/Transforms/Utils/InlineCost.h"
>  #include "llvm/ADT/SmallPtrSet.h"
>
>  using namespace llvm;
>
> Modified: llvm/trunk/lib/Transforms/IPO/InlineSimple.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/InlineSimple.cpp?rev=83998&r1=83997&r2=83998&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/InlineSimple.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/InlineSimple.cpp Tue Oct 13 13:30:07 2009
> @@ -18,11 +18,11 @@
>  #include "llvm/Module.h"
>  #include "llvm/Type.h"
>  #include "llvm/Analysis/CallGraph.h"
> +#include "llvm/Analysis/InlineCost.h"
>  #include "llvm/Support/CallSite.h"
>  #include "llvm/Support/Compiler.h"
>  #include "llvm/Transforms/IPO.h"
>  #include "llvm/Transforms/IPO/InlinerPass.h"
> -#include "llvm/Transforms/Utils/InlineCost.h"
>  #include "llvm/ADT/SmallPtrSet.h"
>
>  using namespace llvm;
>
> Modified: llvm/trunk/lib/Transforms/IPO/Inliner.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/Inliner.cpp?rev=83998&r1=83997&r2=83998&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/Inliner.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/Inliner.cpp Tue Oct 13 13:30:07 2009
> @@ -18,10 +18,10 @@
>  #include "llvm/Instructions.h"
>  #include "llvm/IntrinsicInst.h"
>  #include "llvm/Analysis/CallGraph.h"
> +#include "llvm/Analysis/InlineCost.h"
>  #include "llvm/Support/CallSite.h"
>  #include "llvm/Target/TargetData.h"
>  #include "llvm/Transforms/IPO/InlinerPass.h"
> -#include "llvm/Transforms/Utils/InlineCost.h"
>  #include "llvm/Transforms/Utils/Cloning.h"
>  #include "llvm/Support/CommandLine.h"
>  #include "llvm/Support/Debug.h"
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



-- 
-
Devang




More information about the llvm-commits mailing list