Adam Nemet | a964066 | 2017-01-25 23:20:33 +0000 | [diff] [blame] | 1 | ///===- MachineOptimizationRemarkEmitter.cpp - Opt Diagnostic -*- C++ -*---===// |
| 2 | /// |
Chandler Carruth | 2946cd7 | 2019-01-19 08:50:56 +0000 | [diff] [blame] | 3 | /// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | /// See https://llvm.org/LICENSE.txt for license information. |
| 5 | /// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
Adam Nemet | a964066 | 2017-01-25 23:20:33 +0000 | [diff] [blame] | 6 | /// |
| 7 | ///===---------------------------------------------------------------------===// |
| 8 | /// \file |
| 9 | /// Optimization diagnostic interfaces for machine passes. It's packaged as an |
| 10 | /// analysis pass so that by using this service passes become dependent on MBFI |
| 11 | /// as well. MBFI is used to compute the "hotness" of the diagnostic message. |
| 12 | /// |
| 13 | ///===---------------------------------------------------------------------===// |
| 14 | |
| 15 | #include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h" |
Adam Nemet | bbb141c | 2017-02-14 17:21:09 +0000 | [diff] [blame] | 16 | #include "llvm/CodeGen/LazyMachineBlockFrequencyInfo.h" |
Ahmed Bougacha | 2727397 | 2017-02-23 21:05:33 +0000 | [diff] [blame] | 17 | #include "llvm/CodeGen/MachineInstr.h" |
Adam Nemet | a964066 | 2017-01-25 23:20:33 +0000 | [diff] [blame] | 18 | #include "llvm/IR/DiagnosticInfo.h" |
| 19 | #include "llvm/IR/LLVMContext.h" |
| 20 | |
| 21 | using namespace llvm; |
| 22 | |
Ahmed Bougacha | 2727397 | 2017-02-23 21:05:33 +0000 | [diff] [blame] | 23 | DiagnosticInfoMIROptimization::MachineArgument::MachineArgument( |
| 24 | StringRef MKey, const MachineInstr &MI) |
| 25 | : Argument() { |
| 26 | Key = MKey; |
| 27 | |
| 28 | raw_string_ostream OS(Val); |
Francis Visoiu Mistrih | eb3f76f | 2018-01-18 18:05:15 +0000 | [diff] [blame] | 29 | MI.print(OS, /*IsStandalone=*/true, /*SkipOpers=*/false, |
| 30 | /*SkipDebugLoc=*/true); |
Ahmed Bougacha | 2727397 | 2017-02-23 21:05:33 +0000 | [diff] [blame] | 31 | } |
| 32 | |
Adam Nemet | a964066 | 2017-01-25 23:20:33 +0000 | [diff] [blame] | 33 | Optional<uint64_t> |
| 34 | MachineOptimizationRemarkEmitter::computeHotness(const MachineBasicBlock &MBB) { |
| 35 | if (!MBFI) |
| 36 | return None; |
| 37 | |
| 38 | return MBFI->getBlockProfileCount(&MBB); |
| 39 | } |
| 40 | |
| 41 | void MachineOptimizationRemarkEmitter::computeHotness( |
| 42 | DiagnosticInfoMIROptimization &Remark) { |
| 43 | const MachineBasicBlock *MBB = Remark.getBlock(); |
| 44 | if (MBB) |
| 45 | Remark.setHotness(computeHotness(*MBB)); |
| 46 | } |
| 47 | |
| 48 | void MachineOptimizationRemarkEmitter::emit( |
| 49 | DiagnosticInfoOptimizationBase &OptDiagCommon) { |
| 50 | auto &OptDiag = cast<DiagnosticInfoMIROptimization>(OptDiagCommon); |
| 51 | computeHotness(OptDiag); |
| 52 | |
Matthias Braun | f1caa28 | 2017-12-15 22:22:58 +0000 | [diff] [blame] | 53 | LLVMContext &Ctx = MF.getFunction().getContext(); |
Brian Gesiak | 4ef3daa | 2017-06-30 23:14:53 +0000 | [diff] [blame] | 54 | |
Adam Nemet | 9303f62 | 2017-12-01 20:41:38 +0000 | [diff] [blame] | 55 | // Only emit it if its hotness meets the threshold. |
| 56 | if (OptDiag.getHotness().getValueOr(0) < |
| 57 | Ctx.getDiagnosticsHotnessThreshold()) { |
Brian Gesiak | 4ef3daa | 2017-06-30 23:14:53 +0000 | [diff] [blame] | 58 | return; |
| 59 | } |
| 60 | |
Adam Nemet | f1bea0a | 2017-10-04 15:18:07 +0000 | [diff] [blame] | 61 | Ctx.diagnose(OptDiag); |
Adam Nemet | a964066 | 2017-01-25 23:20:33 +0000 | [diff] [blame] | 62 | } |
| 63 | |
| 64 | MachineOptimizationRemarkEmitterPass::MachineOptimizationRemarkEmitterPass() |
| 65 | : MachineFunctionPass(ID) { |
| 66 | initializeMachineOptimizationRemarkEmitterPassPass( |
| 67 | *PassRegistry::getPassRegistry()); |
| 68 | } |
| 69 | |
| 70 | bool MachineOptimizationRemarkEmitterPass::runOnMachineFunction( |
| 71 | MachineFunction &MF) { |
| 72 | MachineBlockFrequencyInfo *MBFI; |
| 73 | |
Matthias Braun | f1caa28 | 2017-12-15 22:22:58 +0000 | [diff] [blame] | 74 | if (MF.getFunction().getContext().getDiagnosticsHotnessRequested()) |
Adam Nemet | bbb141c | 2017-02-14 17:21:09 +0000 | [diff] [blame] | 75 | MBFI = &getAnalysis<LazyMachineBlockFrequencyInfoPass>().getBFI(); |
Adam Nemet | a964066 | 2017-01-25 23:20:33 +0000 | [diff] [blame] | 76 | else |
| 77 | MBFI = nullptr; |
| 78 | |
Jonas Devlieghere | 0eaee54 | 2019-08-15 15:54:37 +0000 | [diff] [blame] | 79 | ORE = std::make_unique<MachineOptimizationRemarkEmitter>(MF, MBFI); |
Adam Nemet | a964066 | 2017-01-25 23:20:33 +0000 | [diff] [blame] | 80 | return false; |
| 81 | } |
| 82 | |
| 83 | void MachineOptimizationRemarkEmitterPass::getAnalysisUsage( |
| 84 | AnalysisUsage &AU) const { |
Adam Nemet | b516cf3 | 2017-02-23 17:30:01 +0000 | [diff] [blame] | 85 | AU.addRequired<LazyMachineBlockFrequencyInfoPass>(); |
Adam Nemet | a964066 | 2017-01-25 23:20:33 +0000 | [diff] [blame] | 86 | AU.setPreservesAll(); |
| 87 | MachineFunctionPass::getAnalysisUsage(AU); |
| 88 | } |
| 89 | |
| 90 | char MachineOptimizationRemarkEmitterPass::ID = 0; |
| 91 | static const char ore_name[] = "Machine Optimization Remark Emitter"; |
| 92 | #define ORE_NAME "machine-opt-remark-emitter" |
| 93 | |
| 94 | INITIALIZE_PASS_BEGIN(MachineOptimizationRemarkEmitterPass, ORE_NAME, ore_name, |
| 95 | false, true) |
Adam Nemet | b516cf3 | 2017-02-23 17:30:01 +0000 | [diff] [blame] | 96 | INITIALIZE_PASS_DEPENDENCY(LazyMachineBlockFrequencyInfoPass) |
Adam Nemet | a964066 | 2017-01-25 23:20:33 +0000 | [diff] [blame] | 97 | INITIALIZE_PASS_END(MachineOptimizationRemarkEmitterPass, ORE_NAME, ore_name, |
| 98 | false, true) |