Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

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

  1. //===- Transforms/Instrumentation/PGOInstrumentation.h ----------*- 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. /// \file
  10. /// This file provides the interface for IR based instrumentation passes (
  11. /// (profile-gen, and profile-use).
  12. //
  13. //===----------------------------------------------------------------------===//
  14.  
  15. #ifndef LLVM_TRANSFORMS_INSTRUMENTATION_PGOINSTRUMENTATION_H
  16. #define LLVM_TRANSFORMS_INSTRUMENTATION_PGOINSTRUMENTATION_H
  17.  
  18. #include "llvm/ADT/ArrayRef.h"
  19. #include "llvm/IR/PassManager.h"
  20. #include <cstdint>
  21. #include <string>
  22.  
  23. namespace llvm {
  24.  
  25. class Function;
  26. class Instruction;
  27. class Module;
  28.  
  29. /// The instrumentation (profile-instr-gen) pass for IR based PGO.
  30. // We use this pass to create COMDAT profile variables for context
  31. // sensitive PGO (CSPGO). The reason to have a pass for this is CSPGO
  32. // can be run after LTO/ThinLTO linking. Lld linker needs to see
  33. // all the COMDAT variables before linking. So we have this pass
  34. // always run before linking for CSPGO.
  35. class PGOInstrumentationGenCreateVar
  36.     : public PassInfoMixin<PGOInstrumentationGenCreateVar> {
  37. public:
  38.   PGOInstrumentationGenCreateVar(std::string CSInstrName = "")
  39.       : CSInstrName(CSInstrName) {}
  40.   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
  41.  
  42. private:
  43.   std::string CSInstrName;
  44. };
  45.  
  46. /// The instrumentation (profile-instr-gen) pass for IR based PGO.
  47. class PGOInstrumentationGen : public PassInfoMixin<PGOInstrumentationGen> {
  48. public:
  49.   PGOInstrumentationGen(bool IsCS = false) : IsCS(IsCS) {}
  50.   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
  51.  
  52. private:
  53.   // If this is a context sensitive instrumentation.
  54.   bool IsCS;
  55. };
  56.  
  57. /// The profile annotation (profile-instr-use) pass for IR based PGO.
  58. class PGOInstrumentationUse : public PassInfoMixin<PGOInstrumentationUse> {
  59. public:
  60.   PGOInstrumentationUse(std::string Filename = "",
  61.                         std::string RemappingFilename = "", bool IsCS = false);
  62.  
  63.   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
  64.  
  65. private:
  66.   std::string ProfileFileName;
  67.   std::string ProfileRemappingFileName;
  68.   // If this is a context sensitive instrumentation.
  69.   bool IsCS;
  70. };
  71.  
  72. /// The indirect function call promotion pass.
  73. class PGOIndirectCallPromotion : public PassInfoMixin<PGOIndirectCallPromotion> {
  74. public:
  75.   PGOIndirectCallPromotion(bool IsInLTO = false, bool SamplePGO = false)
  76.       : InLTO(IsInLTO), SamplePGO(SamplePGO) {}
  77.  
  78.   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
  79.  
  80. private:
  81.   bool InLTO;
  82.   bool SamplePGO;
  83. };
  84.  
  85. /// The profile size based optimization pass for memory intrinsics.
  86. class PGOMemOPSizeOpt : public PassInfoMixin<PGOMemOPSizeOpt> {
  87. public:
  88.   PGOMemOPSizeOpt() = default;
  89.  
  90.   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
  91. };
  92.  
  93. void setProfMetadata(Module *M, Instruction *TI, ArrayRef<uint64_t> EdgeCounts,
  94.                      uint64_t MaxCount);
  95.  
  96. void setIrrLoopHeaderMetadata(Module *M, Instruction *TI, uint64_t Count);
  97.  
  98. } // end namespace llvm
  99.  
  100. #endif // LLVM_TRANSFORMS_INSTRUMENTATION_PGOINSTRUMENTATION_H
  101.