Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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
  91.