//===- ReplayInlineAdvisor.h - Replay Inline Advisor interface -*- 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 // //===----------------------------------------------------------------------===// // #ifndef LLVM_ANALYSIS_REPLAYINLINEADVISOR_H #define LLVM_ANALYSIS_REPLAYINLINEADVISOR_H #include "llvm/ADT/StringSet.h" #include "llvm/Analysis/InlineAdvisor.h" namespace llvm { class CallBase; class Function; class LLVMContext; class Module; struct CallSiteFormat { enum class Format : int { Line, LineColumn, LineDiscriminator, LineColumnDiscriminator }; bool outputColumn() const { return OutputFormat == Format::LineColumn || OutputFormat == Format::LineColumnDiscriminator; } bool outputDiscriminator() const { return OutputFormat == Format::LineDiscriminator || OutputFormat == Format::LineColumnDiscriminator; } Format OutputFormat; }; /// Replay Inliner Setup struct ReplayInlinerSettings { enum class Scope : int { Function, Module }; enum class Fallback : int { Original, AlwaysInline, NeverInline }; StringRef ReplayFile; Scope ReplayScope; Fallback ReplayFallback; CallSiteFormat ReplayFormat; }; /// Get call site location as a string with the given format std::string formatCallSiteLocation(DebugLoc DLoc, const CallSiteFormat &Format); std::unique_ptr getReplayInlineAdvisor(Module &M, FunctionAnalysisManager &FAM, LLVMContext &Context, std::unique_ptr OriginalAdvisor, const ReplayInlinerSettings &ReplaySettings, bool EmitRemarks, InlineContext IC); /// Replay inline advisor that uses optimization remarks from inlining of /// previous build to guide current inlining. This is useful for inliner tuning. class ReplayInlineAdvisor : public InlineAdvisor { public: ReplayInlineAdvisor(Module &M, FunctionAnalysisManager &FAM, LLVMContext &Context, std::unique_ptr OriginalAdvisor, const ReplayInlinerSettings &ReplaySettings, bool EmitRemarks, InlineContext IC); std::unique_ptr getAdviceImpl(CallBase &CB) override; bool areReplayRemarksLoaded() const { return HasReplayRemarks; } private: bool hasInlineAdvice(Function &F) const { return (ReplaySettings.ReplayScope == ReplayInlinerSettings::Scope::Module) || CallersToReplay.contains(F.getName()); } std::unique_ptr OriginalAdvisor; bool HasReplayRemarks = false; const ReplayInlinerSettings ReplaySettings; bool EmitRemarks = false; StringMap InlineSitesFromRemarks; StringSet<> CallersToReplay; }; } // namespace llvm #endif // LLVM_ANALYSIS_REPLAYINLINEADVISOR_H