diff options
author | orivej <orivej@yandex-team.ru> | 2022-02-10 16:45:01 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:45:01 +0300 |
commit | 2d37894b1b037cf24231090eda8589bbb44fb6fc (patch) | |
tree | be835aa92c6248212e705f25388ebafcf84bc7a1 /contrib/libs/llvm12/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h | |
parent | 718c552901d703c502ccbefdfc3c9028d608b947 (diff) | |
download | ydb-2d37894b1b037cf24231090eda8589bbb44fb6fc.tar.gz |
Restoring authorship annotation for <orivej@yandex-team.ru>. Commit 2 of 2.
Diffstat (limited to 'contrib/libs/llvm12/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h')
-rw-r--r-- | contrib/libs/llvm12/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h | 484 |
1 files changed, 242 insertions, 242 deletions
diff --git a/contrib/libs/llvm12/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h b/contrib/libs/llvm12/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h index fcb5d057d8..b7fd766f74 100644 --- a/contrib/libs/llvm12/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h +++ b/contrib/libs/llvm12/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h @@ -1,242 +1,242 @@ -#pragma once - -#ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-parameter" -#endif - -///===- MachineOptimizationRemarkEmitter.h - Opt Diagnostics -*- C++ -*----===// -/// -/// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -/// See https://llvm.org/LICENSE.txt for license information. -/// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -/// -///===---------------------------------------------------------------------===// -/// \file -/// Optimization diagnostic interfaces for machine passes. It's packaged as an -/// analysis pass so that by using this service passes become dependent on MBFI -/// as well. MBFI is used to compute the "hotness" of the diagnostic message. -/// -///===---------------------------------------------------------------------===// - -#ifndef LLVM_CODEGEN_MACHINEOPTIMIZATIONREMARKEMITTER_H -#define LLVM_CODEGEN_MACHINEOPTIMIZATIONREMARKEMITTER_H - -#include "llvm/Analysis/OptimizationRemarkEmitter.h" -#include "llvm/CodeGen/MachineFunctionPass.h" - -namespace llvm { -class MachineBasicBlock; -class MachineBlockFrequencyInfo; -class MachineInstr; - -/// Common features for diagnostics dealing with optimization remarks -/// that are used by machine passes. -class DiagnosticInfoMIROptimization : public DiagnosticInfoOptimizationBase { -public: - DiagnosticInfoMIROptimization(enum DiagnosticKind Kind, const char *PassName, - StringRef RemarkName, - const DiagnosticLocation &Loc, - const MachineBasicBlock *MBB) - : DiagnosticInfoOptimizationBase(Kind, DS_Remark, PassName, RemarkName, - MBB->getParent()->getFunction(), Loc), - MBB(MBB) {} - - /// MI-specific kinds of diagnostic Arguments. - struct MachineArgument : public DiagnosticInfoOptimizationBase::Argument { - /// Print an entire MachineInstr. - MachineArgument(StringRef Key, const MachineInstr &MI); - }; - - static bool classof(const DiagnosticInfo *DI) { - return DI->getKind() >= DK_FirstMachineRemark && - DI->getKind() <= DK_LastMachineRemark; - } - - const MachineBasicBlock *getBlock() const { return MBB; } - -private: - const MachineBasicBlock *MBB; -}; - -/// Diagnostic information for applied optimization remarks. -class MachineOptimizationRemark : public DiagnosticInfoMIROptimization { -public: - /// \p PassName is the name of the pass emitting this diagnostic. If this name - /// matches the regular expression given in -Rpass=, then the diagnostic will - /// be emitted. \p RemarkName is a textual identifier for the remark. \p - /// Loc is the debug location and \p MBB is the block that the optimization - /// operates in. - MachineOptimizationRemark(const char *PassName, StringRef RemarkName, - const DiagnosticLocation &Loc, - const MachineBasicBlock *MBB) - : DiagnosticInfoMIROptimization(DK_MachineOptimizationRemark, PassName, - RemarkName, Loc, MBB) {} - - static bool classof(const DiagnosticInfo *DI) { - return DI->getKind() == DK_MachineOptimizationRemark; - } - - /// \see DiagnosticInfoOptimizationBase::isEnabled. - bool isEnabled() const override { - const Function &Fn = getFunction(); - LLVMContext &Ctx = Fn.getContext(); - return Ctx.getDiagHandlerPtr()->isPassedOptRemarkEnabled(getPassName()); - } -}; - -/// Diagnostic information for missed-optimization remarks. -class MachineOptimizationRemarkMissed : public DiagnosticInfoMIROptimization { -public: - /// \p PassName is the name of the pass emitting this diagnostic. If this name - /// matches the regular expression given in -Rpass-missed=, then the - /// diagnostic will be emitted. \p RemarkName is a textual identifier for the - /// remark. \p Loc is the debug location and \p MBB is the block that the - /// optimization operates in. - MachineOptimizationRemarkMissed(const char *PassName, StringRef RemarkName, - const DiagnosticLocation &Loc, - const MachineBasicBlock *MBB) - : DiagnosticInfoMIROptimization(DK_MachineOptimizationRemarkMissed, - PassName, RemarkName, Loc, MBB) {} - - static bool classof(const DiagnosticInfo *DI) { - return DI->getKind() == DK_MachineOptimizationRemarkMissed; - } - - /// \see DiagnosticInfoOptimizationBase::isEnabled. - bool isEnabled() const override { - const Function &Fn = getFunction(); - LLVMContext &Ctx = Fn.getContext(); - return Ctx.getDiagHandlerPtr()->isMissedOptRemarkEnabled(getPassName()); - } -}; - -/// Diagnostic information for optimization analysis remarks. -class MachineOptimizationRemarkAnalysis : public DiagnosticInfoMIROptimization { -public: - /// \p PassName is the name of the pass emitting this diagnostic. If this name - /// matches the regular expression given in -Rpass-analysis=, then the - /// diagnostic will be emitted. \p RemarkName is a textual identifier for the - /// remark. \p Loc is the debug location and \p MBB is the block that the - /// optimization operates in. - MachineOptimizationRemarkAnalysis(const char *PassName, StringRef RemarkName, - const DiagnosticLocation &Loc, - const MachineBasicBlock *MBB) - : DiagnosticInfoMIROptimization(DK_MachineOptimizationRemarkAnalysis, - PassName, RemarkName, Loc, MBB) {} - - static bool classof(const DiagnosticInfo *DI) { - return DI->getKind() == DK_MachineOptimizationRemarkAnalysis; - } - - /// \see DiagnosticInfoOptimizationBase::isEnabled. - bool isEnabled() const override { - const Function &Fn = getFunction(); - LLVMContext &Ctx = Fn.getContext(); - return Ctx.getDiagHandlerPtr()->isAnalysisRemarkEnabled(getPassName()); - } -}; - -/// Extend llvm::ore:: with MI-specific helper names. -namespace ore { -using MNV = DiagnosticInfoMIROptimization::MachineArgument; -} - -/// The optimization diagnostic interface. -/// -/// It allows reporting when optimizations are performed and when they are not -/// along with the reasons for it. Hotness information of the corresponding -/// code region can be included in the remark if DiagnosticsHotnessRequested is -/// enabled in the LLVM context. -class MachineOptimizationRemarkEmitter { -public: - MachineOptimizationRemarkEmitter(MachineFunction &MF, - MachineBlockFrequencyInfo *MBFI) - : MF(MF), MBFI(MBFI) {} - - /// Emit an optimization remark. - void emit(DiagnosticInfoOptimizationBase &OptDiag); - - /// Whether we allow for extra compile-time budget to perform more - /// analysis to be more informative. - /// - /// This is useful to enable additional missed optimizations to be reported - /// that are normally too noisy. In this mode, we can use the extra analysis - /// (1) to filter trivial false positives or (2) to provide more context so - /// that non-trivial false positives can be quickly detected by the user. - bool allowExtraAnalysis(StringRef PassName) const { - return ( - MF.getFunction().getContext().getLLVMRemarkStreamer() || - MF.getFunction().getContext().getDiagHandlerPtr()->isAnyRemarkEnabled( - PassName)); - } - - /// Take a lambda that returns a remark which will be emitted. Second - /// argument is only used to restrict this to functions. - template <typename T> - void emit(T RemarkBuilder, decltype(RemarkBuilder()) * = nullptr) { - // Avoid building the remark unless we know there are at least *some* - // remarks enabled. We can't currently check whether remarks are requested - // for the calling pass since that requires actually building the remark. - - if (MF.getFunction().getContext().getLLVMRemarkStreamer() || - MF.getFunction() - .getContext() - .getDiagHandlerPtr() - ->isAnyRemarkEnabled()) { - auto R = RemarkBuilder(); - emit((DiagnosticInfoOptimizationBase &)R); - } - } - - MachineBlockFrequencyInfo *getBFI() { - return MBFI; - } - -private: - MachineFunction &MF; - - /// MBFI is only set if hotness is requested. - MachineBlockFrequencyInfo *MBFI; - - /// Compute hotness from IR value (currently assumed to be a block) if PGO is - /// available. - Optional<uint64_t> computeHotness(const MachineBasicBlock &MBB); - - /// Similar but use value from \p OptDiag and update hotness there. - void computeHotness(DiagnosticInfoMIROptimization &Remark); - - /// Only allow verbose messages if we know we're filtering by hotness - /// (BFI is only set in this case). - bool shouldEmitVerbose() { return MBFI != nullptr; } -}; - -/// The analysis pass -/// -/// Note that this pass shouldn't generally be marked as preserved by other -/// passes. It's holding onto BFI, so if the pass does not preserve BFI, BFI -/// could be freed. -class MachineOptimizationRemarkEmitterPass : public MachineFunctionPass { - std::unique_ptr<MachineOptimizationRemarkEmitter> ORE; - -public: - MachineOptimizationRemarkEmitterPass(); - - bool runOnMachineFunction(MachineFunction &MF) override; - - void getAnalysisUsage(AnalysisUsage &AU) const override; - - MachineOptimizationRemarkEmitter &getORE() { - assert(ORE && "pass not run yet"); - return *ORE; - } - - static char ID; -}; -} - -#endif - -#ifdef __GNUC__ -#pragma GCC diagnostic pop -#endif +#pragma once + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-parameter" +#endif + +///===- MachineOptimizationRemarkEmitter.h - Opt Diagnostics -*- C++ -*----===// +/// +/// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +/// See https://llvm.org/LICENSE.txt for license information. +/// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +/// +///===---------------------------------------------------------------------===// +/// \file +/// Optimization diagnostic interfaces for machine passes. It's packaged as an +/// analysis pass so that by using this service passes become dependent on MBFI +/// as well. MBFI is used to compute the "hotness" of the diagnostic message. +/// +///===---------------------------------------------------------------------===// + +#ifndef LLVM_CODEGEN_MACHINEOPTIMIZATIONREMARKEMITTER_H +#define LLVM_CODEGEN_MACHINEOPTIMIZATIONREMARKEMITTER_H + +#include "llvm/Analysis/OptimizationRemarkEmitter.h" +#include "llvm/CodeGen/MachineFunctionPass.h" + +namespace llvm { +class MachineBasicBlock; +class MachineBlockFrequencyInfo; +class MachineInstr; + +/// Common features for diagnostics dealing with optimization remarks +/// that are used by machine passes. +class DiagnosticInfoMIROptimization : public DiagnosticInfoOptimizationBase { +public: + DiagnosticInfoMIROptimization(enum DiagnosticKind Kind, const char *PassName, + StringRef RemarkName, + const DiagnosticLocation &Loc, + const MachineBasicBlock *MBB) + : DiagnosticInfoOptimizationBase(Kind, DS_Remark, PassName, RemarkName, + MBB->getParent()->getFunction(), Loc), + MBB(MBB) {} + + /// MI-specific kinds of diagnostic Arguments. + struct MachineArgument : public DiagnosticInfoOptimizationBase::Argument { + /// Print an entire MachineInstr. + MachineArgument(StringRef Key, const MachineInstr &MI); + }; + + static bool classof(const DiagnosticInfo *DI) { + return DI->getKind() >= DK_FirstMachineRemark && + DI->getKind() <= DK_LastMachineRemark; + } + + const MachineBasicBlock *getBlock() const { return MBB; } + +private: + const MachineBasicBlock *MBB; +}; + +/// Diagnostic information for applied optimization remarks. +class MachineOptimizationRemark : public DiagnosticInfoMIROptimization { +public: + /// \p PassName is the name of the pass emitting this diagnostic. If this name + /// matches the regular expression given in -Rpass=, then the diagnostic will + /// be emitted. \p RemarkName is a textual identifier for the remark. \p + /// Loc is the debug location and \p MBB is the block that the optimization + /// operates in. + MachineOptimizationRemark(const char *PassName, StringRef RemarkName, + const DiagnosticLocation &Loc, + const MachineBasicBlock *MBB) + : DiagnosticInfoMIROptimization(DK_MachineOptimizationRemark, PassName, + RemarkName, Loc, MBB) {} + + static bool classof(const DiagnosticInfo *DI) { + return DI->getKind() == DK_MachineOptimizationRemark; + } + + /// \see DiagnosticInfoOptimizationBase::isEnabled. + bool isEnabled() const override { + const Function &Fn = getFunction(); + LLVMContext &Ctx = Fn.getContext(); + return Ctx.getDiagHandlerPtr()->isPassedOptRemarkEnabled(getPassName()); + } +}; + +/// Diagnostic information for missed-optimization remarks. +class MachineOptimizationRemarkMissed : public DiagnosticInfoMIROptimization { +public: + /// \p PassName is the name of the pass emitting this diagnostic. If this name + /// matches the regular expression given in -Rpass-missed=, then the + /// diagnostic will be emitted. \p RemarkName is a textual identifier for the + /// remark. \p Loc is the debug location and \p MBB is the block that the + /// optimization operates in. + MachineOptimizationRemarkMissed(const char *PassName, StringRef RemarkName, + const DiagnosticLocation &Loc, + const MachineBasicBlock *MBB) + : DiagnosticInfoMIROptimization(DK_MachineOptimizationRemarkMissed, + PassName, RemarkName, Loc, MBB) {} + + static bool classof(const DiagnosticInfo *DI) { + return DI->getKind() == DK_MachineOptimizationRemarkMissed; + } + + /// \see DiagnosticInfoOptimizationBase::isEnabled. + bool isEnabled() const override { + const Function &Fn = getFunction(); + LLVMContext &Ctx = Fn.getContext(); + return Ctx.getDiagHandlerPtr()->isMissedOptRemarkEnabled(getPassName()); + } +}; + +/// Diagnostic information for optimization analysis remarks. +class MachineOptimizationRemarkAnalysis : public DiagnosticInfoMIROptimization { +public: + /// \p PassName is the name of the pass emitting this diagnostic. If this name + /// matches the regular expression given in -Rpass-analysis=, then the + /// diagnostic will be emitted. \p RemarkName is a textual identifier for the + /// remark. \p Loc is the debug location and \p MBB is the block that the + /// optimization operates in. + MachineOptimizationRemarkAnalysis(const char *PassName, StringRef RemarkName, + const DiagnosticLocation &Loc, + const MachineBasicBlock *MBB) + : DiagnosticInfoMIROptimization(DK_MachineOptimizationRemarkAnalysis, + PassName, RemarkName, Loc, MBB) {} + + static bool classof(const DiagnosticInfo *DI) { + return DI->getKind() == DK_MachineOptimizationRemarkAnalysis; + } + + /// \see DiagnosticInfoOptimizationBase::isEnabled. + bool isEnabled() const override { + const Function &Fn = getFunction(); + LLVMContext &Ctx = Fn.getContext(); + return Ctx.getDiagHandlerPtr()->isAnalysisRemarkEnabled(getPassName()); + } +}; + +/// Extend llvm::ore:: with MI-specific helper names. +namespace ore { +using MNV = DiagnosticInfoMIROptimization::MachineArgument; +} + +/// The optimization diagnostic interface. +/// +/// It allows reporting when optimizations are performed and when they are not +/// along with the reasons for it. Hotness information of the corresponding +/// code region can be included in the remark if DiagnosticsHotnessRequested is +/// enabled in the LLVM context. +class MachineOptimizationRemarkEmitter { +public: + MachineOptimizationRemarkEmitter(MachineFunction &MF, + MachineBlockFrequencyInfo *MBFI) + : MF(MF), MBFI(MBFI) {} + + /// Emit an optimization remark. + void emit(DiagnosticInfoOptimizationBase &OptDiag); + + /// Whether we allow for extra compile-time budget to perform more + /// analysis to be more informative. + /// + /// This is useful to enable additional missed optimizations to be reported + /// that are normally too noisy. In this mode, we can use the extra analysis + /// (1) to filter trivial false positives or (2) to provide more context so + /// that non-trivial false positives can be quickly detected by the user. + bool allowExtraAnalysis(StringRef PassName) const { + return ( + MF.getFunction().getContext().getLLVMRemarkStreamer() || + MF.getFunction().getContext().getDiagHandlerPtr()->isAnyRemarkEnabled( + PassName)); + } + + /// Take a lambda that returns a remark which will be emitted. Second + /// argument is only used to restrict this to functions. + template <typename T> + void emit(T RemarkBuilder, decltype(RemarkBuilder()) * = nullptr) { + // Avoid building the remark unless we know there are at least *some* + // remarks enabled. We can't currently check whether remarks are requested + // for the calling pass since that requires actually building the remark. + + if (MF.getFunction().getContext().getLLVMRemarkStreamer() || + MF.getFunction() + .getContext() + .getDiagHandlerPtr() + ->isAnyRemarkEnabled()) { + auto R = RemarkBuilder(); + emit((DiagnosticInfoOptimizationBase &)R); + } + } + + MachineBlockFrequencyInfo *getBFI() { + return MBFI; + } + +private: + MachineFunction &MF; + + /// MBFI is only set if hotness is requested. + MachineBlockFrequencyInfo *MBFI; + + /// Compute hotness from IR value (currently assumed to be a block) if PGO is + /// available. + Optional<uint64_t> computeHotness(const MachineBasicBlock &MBB); + + /// Similar but use value from \p OptDiag and update hotness there. + void computeHotness(DiagnosticInfoMIROptimization &Remark); + + /// Only allow verbose messages if we know we're filtering by hotness + /// (BFI is only set in this case). + bool shouldEmitVerbose() { return MBFI != nullptr; } +}; + +/// The analysis pass +/// +/// Note that this pass shouldn't generally be marked as preserved by other +/// passes. It's holding onto BFI, so if the pass does not preserve BFI, BFI +/// could be freed. +class MachineOptimizationRemarkEmitterPass : public MachineFunctionPass { + std::unique_ptr<MachineOptimizationRemarkEmitter> ORE; + +public: + MachineOptimizationRemarkEmitterPass(); + + bool runOnMachineFunction(MachineFunction &MF) override; + + void getAnalysisUsage(AnalysisUsage &AU) const override; + + MachineOptimizationRemarkEmitter &getORE() { + assert(ORE && "pass not run yet"); + return *ORE; + } + + static char ID; +}; +} + +#endif + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif |