xref: /llvm-project/llvm/include/llvm/Analysis/ReplayInlineAdvisor.h (revision 0da2ba811ac8a01509bc533428941fb9519c0715)
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 LLVMContext;
18 class Module;
19 
20 struct CallSiteFormat {
21   enum class Format : int {
22     Line,
23     LineColumn,
24     LineDiscriminator,
25     LineColumnDiscriminator
26   };
27 
28   bool outputColumn() const {
29     return OutputFormat == Format::LineColumn ||
30            OutputFormat == Format::LineColumnDiscriminator;
31   }
32 
33   bool outputDiscriminator() const {
34     return OutputFormat == Format::LineDiscriminator ||
35            OutputFormat == Format::LineColumnDiscriminator;
36   }
37 
38   Format OutputFormat;
39 };
40 
41 /// Replay Inliner Setup
42 struct ReplayInlinerSettings {
43   enum class Scope : int { Function, Module };
44   enum class Fallback : int { Original, AlwaysInline, NeverInline };
45 
46   StringRef ReplayFile;
47   Scope ReplayScope;
48   Fallback ReplayFallback;
49   CallSiteFormat ReplayFormat;
50 };
51 
52 /// Get call site location as a string with the given format
53 std::string formatCallSiteLocation(DebugLoc DLoc, const CallSiteFormat &Format);
54 
55 std::unique_ptr<InlineAdvisor>
56 getReplayInlineAdvisor(Module &M, FunctionAnalysisManager &FAM,
57                        LLVMContext &Context,
58                        std::unique_ptr<InlineAdvisor> OriginalAdvisor,
59                        const ReplayInlinerSettings &ReplaySettings,
60                        bool EmitRemarks, InlineContext IC);
61 
62 /// Replay inline advisor that uses optimization remarks from inlining of
63 /// previous build to guide current inlining. This is useful for inliner tuning.
64 class ReplayInlineAdvisor : public InlineAdvisor {
65 public:
66   ReplayInlineAdvisor(Module &M, FunctionAnalysisManager &FAM,
67                       LLVMContext &Context,
68                       std::unique_ptr<InlineAdvisor> OriginalAdvisor,
69                       const ReplayInlinerSettings &ReplaySettings,
70                       bool EmitRemarks, InlineContext IC);
71   std::unique_ptr<InlineAdvice> getAdviceImpl(CallBase &CB) override;
72   bool areReplayRemarksLoaded() const { return HasReplayRemarks; }
73 
74 private:
75   bool hasInlineAdvice(Function &F) const {
76     return (ReplaySettings.ReplayScope ==
77             ReplayInlinerSettings::Scope::Module) ||
78            CallersToReplay.contains(F.getName());
79   }
80   std::unique_ptr<InlineAdvisor> OriginalAdvisor;
81   bool HasReplayRemarks = false;
82   const ReplayInlinerSettings ReplaySettings;
83   bool EmitRemarks = false;
84 
85   StringMap<bool> InlineSitesFromRemarks;
86   StringSet<> CallersToReplay;
87 };
88 } // namespace llvm
89 #endif // LLVM_ANALYSIS_REPLAYINLINEADVISOR_H
90