Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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
 
29
  bool outputColumn() const {
30
    return OutputFormat == Format::LineColumn ||
31
           OutputFormat == Format::LineColumnDiscriminator;
32
  }
33
 
34
  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;
73
  bool areReplayRemarksLoaded() const { return HasReplayRemarks; }
74
 
75
private:
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