blob: b82403ae1b850ed4b1e724a7462b16de3c116729 [file] [log] [blame]
Adam Nemeta9640662017-01-25 23:20:33 +00001///===- MachineOptimizationRemarkEmitter.cpp - Opt Diagnostic -*- C++ -*---===//
2///
Chandler Carruth2946cd72019-01-19 08:50:56 +00003/// 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 Nemeta9640662017-01-25 23:20:33 +00006///
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 Nemetbbb141c2017-02-14 17:21:09 +000016#include "llvm/CodeGen/LazyMachineBlockFrequencyInfo.h"
Ahmed Bougacha27273972017-02-23 21:05:33 +000017#include "llvm/CodeGen/MachineInstr.h"
Adam Nemeta9640662017-01-25 23:20:33 +000018#include "llvm/IR/DiagnosticInfo.h"
19#include "llvm/IR/LLVMContext.h"
20
21using namespace llvm;
22
Ahmed Bougacha27273972017-02-23 21:05:33 +000023DiagnosticInfoMIROptimization::MachineArgument::MachineArgument(
24 StringRef MKey, const MachineInstr &MI)
25 : Argument() {
26 Key = MKey;
27
28 raw_string_ostream OS(Val);
Francis Visoiu Mistriheb3f76f2018-01-18 18:05:15 +000029 MI.print(OS, /*IsStandalone=*/true, /*SkipOpers=*/false,
30 /*SkipDebugLoc=*/true);
Ahmed Bougacha27273972017-02-23 21:05:33 +000031}
32
Adam Nemeta9640662017-01-25 23:20:33 +000033Optional<uint64_t>
34MachineOptimizationRemarkEmitter::computeHotness(const MachineBasicBlock &MBB) {
35 if (!MBFI)
36 return None;
37
38 return MBFI->getBlockProfileCount(&MBB);
39}
40
41void MachineOptimizationRemarkEmitter::computeHotness(
42 DiagnosticInfoMIROptimization &Remark) {
43 const MachineBasicBlock *MBB = Remark.getBlock();
44 if (MBB)
45 Remark.setHotness(computeHotness(*MBB));
46}
47
48void MachineOptimizationRemarkEmitter::emit(
49 DiagnosticInfoOptimizationBase &OptDiagCommon) {
50 auto &OptDiag = cast<DiagnosticInfoMIROptimization>(OptDiagCommon);
51 computeHotness(OptDiag);
52
Matthias Braunf1caa282017-12-15 22:22:58 +000053 LLVMContext &Ctx = MF.getFunction().getContext();
Brian Gesiak4ef3daa2017-06-30 23:14:53 +000054
Adam Nemet9303f622017-12-01 20:41:38 +000055 // Only emit it if its hotness meets the threshold.
56 if (OptDiag.getHotness().getValueOr(0) <
57 Ctx.getDiagnosticsHotnessThreshold()) {
Brian Gesiak4ef3daa2017-06-30 23:14:53 +000058 return;
59 }
60
Adam Nemetf1bea0a2017-10-04 15:18:07 +000061 Ctx.diagnose(OptDiag);
Adam Nemeta9640662017-01-25 23:20:33 +000062}
63
64MachineOptimizationRemarkEmitterPass::MachineOptimizationRemarkEmitterPass()
65 : MachineFunctionPass(ID) {
66 initializeMachineOptimizationRemarkEmitterPassPass(
67 *PassRegistry::getPassRegistry());
68}
69
70bool MachineOptimizationRemarkEmitterPass::runOnMachineFunction(
71 MachineFunction &MF) {
72 MachineBlockFrequencyInfo *MBFI;
73
Matthias Braunf1caa282017-12-15 22:22:58 +000074 if (MF.getFunction().getContext().getDiagnosticsHotnessRequested())
Adam Nemetbbb141c2017-02-14 17:21:09 +000075 MBFI = &getAnalysis<LazyMachineBlockFrequencyInfoPass>().getBFI();
Adam Nemeta9640662017-01-25 23:20:33 +000076 else
77 MBFI = nullptr;
78
Jonas Devlieghere0eaee542019-08-15 15:54:37 +000079 ORE = std::make_unique<MachineOptimizationRemarkEmitter>(MF, MBFI);
Adam Nemeta9640662017-01-25 23:20:33 +000080 return false;
81}
82
83void MachineOptimizationRemarkEmitterPass::getAnalysisUsage(
84 AnalysisUsage &AU) const {
Adam Nemetb516cf32017-02-23 17:30:01 +000085 AU.addRequired<LazyMachineBlockFrequencyInfoPass>();
Adam Nemeta9640662017-01-25 23:20:33 +000086 AU.setPreservesAll();
87 MachineFunctionPass::getAnalysisUsage(AU);
88}
89
90char MachineOptimizationRemarkEmitterPass::ID = 0;
91static const char ore_name[] = "Machine Optimization Remark Emitter";
92#define ORE_NAME "machine-opt-remark-emitter"
93
94INITIALIZE_PASS_BEGIN(MachineOptimizationRemarkEmitterPass, ORE_NAME, ore_name,
95 false, true)
Adam Nemetb516cf32017-02-23 17:30:01 +000096INITIALIZE_PASS_DEPENDENCY(LazyMachineBlockFrequencyInfoPass)
Adam Nemeta9640662017-01-25 23:20:33 +000097INITIALIZE_PASS_END(MachineOptimizationRemarkEmitterPass, ORE_NAME, ore_name,
98 false, true)