diff options
Diffstat (limited to 'include/llvm/Analysis/OptimizationDiagnosticInfo.h')
| -rw-r--r-- | include/llvm/Analysis/OptimizationDiagnosticInfo.h | 104 | 
1 files changed, 104 insertions, 0 deletions
| diff --git a/include/llvm/Analysis/OptimizationDiagnosticInfo.h b/include/llvm/Analysis/OptimizationDiagnosticInfo.h new file mode 100644 index 000000000000..b455a6527bf6 --- /dev/null +++ b/include/llvm/Analysis/OptimizationDiagnosticInfo.h @@ -0,0 +1,104 @@ +//===- OptimizationDiagnosticInfo.h - Optimization Diagnostic ---*- C++ -*-===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Optimization diagnostic interfaces.  It's packaged as an analysis pass so +// that by using this service passes become dependent on BFI as well.  BFI is +// used to compute the "hotness" of the diagnostic message. +//===----------------------------------------------------------------------===// + +#ifndef LLVM_IR_OPTIMIZATIONDIAGNOSTICINFO_H +#define LLVM_IR_OPTIMIZATIONDIAGNOSTICINFO_H + +#include "llvm/ADT/Optional.h" +#include "llvm/IR/PassManager.h" +#include "llvm/Pass.h" + +namespace llvm { +class BlockFrequencyInfo; +class DebugLoc; +class Function; +class LLVMContext; +class Loop; +class Pass; +class Twine; +class Value; + +class OptimizationRemarkEmitter { +public: +  OptimizationRemarkEmitter(Function *F, BlockFrequencyInfo *BFI) +      : F(F), BFI(BFI) {} + +  OptimizationRemarkEmitter(OptimizationRemarkEmitter &&Arg) +      : F(Arg.F), BFI(Arg.BFI) {} + +  OptimizationRemarkEmitter &operator=(OptimizationRemarkEmitter &&RHS) { +    F = RHS.F; +    BFI = RHS.BFI; +    return *this; +  } + +  /// Emit an optimization-missed message. +  /// +  /// \p PassName is the name of the pass emitting the message. If +  /// -Rpass-missed= is given and the name matches the regular expression in +  /// -Rpass, then the remark will be emitted. \p Fn is the function triggering +  /// the remark, \p DLoc is the debug location where the diagnostic is +  /// generated. \p V is the IR Value that identifies the code region. \p Msg is +  /// the message string to use. +  void emitOptimizationRemarkMissed(const char *PassName, const DebugLoc &DLoc, +                                    Value *V, const Twine &Msg); + +  /// \brief Same as above but derives the IR Value for the code region and the +  /// debug location from the Loop parameter \p L. +  void emitOptimizationRemarkMissed(const char *PassName, Loop *L, +                                    const Twine &Msg); + +private: +  Function *F; + +  BlockFrequencyInfo *BFI; + +  Optional<uint64_t> computeHotness(Value *V); + +  OptimizationRemarkEmitter(const OptimizationRemarkEmitter &) = delete; +  void operator=(const OptimizationRemarkEmitter &) = delete; +}; + +class OptimizationRemarkEmitterWrapperPass : public FunctionPass { +  std::unique_ptr<OptimizationRemarkEmitter> ORE; + +public: +  OptimizationRemarkEmitterWrapperPass(); + +  bool runOnFunction(Function &F) override; + +  void getAnalysisUsage(AnalysisUsage &AU) const override; + +  OptimizationRemarkEmitter &getORE() { +    assert(ORE && "pass not run yet"); +    return *ORE; +  } + +  static char ID; +}; + +class OptimizationRemarkEmitterAnalysis +    : public AnalysisInfoMixin<OptimizationRemarkEmitterAnalysis> { +  friend AnalysisInfoMixin<OptimizationRemarkEmitterAnalysis>; +  static char PassID; + +public: +  /// \brief Provide the result typedef for this analysis pass. +  typedef OptimizationRemarkEmitter Result; + +  /// \brief Run the analysis pass over a function and produce BFI. +  Result run(Function &F, AnalysisManager<Function> &AM); +}; +} +#endif // LLVM_IR_OPTIMIZATIONDIAGNOSTICINFO_H | 
