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