blob: 5256437da9df531128a4127a25089014819024cc [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(
Adam Nemetcbe2a9b2016-07-21 01:11:12 +000073 const char *PassName, const DebugLoc &DLoc, const Value *V,
74 const Twine &Msg) {
Adam Nemet0e0e2d52016-07-20 23:50:32 +000075 LLVMContext &Ctx = F->getContext();
76 Ctx.diagnose(DiagnosticInfoOptimizationRemarkAnalysisFPCommute(
77 PassName, *F, DLoc, Msg, computeHotness(V)));
78}
79
80void OptimizationRemarkEmitter::emitOptimizationRemarkAnalysisAliasing(
Adam Nemetcbe2a9b2016-07-21 01:11:12 +000081 const char *PassName, const DebugLoc &DLoc, const Value *V,
82 const Twine &Msg) {
Adam Nemet0e0e2d52016-07-20 23:50:32 +000083 LLVMContext &Ctx = F->getContext();
84 Ctx.diagnose(DiagnosticInfoOptimizationRemarkAnalysisAliasing(
85 PassName, *F, DLoc, Msg, computeHotness(V)));
86}
87
88void OptimizationRemarkEmitter::emitOptimizationRemarkAnalysisAliasing(
89 const char *PassName, Loop *L, const Twine &Msg) {
90 emitOptimizationRemarkAnalysisAliasing(PassName, L->getStartLoc(),
91 L->getHeader(), Msg);
92}
93
Adam Nemet79ac42a2016-07-18 16:29:21 +000094OptimizationRemarkEmitterWrapperPass::OptimizationRemarkEmitterWrapperPass()
95 : FunctionPass(ID) {
96 initializeOptimizationRemarkEmitterWrapperPassPass(
97 *PassRegistry::getPassRegistry());
98}
99
100bool OptimizationRemarkEmitterWrapperPass::runOnFunction(Function &Fn) {
101 BlockFrequencyInfo *BFI;
Adam Nemetaad81602016-07-15 17:23:20 +0000102
103 if (Fn.getContext().getDiagnosticHotnessRequested())
104 BFI = &getAnalysis<LazyBlockFrequencyInfoPass>().getBFI();
105 else
106 BFI = nullptr;
107
Adam Nemet79ac42a2016-07-18 16:29:21 +0000108 ORE = llvm::make_unique<OptimizationRemarkEmitter>(&Fn, BFI);
Adam Nemetaad81602016-07-15 17:23:20 +0000109 return false;
110}
111
Adam Nemet79ac42a2016-07-18 16:29:21 +0000112void OptimizationRemarkEmitterWrapperPass::getAnalysisUsage(
113 AnalysisUsage &AU) const {
Adam Nemetaad81602016-07-15 17:23:20 +0000114 LazyBlockFrequencyInfoPass::getLazyBFIAnalysisUsage(AU);
115 AU.setPreservesAll();
116}
117
Adam Nemet79ac42a2016-07-18 16:29:21 +0000118char OptimizationRemarkEmitterAnalysis::PassID;
119
120OptimizationRemarkEmitter
Adam Nemet78d10912016-07-20 21:44:18 +0000121OptimizationRemarkEmitterAnalysis::run(Function &F,
Sean Silva36e0d012016-08-09 00:28:15 +0000122 FunctionAnalysisManager &AM) {
Adam Nemet79ac42a2016-07-18 16:29:21 +0000123 BlockFrequencyInfo *BFI;
124
125 if (F.getContext().getDiagnosticHotnessRequested())
126 BFI = &AM.getResult<BlockFrequencyAnalysis>(F);
127 else
128 BFI = nullptr;
129
130 return OptimizationRemarkEmitter(&F, BFI);
131}
132
133char OptimizationRemarkEmitterWrapperPass::ID = 0;
Adam Nemetaad81602016-07-15 17:23:20 +0000134static const char ore_name[] = "Optimization Remark Emitter";
135#define ORE_NAME "opt-remark-emitter"
136
Adam Nemet79ac42a2016-07-18 16:29:21 +0000137INITIALIZE_PASS_BEGIN(OptimizationRemarkEmitterWrapperPass, ORE_NAME, ore_name,
138 false, true)
Adam Nemetaad81602016-07-15 17:23:20 +0000139INITIALIZE_PASS_DEPENDENCY(LazyBFIPass)
Adam Nemet79ac42a2016-07-18 16:29:21 +0000140INITIALIZE_PASS_END(OptimizationRemarkEmitterWrapperPass, ORE_NAME, ore_name,
141 false, true)