Index: llvm/include/llvm/Analysis/TargetTransformInfo.h =================================================================== --- llvm/include/llvm/Analysis/TargetTransformInfo.h +++ llvm/include/llvm/Analysis/TargetTransformInfo.h @@ -337,6 +337,9 @@ /// individual classes of instructions would be better. unsigned getInliningThresholdMultiplier() const; + unsigned getInliningCostBenefitAnalysisSavingsMultiplier() const; + unsigned getInliningCostBenefitAnalysisProfitableMultiplier() const; + /// \returns A value to be added to the inlining threshold. unsigned adjustInliningThreshold(const CallBase *CB) const; @@ -1670,6 +1673,8 @@ const TTI::PointersChainInfo &Info, Type *AccessTy, TTI::TargetCostKind CostKind) = 0; virtual unsigned getInliningThresholdMultiplier() const = 0; + virtual unsigned getInliningCostBenefitAnalysisSavingsMultiplier() const = 0; + virtual unsigned getInliningCostBenefitAnalysisProfitableMultiplier() const = 0; virtual unsigned adjustInliningThreshold(const CallBase *CB) = 0; virtual int getInlinerVectorBonusPercent() const = 0; virtual InstructionCost getMemcpyCost(const Instruction *I) = 0; @@ -2035,6 +2040,12 @@ unsigned getInliningThresholdMultiplier() const override { return Impl.getInliningThresholdMultiplier(); } + unsigned getInliningCostBenefitAnalysisSavingsMultiplier() const override { + return Impl.getInliningCostBenefitAnalysisSavingsMultiplier(); + } + unsigned getInliningCostBenefitAnalysisProfitableMultiplier() const override { + return Impl.getInliningCostBenefitAnalysisProfitableMultiplier(); + } unsigned adjustInliningThreshold(const CallBase *CB) override { return Impl.adjustInliningThreshold(CB); } Index: llvm/include/llvm/Analysis/TargetTransformInfoImpl.h =================================================================== --- llvm/include/llvm/Analysis/TargetTransformInfoImpl.h +++ llvm/include/llvm/Analysis/TargetTransformInfoImpl.h @@ -69,6 +69,8 @@ } unsigned getInliningThresholdMultiplier() const { return 1; } + unsigned getInliningCostBenefitAnalysisSavingsMultiplier() const { return 8; } + unsigned getInliningCostBenefitAnalysisProfitableMultiplier() const { return 8; } unsigned adjustInliningThreshold(const CallBase *CB) const { return 0; } int getInlinerVectorBonusPercent() const { return 150; } Index: llvm/lib/Analysis/InlineCost.cpp =================================================================== --- llvm/lib/Analysis/InlineCost.cpp +++ llvm/lib/Analysis/InlineCost.cpp @@ -888,7 +888,7 @@ CostBenefit.emplace(APInt(128, Size), CycleSavings); - // Return true if the savings justify the cost of inlining. Specifically, + // Inline if the savings justify the cost of inlining. Specifically, // we evaluate the following inequality: // // CycleSavings PSI->getOrCompHotCountThreshold() @@ -898,10 +898,21 @@ // Note that the left hand side is specific to a call site. The right hand // side is a constant for the entire executable. APInt LHS = CycleSavings; - LHS *= InlineSavingsMultiplier; + LHS *= TTI.getInliningCostBenefitAnalysisSavingsMultiplier(); APInt RHS(128, PSI->getOrCompHotCountThreshold()); RHS *= Size; - return LHS.uge(RHS); + if (LHS.uge(RHS)) + return true; + + // If the savings doesn't justify the size cost, do not inline. + APInt ProfitableThreshold = CycleSavings; + ProfitableThreshold *= TTI.getInliningCostBenefitAnalysisProfitableMultiplier(); + + if (RHS.ule(ProfitableThreshold)) + return false; + + // Otherwise, fallback to cost-threshold analysis. + return std::nullopt; } InlineResult finalizeAnalysis() override { Index: llvm/lib/Analysis/TargetTransformInfo.cpp =================================================================== --- llvm/lib/Analysis/TargetTransformInfo.cpp +++ llvm/lib/Analysis/TargetTransformInfo.cpp @@ -212,6 +212,14 @@ return TTIImpl->getInliningThresholdMultiplier(); } +unsigned TargetTransformInfo::getInliningCostBenefitAnalysisSavingsMultiplier() const { + return TTIImpl->getInliningCostBenefitAnalysisSavingsMultiplier(); +} + +unsigned TargetTransformInfo::getInliningCostBenefitAnalysisProfitableMultiplier() const { + return TTIImpl->getInliningCostBenefitAnalysisProfitableMultiplier(); +} + unsigned TargetTransformInfo::adjustInliningThreshold(const CallBase *CB) const { return TTIImpl->adjustInliningThreshold(CB);