[llvm] c113594 - Revert "[llvm][ModuleInliner] Add inline cost priority for module inliner"

Liqiang Tao via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 28 07:38:26 PDT 2022


Author: Liqiang Tao
Date: 2022-07-28T22:36:28+08:00
New Revision: c113594378a091ada63f2d4582b8da17b0151567

URL: https://github.com/llvm/llvm-project/commit/c113594378a091ada63f2d4582b8da17b0151567
DIFF: https://github.com/llvm/llvm-project/commit/c113594378a091ada63f2d4582b8da17b0151567.diff

LOG: Revert "[llvm][ModuleInliner] Add inline cost priority for module inliner"

This reverts commit bb7f62bbbd35840006a1d202228e835909f591cf.

Added: 
    

Modified: 
    llvm/include/llvm/Analysis/InlineOrder.h
    llvm/lib/Analysis/CMakeLists.txt
    llvm/lib/Transforms/IPO/ModuleInliner.cpp

Removed: 
    llvm/lib/Analysis/InlineOrder.cpp


################################################################################
diff  --git a/llvm/include/llvm/Analysis/InlineOrder.h b/llvm/include/llvm/Analysis/InlineOrder.h
index 9111826d47b93..aabd86c987802 100644
--- a/llvm/include/llvm/Analysis/InlineOrder.h
+++ b/llvm/include/llvm/Analysis/InlineOrder.h
@@ -12,7 +12,6 @@
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/STLFunctionalExtras.h"
 #include "llvm/ADT/SmallVector.h"
-#include "llvm/Analysis/InlineCost.h"
 #include "llvm/IR/InstrTypes.h"
 #include <algorithm>
 #include <utility>
@@ -21,8 +20,6 @@ namespace llvm {
 class CallBase;
 class Function;
 
-enum class InlinePriorityMode : int { NoPriority, Size, Cost, OptRatio };
-
 template <typename T> class InlineOrder {
 public:
   using reference = T &;
@@ -43,10 +40,6 @@ template <typename T> class InlineOrder {
   bool empty() { return !size(); }
 };
 
-std::unique_ptr<InlineOrder<std::pair<CallBase *, int>>>
-getInlineOrder(InlinePriorityMode UseInlinePriority,
-               FunctionAnalysisManager &FAM, const InlineParams &Params);
-
 template <typename T, typename Container = SmallVector<T, 16>>
 class DefaultInlineOrder : public InlineOrder<T> {
   using reference = T &;
@@ -89,16 +82,15 @@ class SizePriority : public InlinePriority {
   using PriorityT = unsigned;
   DenseMap<const CallBase *, PriorityT> Priorities;
 
-  PriorityT evaluate(const CallBase *CB) {
+  static PriorityT evaluate(const CallBase *CB) {
     Function *Callee = CB->getCalledFunction();
     return Callee->getInstructionCount();
   }
 
-  bool isMoreDesirable(const PriorityT &P1, const PriorityT &P2) const {
+  static bool isMoreDesirable(const PriorityT &P1, const PriorityT &P2) {
     return P1 < P2;
   }
 
-public:
   bool hasLowerPriority(const CallBase *L, const CallBase *R) const override {
     const auto I1 = Priorities.find(L);
     const auto I2 = Priorities.find(R);
@@ -106,49 +98,7 @@ class SizePriority : public InlinePriority {
     return isMoreDesirable(I2->second, I1->second);
   }
 
-  // Update the priority associated with CB.
-  void update(const CallBase *CB) override { Priorities[CB] = evaluate(CB); };
-
-  bool updateAndCheckDecreased(const CallBase *CB) override {
-    auto It = Priorities.find(CB);
-    const auto OldPriority = It->second;
-    It->second = evaluate(CB);
-    const auto NewPriority = It->second;
-    return isMoreDesirable(OldPriority, NewPriority);
-  }
-};
-
-class CostPriority : public InlinePriority {
-  using PriorityT = int;
-  DenseMap<const CallBase *, PriorityT> Priorities;
-  std::function<InlineCost(const CallBase *)> getInlineCost;
-
-  PriorityT evaluate(const CallBase *CB) {
-    auto IC = getInlineCost(CB);
-    int cost = 0;
-    if (IC.isVariable())
-      cost = IC.getCost();
-    else
-      cost = IC.isNever() ? INT_MAX : INT_MIN;
-    return cost;
-  }
-
-  bool isMoreDesirable(const PriorityT &P1, const PriorityT &P2) const {
-    return P1 < P2;
-  }
-
 public:
-  CostPriority() = delete;
-  CostPriority(std::function<InlineCost(const CallBase *)> getInlineCost)
-      : getInlineCost(getInlineCost){};
-
-  bool hasLowerPriority(const CallBase *L, const CallBase *R) const override {
-    const auto I1 = Priorities.find(L);
-    const auto I2 = Priorities.find(R);
-    assert(I1 != Priorities.end() && I2 != Priorities.end());
-    return isMoreDesirable(I2->second, I1->second);
-  }
-
   // Update the priority associated with CB.
   void update(const CallBase *CB) override { Priorities[CB] = evaluate(CB); };
 
@@ -234,6 +184,5 @@ class PriorityInlineOrder : public InlineOrder<std::pair<CallBase *, int>> {
   DenseMap<CallBase *, int> InlineHistoryMap;
   std::unique_ptr<InlinePriority> PriorityPtr;
 };
-
 } // namespace llvm
 #endif // LLVM_ANALYSIS_INLINEORDER_H

diff  --git a/llvm/lib/Analysis/CMakeLists.txt b/llvm/lib/Analysis/CMakeLists.txt
index 529b522ac0ad6..e59725c990170 100644
--- a/llvm/lib/Analysis/CMakeLists.txt
+++ b/llvm/lib/Analysis/CMakeLists.txt
@@ -72,7 +72,6 @@ add_llvm_component_library(LLVMAnalysis
   IndirectCallPromotionAnalysis.cpp
   InlineCost.cpp
   InlineAdvisor.cpp
-  InlineOrder.cpp
   InlineSizeEstimatorAnalysis.cpp
   InstCount.cpp
   InstructionPrecedenceTracking.cpp

diff  --git a/llvm/lib/Analysis/InlineOrder.cpp b/llvm/lib/Analysis/InlineOrder.cpp
deleted file mode 100644
index bd9e62a24f880..0000000000000
--- a/llvm/lib/Analysis/InlineOrder.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-//===- InlineOrder.cpp - Inlining order abstraction -*- C++ ---*-----------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/Analysis/InlineOrder.h"
-#include "llvm/Analysis/AssumptionCache.h"
-#include "llvm/Analysis/BlockFrequencyInfo.h"
-#include "llvm/Analysis/GlobalsModRef.h"
-#include "llvm/Analysis/InlineAdvisor.h"
-#include "llvm/Analysis/InlineCost.h"
-#include "llvm/Analysis/OptimizationRemarkEmitter.h"
-#include "llvm/Analysis/ProfileSummaryInfo.h"
-#include "llvm/Analysis/TargetLibraryInfo.h"
-#include "llvm/Analysis/TargetTransformInfo.h"
-
-using namespace llvm;
-
-#define DEBUG_TYPE "inline-order"
-
-static llvm::InlineCost getInlineCostWrapper(CallBase &CB,
-                                             FunctionAnalysisManager &FAM,
-                                             const InlineParams &Params) {
-  Function &Caller = *CB.getCaller();
-  ProfileSummaryInfo *PSI =
-      FAM.getResult<ModuleAnalysisManagerFunctionProxy>(Caller)
-          .getCachedResult<ProfileSummaryAnalysis>(
-              *CB.getParent()->getParent()->getParent());
-
-  auto &ORE = FAM.getResult<OptimizationRemarkEmitterAnalysis>(Caller);
-  auto GetAssumptionCache = [&](Function &F) -> AssumptionCache & {
-    return FAM.getResult<AssumptionAnalysis>(F);
-  };
-  auto GetBFI = [&](Function &F) -> BlockFrequencyInfo & {
-    return FAM.getResult<BlockFrequencyAnalysis>(F);
-  };
-  auto GetTLI = [&](Function &F) -> const TargetLibraryInfo & {
-    return FAM.getResult<TargetLibraryAnalysis>(F);
-  };
-
-  Function &Callee = *CB.getCalledFunction();
-  auto &CalleeTTI = FAM.getResult<TargetIRAnalysis>(Callee);
-  bool RemarksEnabled =
-      Callee.getContext().getDiagHandlerPtr()->isMissedOptRemarkEnabled(
-          DEBUG_TYPE);
-  return getInlineCost(CB, Params, CalleeTTI, GetAssumptionCache, GetTLI,
-                       GetBFI, PSI, RemarksEnabled ? &ORE : nullptr);
-}
-
-std::unique_ptr<InlineOrder<std::pair<CallBase *, int>>>
-llvm::getInlineOrder(InlinePriorityMode UseInlinePriority,
-                     FunctionAnalysisManager &FAM, const InlineParams &Params) {
-  switch (UseInlinePriority) {
-  case InlinePriorityMode::NoPriority:
-    return std::make_unique<DefaultInlineOrder<std::pair<CallBase *, int>>>();
-
-  case InlinePriorityMode::Size:
-    LLVM_DEBUG(dbgs() << "    Current used priority: Size priority ---- \n");
-    return std::make_unique<PriorityInlineOrder>(
-        std::make_unique<SizePriority>());
-
-  case InlinePriorityMode::Cost:
-    LLVM_DEBUG(dbgs() << "    Current used priority: Cost priority ---- \n");
-    return std::make_unique<PriorityInlineOrder>(
-        std::make_unique<CostPriority>([&](const CallBase *CB) -> InlineCost {
-          return getInlineCostWrapper(const_cast<CallBase &>(*CB), FAM, Params);
-        }));
-
-  default:
-    assert("Unsupported Inline Priority Mode");
-    break;
-  }
-  return nullptr;
-}

diff  --git a/llvm/lib/Transforms/IPO/ModuleInliner.cpp b/llvm/lib/Transforms/IPO/ModuleInliner.cpp
index b16ab6d46d376..1437150065120 100644
--- a/llvm/lib/Transforms/IPO/ModuleInliner.cpp
+++ b/llvm/lib/Transforms/IPO/ModuleInliner.cpp
@@ -49,15 +49,9 @@ using namespace llvm;
 STATISTIC(NumInlined, "Number of functions inlined");
 STATISTIC(NumDeleted, "Number of functions deleted because all callers found");
 
-static cl::opt<InlinePriorityMode> UseInlinePriority(
-    "inline-priority-mode", cl::init(InlinePriorityMode::Size), cl::Hidden,
-    cl::desc("Choose the priority mode to use in module inline"),
-    cl::values(clEnumValN(InlinePriorityMode::NoPriority, "no priority",
-                          "Use no priority, visit callsites in bottom-up."),
-               clEnumValN(InlinePriorityMode::Size, "size",
-                          "Use callee size priority."),
-               clEnumValN(InlinePriorityMode::Cost, "cost",
-                          "Use inline cost priority.")));
+static cl::opt<bool> InlineEnablePriorityOrder(
+    "module-inline-enable-priority-order", cl::Hidden, cl::init(true),
+    cl::desc("Enable the priority inline order for the module inliner"));
 
 /// Return true if the specified inline history ID
 /// indicates an inline history that includes the specified function.
@@ -151,7 +145,12 @@ PreservedAnalyses ModuleInlinerPass::run(Module &M,
   //
   // TODO: Here is a huge amount duplicate code between the module inliner and
   // the SCC inliner, which need some refactoring.
-  auto Calls = getInlineOrder(UseInlinePriority, FAM, Params);
+  std::unique_ptr<InlineOrder<std::pair<CallBase *, int>>> Calls;
+  if (InlineEnablePriorityOrder)
+    Calls = std::make_unique<PriorityInlineOrder>(
+              std::make_unique<SizePriority>());
+  else
+    Calls = std::make_unique<DefaultInlineOrder<std::pair<CallBase *, int>>>();
   assert(Calls != nullptr && "Expected an initialized InlineOrder");
 
   // Populate the initial list of calls in this module.


        


More information about the llvm-commits mailing list