blob: e658755aa1e9ae61990b9f46d4ad2ea19a4c7fb4 [file] [log] [blame]
Adam Nemetaad81602016-07-15 17:23:20 +00001//===- OptimizationDiagnosticInfo.cpp - Optimization 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//
10// Optimization diagnostic interfaces. It's packaged as an analysis pass so
11// that by using this service passes become dependent on BFI as well. BFI is
12// used to compute the "hotness" of the diagnostic message.
13//===----------------------------------------------------------------------===//
14
15#include "llvm/Analysis/OptimizationDiagnosticInfo.h"
16#include "llvm/Analysis/LazyBlockFrequencyInfo.h"
17#include "llvm/Analysis/LoopInfo.h"
18#include "llvm/IR/DiagnosticInfo.h"
19#include "llvm/IR/LLVMContext.h"
20
21using namespace llvm;
22
Adam Nemet6100d162016-07-20 21:44:22 +000023Optional<uint64_t> OptimizationRemarkEmitter::computeHotness(const Value *V) {
Adam Nemetaad81602016-07-15 17:23:20 +000024 if (!BFI)
25 return None;
26
27 return BFI->getBlockProfileCount(cast<BasicBlock>(V));
28}
29
Adam Nemet7cfd5972016-07-21 01:07:13 +000030void OptimizationRemarkEmitter::emitOptimizationRemark(const char *PassName,
31 const DebugLoc &DLoc,
32 const Value *V,
33 const Twine &Msg) {
34 LLVMContext &Ctx = F->getContext();
35 Ctx.diagnose(DiagnosticInfoOptimizationRemark(PassName, *F, DLoc, Msg,
36 computeHotness(V)));
37}
38
39void OptimizationRemarkEmitter::emitOptimizationRemark(const char *PassName,
40 Loop *L,
41 const Twine &Msg) {
42 emitOptimizationRemark(PassName, L->getStartLoc(), L->getHeader(), Msg);
43}
44
Adam Nemetaad81602016-07-15 17:23:20 +000045void OptimizationRemarkEmitter::emitOptimizationRemarkMissed(
Adam Nemet6100d162016-07-20 21:44:22 +000046 const char *PassName, const DebugLoc &DLoc, const Value *V,
47 const Twine &Msg) {
Adam Nemetaad81602016-07-15 17:23:20 +000048 LLVMContext &Ctx = F->getContext();
49 Ctx.diagnose(DiagnosticInfoOptimizationRemarkMissed(PassName, *F, DLoc, Msg,
50 computeHotness(V)));
51}
52
53void OptimizationRemarkEmitter::emitOptimizationRemarkMissed(
54 const char *PassName, Loop *L, const Twine &Msg) {
55 emitOptimizationRemarkMissed(PassName, L->getStartLoc(), L->getHeader(), Msg);
56}
57
Adam Nemet5b3a5cf2016-07-20 21:44:26 +000058void OptimizationRemarkEmitter::emitOptimizationRemarkAnalysis(
59 const char *PassName, const DebugLoc &DLoc, const Value *V,
60 const Twine &Msg) {
61 LLVMContext &Ctx = F->getContext();
62 Ctx.diagnose(DiagnosticInfoOptimizationRemarkAnalysis(PassName, *F, DLoc, Msg,
63 computeHotness(V)));
64}
65
66void OptimizationRemarkEmitter::emitOptimizationRemarkAnalysis(
67 const char *PassName, Loop *L, const Twine &Msg) {
68 emitOptimizationRemarkAnalysis(PassName, L->getStartLoc(), L->getHeader(),
69 Msg);
70}
71
Adam Nemet0e0e2d52016-07-20 23:50:32 +000072void OptimizationRemarkEmitter::emitOptimizationRemarkAnalysisFPCommute(
73 const char *PassName, const DebugLoc &DLoc, Value *V, const Twine &Msg) {
74 LLVMContext &Ctx = F->getContext();
75 Ctx.diagnose(DiagnosticInfoOptimizationRemarkAnalysisFPCommute(
76 PassName, *F, DLoc, Msg, computeHotness(V)));
77}
78
79void OptimizationRemarkEmitter::emitOptimizationRemarkAnalysisAliasing(
80 const char *PassName, const DebugLoc &DLoc, Value *V, const Twine &Msg) {
81 LLVMContext &Ctx = F->getContext();
82 Ctx.diagnose(DiagnosticInfoOptimizationRemarkAnalysisAliasing(
83 PassName, *F, DLoc, Msg, computeHotness(V)));
84}
85
86void OptimizationRemarkEmitter::emitOptimizationRemarkAnalysisAliasing(
87 const char *PassName, Loop *L, const Twine &Msg) {
88 emitOptimizationRemarkAnalysisAliasing(PassName, L->getStartLoc(),
89 L->getHeader(), Msg);
90}
91
Adam Nemet79ac42a2016-07-18 16:29:21 +000092OptimizationRemarkEmitterWrapperPass::OptimizationRemarkEmitterWrapperPass()
93 : FunctionPass(ID) {
94 initializeOptimizationRemarkEmitterWrapperPassPass(
95 *PassRegistry::getPassRegistry());
96}
97
98bool OptimizationRemarkEmitterWrapperPass::runOnFunction(Function &Fn) {
99 BlockFrequencyInfo *BFI;
Adam Nemetaad81602016-07-15 17:23:20 +0000100
101 if (Fn.getContext().getDiagnosticHotnessRequested())
102 BFI = &getAnalysis<LazyBlockFrequencyInfoPass>().getBFI();
103 else
104 BFI = nullptr;
105
Adam Nemet79ac42a2016-07-18 16:29:21 +0000106 ORE = llvm::make_unique<OptimizationRemarkEmitter>(&Fn, BFI);
Adam Nemetaad81602016-07-15 17:23:20 +0000107 return false;
108}
109
Adam Nemet79ac42a2016-07-18 16:29:21 +0000110void OptimizationRemarkEmitterWrapperPass::getAnalysisUsage(
111 AnalysisUsage &AU) const {
Adam Nemetaad81602016-07-15 17:23:20 +0000112 LazyBlockFrequencyInfoPass::getLazyBFIAnalysisUsage(AU);
113 AU.setPreservesAll();
114}
115
Adam Nemet79ac42a2016-07-18 16:29:21 +0000116char OptimizationRemarkEmitterAnalysis::PassID;
117
118OptimizationRemarkEmitter
Adam Nemet78d10912016-07-20 21:44:18 +0000119OptimizationRemarkEmitterAnalysis::run(Function &F,
120 AnalysisManager<Function> &AM) {
Adam Nemet79ac42a2016-07-18 16:29:21 +0000121 BlockFrequencyInfo *BFI;
122
123 if (F.getContext().getDiagnosticHotnessRequested())
124 BFI = &AM.getResult<BlockFrequencyAnalysis>(F);
125 else
126 BFI = nullptr;
127
128 return OptimizationRemarkEmitter(&F, BFI);
129}
130
131char OptimizationRemarkEmitterWrapperPass::ID = 0;
Adam Nemetaad81602016-07-15 17:23:20 +0000132static const char ore_name[] = "Optimization Remark Emitter";
133#define ORE_NAME "opt-remark-emitter"
134
Adam Nemet79ac42a2016-07-18 16:29:21 +0000135INITIALIZE_PASS_BEGIN(OptimizationRemarkEmitterWrapperPass, ORE_NAME, ore_name,
136 false, true)
Adam Nemetaad81602016-07-15 17:23:20 +0000137INITIALIZE_PASS_DEPENDENCY(LazyBFIPass)
Adam Nemet79ac42a2016-07-18 16:29:21 +0000138INITIALIZE_PASS_END(OptimizationRemarkEmitterWrapperPass, ORE_NAME, ore_name,
139 false, true)