From caa2c40a57040dc3e1a5e40401cd1e4ede845451 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Sun, 1 Apr 2012 22:44:09 +0000 Subject: [PATCH] Start cleaning up the InlineCost class. This switches to sentinel values rather than a bitfield, a great suggestion by Chris during code review. There is still quite a bit of cruft in the interface, but that requires sorting out some awkward uses of the cost inside the actual inliner. No functionality changed intended here. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153853 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Analysis/InlineCost.h | 45 +++++++++++++----------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/include/llvm/Analysis/InlineCost.h b/include/llvm/Analysis/InlineCost.h index 34162050864..f5784a751c0 100644 --- a/include/llvm/Analysis/InlineCost.h +++ b/include/llvm/Analysis/InlineCost.h @@ -49,59 +49,54 @@ namespace llvm { /// directly tested to determine if inlining should occur given the cost and /// threshold for this cost metric. class InlineCost { - enum CostKind { - CK_Variable, - CK_Always, - CK_Never + enum SentinelValues { + AlwaysInlineCost = INT_MIN, + NeverInlineCost = INT_MAX }; - const int Cost : 30; // The inlining cost if neither always nor never. - const unsigned Kind : 2; // The type of cost, one of CostKind above. + /// \brief The estimated cost of inlining this callsite. + const int Cost; - /// \brief The adjusted threshold against which this cost should be tested. + /// \brief The adjusted threshold against which this cost was computed. const int Threshold; // Trivial constructor, interesting logic in the factory functions below. - InlineCost(int Cost, CostKind Kind, int Threshold) - : Cost(Cost), Kind(Kind), Threshold(Threshold) {} + InlineCost(int Cost, int Threshold) + : Cost(Cost), Threshold(Threshold) {} public: static InlineCost get(int Cost, int Threshold) { - InlineCost Result(Cost, CK_Variable, Threshold); - assert(Result.Cost == Cost && "Cost exceeds InlineCost precision"); - return Result; + assert(Cost > AlwaysInlineCost && "Cost crosses sentinel value"); + assert(Cost < NeverInlineCost && "Cost crosses sentinel value"); + return InlineCost(Cost, Threshold); } static InlineCost getAlways() { - return InlineCost(0, CK_Always, 0); + return InlineCost(AlwaysInlineCost, 0); } static InlineCost getNever() { - return InlineCost(0, CK_Never, 0); + return InlineCost(NeverInlineCost, 0); } /// \brief Test whether the inline cost is low enough for inlining. operator bool() const { - if (isAlways()) return true; - if (isNever()) return false; return Cost < Threshold; } - bool isVariable() const { return Kind == CK_Variable; } - bool isAlways() const { return Kind == CK_Always; } - bool isNever() const { return Kind == CK_Never; } + bool isAlways() const { return Cost == AlwaysInlineCost; } + bool isNever() const { return Cost == NeverInlineCost; } + bool isVariable() const { return !isAlways() && !isNever(); } - /// getCost() - Return a "variable" inline cost's amount. It is - /// an error to call this on an "always" or "never" InlineCost. + /// \brief Get the inline cost estimate. + /// It is an error to call this on an "always" or "never" InlineCost. int getCost() const { - assert(Kind == CK_Variable && "Invalid access of InlineCost"); + assert(isVariable() && "Invalid access of InlineCost"); return Cost; } /// \brief Get the cost delta from the threshold for inlining. /// Only valid if the cost is of the variable kind. Returns a negative /// value if the cost is too high to inline. - int getCostDelta() const { - return Threshold - getCost(); - } + int getCostDelta() const { return Threshold - getCost(); } }; /// InlineCostAnalyzer - Cost analyzer used by inliner.