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" 17*bbb141c7SAdam Nemet #include "llvm/CodeGen/LazyMachineBlockFrequencyInfo.h" 18a9640667SAdam Nemet #include "llvm/IR/DebugInfo.h" 19a9640667SAdam Nemet #include "llvm/IR/DiagnosticInfo.h" 20a9640667SAdam Nemet #include "llvm/IR/LLVMContext.h" 21a9640667SAdam Nemet 22a9640667SAdam Nemet using namespace llvm; 23a9640667SAdam Nemet 24a9640667SAdam Nemet Optional<uint64_t> 25a9640667SAdam Nemet MachineOptimizationRemarkEmitter::computeHotness(const MachineBasicBlock &MBB) { 26a9640667SAdam Nemet if (!MBFI) 27a9640667SAdam Nemet return None; 28a9640667SAdam Nemet 29a9640667SAdam Nemet return MBFI->getBlockProfileCount(&MBB); 30a9640667SAdam Nemet } 31a9640667SAdam Nemet 32a9640667SAdam Nemet void MachineOptimizationRemarkEmitter::computeHotness( 33a9640667SAdam Nemet DiagnosticInfoMIROptimization &Remark) { 34a9640667SAdam Nemet const MachineBasicBlock *MBB = Remark.getBlock(); 35a9640667SAdam Nemet if (MBB) 36a9640667SAdam Nemet Remark.setHotness(computeHotness(*MBB)); 37a9640667SAdam Nemet } 38a9640667SAdam Nemet 39a9640667SAdam Nemet void MachineOptimizationRemarkEmitter::emit( 40a9640667SAdam Nemet DiagnosticInfoOptimizationBase &OptDiagCommon) { 41a9640667SAdam Nemet auto &OptDiag = cast<DiagnosticInfoMIROptimization>(OptDiagCommon); 42a9640667SAdam Nemet computeHotness(OptDiag); 43a9640667SAdam Nemet 44a9640667SAdam Nemet LLVMContext &Ctx = MF.getFunction()->getContext(); 45a9640667SAdam Nemet yaml::Output *Out = Ctx.getDiagnosticsOutputFile(); 46a9640667SAdam Nemet if (Out) { 47a9640667SAdam Nemet auto *P = &const_cast<DiagnosticInfoOptimizationBase &>(OptDiagCommon); 48a9640667SAdam Nemet *Out << P; 49a9640667SAdam Nemet } 50a9640667SAdam Nemet // FIXME: now that IsVerbose is part of DI, filtering for this will be moved 51a9640667SAdam Nemet // from here to clang. 52a9640667SAdam Nemet if (!OptDiag.isVerbose() || shouldEmitVerbose()) 53a9640667SAdam Nemet Ctx.diagnose(OptDiag); 54a9640667SAdam Nemet } 55a9640667SAdam Nemet 56a9640667SAdam Nemet MachineOptimizationRemarkEmitterPass::MachineOptimizationRemarkEmitterPass() 57a9640667SAdam Nemet : MachineFunctionPass(ID) { 58a9640667SAdam Nemet initializeMachineOptimizationRemarkEmitterPassPass( 59a9640667SAdam Nemet *PassRegistry::getPassRegistry()); 60a9640667SAdam Nemet } 61a9640667SAdam Nemet 62a9640667SAdam Nemet bool MachineOptimizationRemarkEmitterPass::runOnMachineFunction( 63a9640667SAdam Nemet MachineFunction &MF) { 64a9640667SAdam Nemet MachineBlockFrequencyInfo *MBFI; 65a9640667SAdam Nemet 66a9640667SAdam Nemet if (MF.getFunction()->getContext().getDiagnosticHotnessRequested()) 67*bbb141c7SAdam Nemet MBFI = &getAnalysis<LazyMachineBlockFrequencyInfoPass>().getBFI(); 68a9640667SAdam Nemet else 69a9640667SAdam Nemet MBFI = nullptr; 70a9640667SAdam Nemet 71a9640667SAdam Nemet ORE = llvm::make_unique<MachineOptimizationRemarkEmitter>(MF, MBFI); 72a9640667SAdam Nemet return false; 73a9640667SAdam Nemet } 74a9640667SAdam Nemet 75a9640667SAdam Nemet void MachineOptimizationRemarkEmitterPass::getAnalysisUsage( 76a9640667SAdam Nemet AnalysisUsage &AU) const { 77*bbb141c7SAdam Nemet LazyMachineBlockFrequencyInfoPass::getLazyMachineBFIAnalysisUsage(AU); 78a9640667SAdam Nemet AU.setPreservesAll(); 79a9640667SAdam Nemet MachineFunctionPass::getAnalysisUsage(AU); 80a9640667SAdam Nemet } 81a9640667SAdam Nemet 82a9640667SAdam Nemet char MachineOptimizationRemarkEmitterPass::ID = 0; 83a9640667SAdam Nemet static const char ore_name[] = "Machine Optimization Remark Emitter"; 84a9640667SAdam Nemet #define ORE_NAME "machine-opt-remark-emitter" 85a9640667SAdam Nemet 86a9640667SAdam Nemet INITIALIZE_PASS_BEGIN(MachineOptimizationRemarkEmitterPass, ORE_NAME, ore_name, 87a9640667SAdam Nemet false, true) 88*bbb141c7SAdam Nemet INITIALIZE_PASS_DEPENDENCY(LazyMachineBFIPass) 89a9640667SAdam Nemet INITIALIZE_PASS_END(MachineOptimizationRemarkEmitterPass, ORE_NAME, ore_name, 90a9640667SAdam Nemet false, true) 91