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