1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
/*========================== begin_copyright_notice ============================
Copyright (C) 2025 Intel Corporation
SPDX-License-Identifier: MIT
============================= end_copyright_notice ===========================*/
#include "common/LLVMWarningsPush.hpp"
#include "llvmWrapper/Transforms/IPO/InlineSimple.h"
#include "llvmWrapper/Transforms/IPO/InlineHelper.h"
#include "llvm/Analysis/CGSCCPassManager.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/PostDominators.h"
#include "llvm/Analysis/ProfileSummaryInfo.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/Analysis/InlineCost.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/Analysis/BasicAliasAnalysis.h"
#include "llvm/Transforms/IPO.h"
#include "llvmWrapper/Transforms/IPO/SCCP.h"
#include "llvmWrapper/Transforms/InitializePasses.h"
#include "common/LLVMWarningsPop.hpp"
#include "Compiler/IGCPassSupport.h"
using namespace llvm;
#define DEBUG_TYPE "inline"
namespace IGCLLVM {
SimpleInlinerLegacyPassWrapper::SimpleInlinerLegacyPassWrapper()
: CallGraphSCCPass(ID), Params(llvm::getInlineParams()) {
initializeSimpleInlinerLegacyPassWrapperPass(*PassRegistry::getPassRegistry());
PB.registerLoopAnalyses(LAM);
PB.registerFunctionAnalyses(FAM);
PB.registerCGSCCAnalyses(CGAM);
PB.registerModuleAnalyses(MAM);
PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
}
SimpleInlinerLegacyPassWrapper::SimpleInlinerLegacyPassWrapper(InlineParams Params)
: CallGraphSCCPass(ID), Params(std::move(Params)) {
initializeSimpleInlinerLegacyPassWrapperPass(*PassRegistry::getPassRegistry());
PB.registerLoopAnalyses(LAM);
PB.registerFunctionAnalyses(FAM);
PB.registerCGSCCAnalyses(CGAM);
PB.registerModuleAnalyses(MAM);
PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
}
bool SimpleInlinerLegacyPassWrapper::runOnSCC(CallGraphSCC &SCC) {
TTIWP = &getAnalysis<TargetTransformInfoWrapperPass>();
if (skipSCC(SCC))
return false;
bool changed = inlineCalls(SCC);
return changed;
}
InlineCost SimpleInlinerLegacyPassWrapper::getInlineCost(CallBase &CB) {
Function *Callee = CB.getCalledFunction();
TargetTransformInfo &TTI = TTIWP->getTTI(*Callee);
bool RemarksEnabled = false;
const auto &BBs = *CB.getCaller();
if (!BBs.empty()) {
auto DI = OptimizationRemark(DEBUG_TYPE, "", DebugLoc(), &BBs.front());
if (DI.isEnabled())
RemarksEnabled = true;
}
OptimizationRemarkEmitter ORE(CB.getCaller());
std::function<AssumptionCache &(Function &)> GetAssumptionCache = [&](Function &F) -> AssumptionCache & {
return ACT->getAssumptionCache(F);
};
return llvm::getInlineCost(CB, Params, TTI, GetAssumptionCache, GetTLI,
/*GetBFI=*/nullptr, PSI, RemarksEnabled ? &ORE : nullptr);
}
bool SimpleInlinerLegacyPassWrapper::inlineCalls(CallGraphSCC &SCC) {
CallGraph &CG = getAnalysis<CallGraphWrapperPass>().getCallGraph();
ACT = &getAnalysis<AssumptionCacheTracker>();
PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
GetTLI = [&](Function &F) -> const TargetLibraryInfo & {
return getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
};
auto GetAssumptionCache = [&](Function &F) -> AssumptionCache & { return ACT->getAssumptionCache(F); };
return IGCLLVM::inlineCallsImpl(
SCC, CG, GetAssumptionCache, PSI, GetTLI, InsertLifetime, [&](CallBase &CB) { return getInlineCost(CB); },
IGCLLVM::LegacyAARGetter(*this), ImportedFunctionsStats);
}
void SimpleInlinerLegacyPassWrapper::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<TargetTransformInfoWrapperPass>();
AU.addRequired<AssumptionCacheTracker>();
AU.addRequired<ProfileSummaryInfoWrapperPass>();
AU.addRequired<TargetLibraryInfoWrapperPass>();
AU.addUsedIfAvailable<ScopedNoAliasAAWrapperPass>();
AU.addUsedIfAvailable<TypeBasedAAWrapperPass>();
AU.addUsedIfAvailable<GlobalsAAWrapperPass>();
AU.addUsedIfAvailable<ExternalAAWrapperPass>();
CallGraphSCCPass::getAnalysisUsage(AU);
}
char SimpleInlinerLegacyPassWrapper::ID = 0;
Pass *createLegacyWrappedSimpleInlinerPass() {
#if LLVM_VERSION_MAJOR >= 16
return new SimpleInlinerLegacyPassWrapper();
#else
return llvm::createFunctionInliningPass();
#endif
}
Pass *createLegacyWrappedSimpleInlinerPass(int Threshold) {
#if LLVM_VERSION_MAJOR >= 16
return new SimpleInlinerLegacyPassWrapper(llvm::getInlineParams(Threshold));
#else
return llvm::createFunctionInliningPass(Threshold);
#endif
}
Pass *createLegacyWrappedSimpleInlinerPass(unsigned OptLevel, unsigned SizeOptLevel, bool DisableInlineHotCallSite) {
#if LLVM_VERSION_MAJOR >= 16
auto Param = llvm::getInlineParams(OptLevel, SizeOptLevel);
if (DisableInlineHotCallSite)
Param.HotCallSiteThreshold = 0;
return new SimpleInlinerLegacyPassWrapper(Param);
#else
return llvm::createFunctionInliningPass(OptLevel, SizeOptLevel, DisableInlineHotCallSite);
#endif
}
} // namespace IGCLLVM
using namespace IGCLLVM;
#define PASS_FLAG "inline-legacy-wrapped"
#define PASS_DESCRIPTION "Function Integration/Inlining LPM Wrapped"
#define PASS_CFG_ONLY false
#define PASS_ANALYSIS false
IGC_INITIALIZE_PASS_BEGIN(SimpleInlinerLegacyPassWrapper, PASS_FLAG, PASS_DESCRIPTION, PASS_CFG_ONLY, PASS_ANALYSIS)
IGC_INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)
IGC_INITIALIZE_PASS_DEPENDENCY(CallGraphWrapperPass)
IGC_INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
IGC_INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)
IGC_INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
IGC_INITIALIZE_PASS_END(SimpleInlinerLegacyPassWrapper, PASS_FLAG, PASS_DESCRIPTION, PASS_CFG_ONLY, PASS_ANALYSIS)
|