1 //===- ReplayInlineAdvisor.h - Replay Inline Advisor interface -*- C++ --*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 #ifndef LLVM_ANALYSIS_REPLAYINLINEADVISOR_H 10 #define LLVM_ANALYSIS_REPLAYINLINEADVISOR_H 11 12 #include "llvm/ADT/StringSet.h" 13 #include "llvm/Analysis/InlineAdvisor.h" 14 15 namespace llvm { 16 class CallBase; 17 class Function; 18 class LLVMContext; 19 class Module; 20 21 struct CallSiteFormat { 22 enum class Format : int { 23 Line, 24 LineColumn, 25 LineDiscriminator, 26 LineColumnDiscriminator 27 }; 28 outputColumnCallSiteFormat29 bool outputColumn() const { 30 return OutputFormat == Format::LineColumn || 31 OutputFormat == Format::LineColumnDiscriminator; 32 } 33 outputDiscriminatorCallSiteFormat34 bool outputDiscriminator() const { 35 return OutputFormat == Format::LineDiscriminator || 36 OutputFormat == Format::LineColumnDiscriminator; 37 } 38 39 Format OutputFormat; 40 }; 41 42 /// Replay Inliner Setup 43 struct ReplayInlinerSettings { 44 enum class Scope : int { Function, Module }; 45 enum class Fallback : int { Original, AlwaysInline, NeverInline }; 46 47 StringRef ReplayFile; 48 Scope ReplayScope; 49 Fallback ReplayFallback; 50 CallSiteFormat ReplayFormat; 51 }; 52 53 /// Get call site location as a string with the given format 54 std::string formatCallSiteLocation(DebugLoc DLoc, const CallSiteFormat &Format); 55 56 std::unique_ptr<InlineAdvisor> 57 getReplayInlineAdvisor(Module &M, FunctionAnalysisManager &FAM, 58 LLVMContext &Context, 59 std::unique_ptr<InlineAdvisor> OriginalAdvisor, 60 const ReplayInlinerSettings &ReplaySettings, 61 bool EmitRemarks, InlineContext IC); 62 63 /// Replay inline advisor that uses optimization remarks from inlining of 64 /// previous build to guide current inlining. This is useful for inliner tuning. 65 class ReplayInlineAdvisor : public InlineAdvisor { 66 public: 67 ReplayInlineAdvisor(Module &M, FunctionAnalysisManager &FAM, 68 LLVMContext &Context, 69 std::unique_ptr<InlineAdvisor> OriginalAdvisor, 70 const ReplayInlinerSettings &ReplaySettings, 71 bool EmitRemarks, InlineContext IC); 72 std::unique_ptr<InlineAdvice> getAdviceImpl(CallBase &CB) override; areReplayRemarksLoaded()73 bool areReplayRemarksLoaded() const { return HasReplayRemarks; } 74 75 private: hasInlineAdvice(Function & F)76 bool hasInlineAdvice(Function &F) const { 77 return (ReplaySettings.ReplayScope == 78 ReplayInlinerSettings::Scope::Module) || 79 CallersToReplay.contains(F.getName()); 80 } 81 std::unique_ptr<InlineAdvisor> OriginalAdvisor; 82 bool HasReplayRemarks = false; 83 const ReplayInlinerSettings ReplaySettings; 84 bool EmitRemarks = false; 85 86 StringMap<bool> InlineSitesFromRemarks; 87 StringSet<> CallersToReplay; 88 }; 89 } // namespace llvm 90 #endif // LLVM_ANALYSIS_REPLAYINLINEADVISOR_H 91