[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