1a9640667SAdam Nemet ///===- MachineOptimizationRemarkEmitter.cpp - Opt Diagnostic -*- C++ -*---===// 2a9640667SAdam Nemet /// 3a9640667SAdam Nemet /// The LLVM Compiler Infrastructure 4a9640667SAdam Nemet /// 5a9640667SAdam Nemet /// This file is distributed under the University of Illinois Open Source 6a9640667SAdam Nemet /// License. See LICENSE.TXT for details. 7a9640667SAdam Nemet /// 8a9640667SAdam Nemet ///===---------------------------------------------------------------------===// 9a9640667SAdam Nemet /// \file 10a9640667SAdam Nemet /// Optimization diagnostic interfaces for machine passes. It's packaged as an 11a9640667SAdam Nemet /// analysis pass so that by using this service passes become dependent on MBFI 12a9640667SAdam Nemet /// as well. MBFI is used to compute the "hotness" of the diagnostic message. 13a9640667SAdam Nemet /// 14a9640667SAdam Nemet ///===---------------------------------------------------------------------===// 15a9640667SAdam Nemet 16a9640667SAdam Nemet #include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h" 17bbb141c7SAdam Nemet #include "llvm/CodeGen/LazyMachineBlockFrequencyInfo.h" 1827273975SAhmed Bougacha #include "llvm/CodeGen/MachineInstr.h" 19a9640667SAdam Nemet #include "llvm/IR/DiagnosticInfo.h" 20a9640667SAdam Nemet #include "llvm/IR/LLVMContext.h" 21a9640667SAdam Nemet 22a9640667SAdam Nemet using namespace llvm; 23a9640667SAdam Nemet 2427273975SAhmed Bougacha DiagnosticInfoMIROptimization::MachineArgument::MachineArgument( 2527273975SAhmed Bougacha StringRef MKey, const MachineInstr &MI) 2627273975SAhmed Bougacha : Argument() { 2727273975SAhmed Bougacha Key = MKey; 2827273975SAhmed Bougacha 2927273975SAhmed Bougacha raw_string_ostream OS(Val); 30*eb3f76fcSFrancis Visoiu Mistrih MI.print(OS, /*IsStandalone=*/true, /*SkipOpers=*/false, 31*eb3f76fcSFrancis Visoiu Mistrih /*SkipDebugLoc=*/true); 3227273975SAhmed Bougacha } 3327273975SAhmed Bougacha 34a9640667SAdam Nemet Optional<uint64_t> 35a9640667SAdam Nemet MachineOptimizationRemarkEmitter::computeHotness(const MachineBasicBlock &MBB) { 36a9640667SAdam Nemet if (!MBFI) 37a9640667SAdam Nemet return None; 38a9640667SAdam Nemet 39a9640667SAdam Nemet return MBFI->getBlockProfileCount(&MBB); 40a9640667SAdam Nemet } 41a9640667SAdam Nemet 42a9640667SAdam Nemet void MachineOptimizationRemarkEmitter::computeHotness( 43a9640667SAdam Nemet DiagnosticInfoMIROptimization &Remark) { 44a9640667SAdam Nemet const MachineBasicBlock *MBB = Remark.getBlock(); 45a9640667SAdam Nemet if (MBB) 46a9640667SAdam Nemet Remark.setHotness(computeHotness(*MBB)); 47a9640667SAdam Nemet } 48a9640667SAdam Nemet 49a9640667SAdam Nemet void MachineOptimizationRemarkEmitter::emit( 50a9640667SAdam Nemet DiagnosticInfoOptimizationBase &OptDiagCommon) { 51a9640667SAdam Nemet auto &OptDiag = cast<DiagnosticInfoMIROptimization>(OptDiagCommon); 52a9640667SAdam Nemet computeHotness(OptDiag); 53a9640667SAdam Nemet 54f1caa283SMatthias Braun LLVMContext &Ctx = MF.getFunction().getContext(); 554ef3daafSBrian Gesiak 569303f622SAdam Nemet // Only emit it if its hotness meets the threshold. 579303f622SAdam Nemet if (OptDiag.getHotness().getValueOr(0) < 589303f622SAdam Nemet Ctx.getDiagnosticsHotnessThreshold()) { 594ef3daafSBrian Gesiak return; 604ef3daafSBrian Gesiak } 614ef3daafSBrian Gesiak 62a9640667SAdam Nemet Ctx.diagnose(OptDiag); 63a9640667SAdam Nemet } 64a9640667SAdam Nemet 65a9640667SAdam Nemet MachineOptimizationRemarkEmitterPass::MachineOptimizationRemarkEmitterPass() 66a9640667SAdam Nemet : MachineFunctionPass(ID) { 67a9640667SAdam Nemet initializeMachineOptimizationRemarkEmitterPassPass( 68a9640667SAdam Nemet *PassRegistry::getPassRegistry()); 69a9640667SAdam Nemet } 70a9640667SAdam Nemet 71a9640667SAdam Nemet bool MachineOptimizationRemarkEmitterPass::runOnMachineFunction( 72a9640667SAdam Nemet MachineFunction &MF) { 73a9640667SAdam Nemet MachineBlockFrequencyInfo *MBFI; 74a9640667SAdam Nemet 75f1caa283SMatthias Braun if (MF.getFunction().getContext().getDiagnosticsHotnessRequested()) 76bbb141c7SAdam Nemet MBFI = &getAnalysis<LazyMachineBlockFrequencyInfoPass>().getBFI(); 77a9640667SAdam Nemet else 78a9640667SAdam Nemet MBFI = nullptr; 79a9640667SAdam Nemet 80a9640667SAdam Nemet ORE = llvm::make_unique<MachineOptimizationRemarkEmitter>(MF, MBFI); 81a9640667SAdam Nemet return false; 82a9640667SAdam Nemet } 83a9640667SAdam Nemet 84a9640667SAdam Nemet void MachineOptimizationRemarkEmitterPass::getAnalysisUsage( 85a9640667SAdam Nemet AnalysisUsage &AU) const { 86b516cf3fSAdam Nemet AU.addRequired<LazyMachineBlockFrequencyInfoPass>(); 87a9640667SAdam Nemet AU.setPreservesAll(); 88a9640667SAdam Nemet MachineFunctionPass::getAnalysisUsage(AU); 89a9640667SAdam Nemet } 90a9640667SAdam Nemet 91a9640667SAdam Nemet char MachineOptimizationRemarkEmitterPass::ID = 0; 92a9640667SAdam Nemet static const char ore_name[] = "Machine Optimization Remark Emitter"; 93a9640667SAdam Nemet #define ORE_NAME "machine-opt-remark-emitter" 94a9640667SAdam Nemet 95a9640667SAdam Nemet INITIALIZE_PASS_BEGIN(MachineOptimizationRemarkEmitterPass, ORE_NAME, ore_name, 96a9640667SAdam Nemet false, true) 97b516cf3fSAdam Nemet INITIALIZE_PASS_DEPENDENCY(LazyMachineBlockFrequencyInfoPass) 98a9640667SAdam Nemet INITIALIZE_PASS_END(MachineOptimizationRemarkEmitterPass, ORE_NAME, ore_name, 99a9640667SAdam Nemet false, true) 100