123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- ///===- MachineOptimizationRemarkEmitter.cpp - Opt Diagnostic -*- C++ -*---===//
- ///
- /// The LLVM Compiler Infrastructure
- ///
- /// This file is distributed under the University of Illinois Open Source
- /// License. See LICENSE.TXT for details.
- ///
- ///===---------------------------------------------------------------------===//
- /// \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.
- ///
- ///===---------------------------------------------------------------------===//
- #include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h"
- #include "llvm/CodeGen/LazyMachineBlockFrequencyInfo.h"
- #include "llvm/CodeGen/MachineInstr.h"
- #include "llvm/IR/DebugInfo.h"
- #include "llvm/IR/DiagnosticInfo.h"
- #include "llvm/IR/LLVMContext.h"
- using namespace llvm;
- DiagnosticInfoMIROptimization::MachineArgument::MachineArgument(
- StringRef MKey, const MachineInstr &MI)
- : Argument() {
- Key = MKey;
- raw_string_ostream OS(Val);
- MI.print(OS, /*SkipOpers=*/false, /*SkipDebugLoc=*/true);
- }
- Optional<uint64_t>
- MachineOptimizationRemarkEmitter::computeHotness(const MachineBasicBlock &MBB) {
- if (!MBFI)
- return None;
- return MBFI->getBlockProfileCount(&MBB);
- }
- void MachineOptimizationRemarkEmitter::computeHotness(
- DiagnosticInfoMIROptimization &Remark) {
- const MachineBasicBlock *MBB = Remark.getBlock();
- if (MBB)
- Remark.setHotness(computeHotness(*MBB));
- }
- void MachineOptimizationRemarkEmitter::emit(
- DiagnosticInfoOptimizationBase &OptDiagCommon) {
- auto &OptDiag = cast<DiagnosticInfoMIROptimization>(OptDiagCommon);
- computeHotness(OptDiag);
- LLVMContext &Ctx = MF.getFunction()->getContext();
- // If a diagnostic has a hotness value, then only emit it if its hotness
- // meets the threshold.
- if (OptDiag.getHotness() &&
- *OptDiag.getHotness() < Ctx.getDiagnosticsHotnessThreshold()) {
- return;
- }
- Ctx.diagnose(OptDiag);
- }
- MachineOptimizationRemarkEmitterPass::MachineOptimizationRemarkEmitterPass()
- : MachineFunctionPass(ID) {
- initializeMachineOptimizationRemarkEmitterPassPass(
- *PassRegistry::getPassRegistry());
- }
- bool MachineOptimizationRemarkEmitterPass::runOnMachineFunction(
- MachineFunction &MF) {
- MachineBlockFrequencyInfo *MBFI;
- if (MF.getFunction()->getContext().getDiagnosticsHotnessRequested())
- MBFI = &getAnalysis<LazyMachineBlockFrequencyInfoPass>().getBFI();
- else
- MBFI = nullptr;
- ORE = llvm::make_unique<MachineOptimizationRemarkEmitter>(MF, MBFI);
- return false;
- }
- void MachineOptimizationRemarkEmitterPass::getAnalysisUsage(
- AnalysisUsage &AU) const {
- AU.addRequired<LazyMachineBlockFrequencyInfoPass>();
- AU.setPreservesAll();
- MachineFunctionPass::getAnalysisUsage(AU);
- }
- char MachineOptimizationRemarkEmitterPass::ID = 0;
- static const char ore_name[] = "Machine Optimization Remark Emitter";
- #define ORE_NAME "machine-opt-remark-emitter"
- INITIALIZE_PASS_BEGIN(MachineOptimizationRemarkEmitterPass, ORE_NAME, ore_name,
- false, true)
- INITIALIZE_PASS_DEPENDENCY(LazyMachineBlockFrequencyInfoPass)
- INITIALIZE_PASS_END(MachineOptimizationRemarkEmitterPass, ORE_NAME, ore_name,
- false, true)
|