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