blob: cd6a93668010d2a1035384d951665446c01f8aa7 [file] [log] [blame]
Adam Nemet0965da22017-10-09 23:19:02 +00001//===- OptimizationRemarkEmitter.cpp - Optimization Diagnostic --*- C++ -*-===//
Adam Nemetaad81602016-07-15 17:23:20 +00002//
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
Adam Nemet0965da22017-10-09 23:19:02 +000015#include "llvm/Analysis/OptimizationRemarkEmitter.h"
Adam Nemet896c09b2016-08-10 00:44:44 +000016#include "llvm/Analysis/BranchProbabilityInfo.h"
Adam Nemetaad81602016-07-15 17:23:20 +000017#include "llvm/Analysis/LazyBlockFrequencyInfo.h"
18#include "llvm/Analysis/LoopInfo.h"
Adam Nemeta62b7e12016-09-27 20:55:07 +000019#include "llvm/IR/DebugInfo.h"
Adam Nemetaad81602016-07-15 17:23:20 +000020#include "llvm/IR/DiagnosticInfo.h"
Adam Nemet896c09b2016-08-10 00:44:44 +000021#include "llvm/IR/Dominators.h"
Adam Nemetaad81602016-07-15 17:23:20 +000022#include "llvm/IR/LLVMContext.h"
23
24using namespace llvm;
25
Justin Bogner8281c812017-02-22 07:38:17 +000026OptimizationRemarkEmitter::OptimizationRemarkEmitter(const Function *F)
Adam Nemet896c09b2016-08-10 00:44:44 +000027 : F(F), BFI(nullptr) {
Brian Gesiak44e5f6c2017-06-30 18:13:59 +000028 if (!F->getContext().getDiagnosticsHotnessRequested())
Adam Nemet896c09b2016-08-10 00:44:44 +000029 return;
30
31 // First create a dominator tree.
32 DominatorTree DT;
Justin Bogner8281c812017-02-22 07:38:17 +000033 DT.recalculate(*const_cast<Function *>(F));
Adam Nemet896c09b2016-08-10 00:44:44 +000034
35 // Generate LoopInfo from it.
36 LoopInfo LI;
37 LI.analyze(DT);
38
39 // Then compute BranchProbabilityInfo.
40 BranchProbabilityInfo BPI;
41 BPI.calculate(*F, LI);
42
43 // Finally compute BFI.
44 OwnedBFI = llvm::make_unique<BlockFrequencyInfo>(*F, BPI, LI);
45 BFI = OwnedBFI.get();
46}
47
Chandler Carruth1ae34c32017-01-15 08:20:50 +000048bool OptimizationRemarkEmitter::invalidate(
49 Function &F, const PreservedAnalyses &PA,
50 FunctionAnalysisManager::Invalidator &Inv) {
51 // This analysis has no state and so can be trivially preserved but it needs
52 // a fresh view of BFI if it was constructed with one.
53 if (BFI && Inv.invalidate<BlockFrequencyAnalysis>(F, PA))
54 return true;
55
56 // Otherwise this analysis result remains valid.
57 return false;
58}
59
Adam Nemet6100d162016-07-20 21:44:22 +000060Optional<uint64_t> OptimizationRemarkEmitter::computeHotness(const Value *V) {
Adam Nemetaad81602016-07-15 17:23:20 +000061 if (!BFI)
62 return None;
63
64 return BFI->getBlockProfileCount(cast<BasicBlock>(V));
65}
66
Adam Nemeta62b7e12016-09-27 20:55:07 +000067void OptimizationRemarkEmitter::computeHotness(
Adam Nemet484f93d2017-01-25 23:20:25 +000068 DiagnosticInfoIROptimization &OptDiag) {
Justin Bogner8281c812017-02-22 07:38:17 +000069 const Value *V = OptDiag.getCodeRegion();
Adam Nemeta62b7e12016-09-27 20:55:07 +000070 if (V)
71 OptDiag.setHotness(computeHotness(V));
72}
73
Adam Nemet484f93d2017-01-25 23:20:25 +000074void OptimizationRemarkEmitter::emit(
75 DiagnosticInfoOptimizationBase &OptDiagBase) {
76 auto &OptDiag = cast<DiagnosticInfoIROptimization>(OptDiagBase);
Adam Nemeta62b7e12016-09-27 20:55:07 +000077 computeHotness(OptDiag);
Brian Gesiak4ef3daa2017-06-30 23:14:53 +000078 // If a diagnostic has a hotness value, then only emit it if its hotness
79 // meets the threshold.
80 if (OptDiag.getHotness() &&
81 *OptDiag.getHotness() <
82 F->getContext().getDiagnosticsHotnessThreshold()) {
83 return;
84 }
Adam Nemeta62b7e12016-09-27 20:55:07 +000085
Adam Nemetf31b1f32017-10-04 04:26:23 +000086 F->getContext().diagnose(OptDiag);
Adam Nemeta62b7e12016-09-27 20:55:07 +000087}
88
Adam Nemet79ac42a2016-07-18 16:29:21 +000089OptimizationRemarkEmitterWrapperPass::OptimizationRemarkEmitterWrapperPass()
90 : FunctionPass(ID) {
91 initializeOptimizationRemarkEmitterWrapperPassPass(
92 *PassRegistry::getPassRegistry());
93}
94
95bool OptimizationRemarkEmitterWrapperPass::runOnFunction(Function &Fn) {
96 BlockFrequencyInfo *BFI;
Adam Nemetaad81602016-07-15 17:23:20 +000097
Brian Gesiak44e5f6c2017-06-30 18:13:59 +000098 if (Fn.getContext().getDiagnosticsHotnessRequested())
Adam Nemetaad81602016-07-15 17:23:20 +000099 BFI = &getAnalysis<LazyBlockFrequencyInfoPass>().getBFI();
100 else
101 BFI = nullptr;
102
Adam Nemet79ac42a2016-07-18 16:29:21 +0000103 ORE = llvm::make_unique<OptimizationRemarkEmitter>(&Fn, BFI);
Adam Nemetaad81602016-07-15 17:23:20 +0000104 return false;
105}
106
Adam Nemet79ac42a2016-07-18 16:29:21 +0000107void OptimizationRemarkEmitterWrapperPass::getAnalysisUsage(
108 AnalysisUsage &AU) const {
Adam Nemetaad81602016-07-15 17:23:20 +0000109 LazyBlockFrequencyInfoPass::getLazyBFIAnalysisUsage(AU);
110 AU.setPreservesAll();
111}
112
Chandler Carruthdab4eae2016-11-23 17:53:26 +0000113AnalysisKey OptimizationRemarkEmitterAnalysis::Key;
Adam Nemet79ac42a2016-07-18 16:29:21 +0000114
115OptimizationRemarkEmitter
Adam Nemet78d10912016-07-20 21:44:18 +0000116OptimizationRemarkEmitterAnalysis::run(Function &F,
Sean Silva36e0d012016-08-09 00:28:15 +0000117 FunctionAnalysisManager &AM) {
Adam Nemet79ac42a2016-07-18 16:29:21 +0000118 BlockFrequencyInfo *BFI;
119
Brian Gesiak44e5f6c2017-06-30 18:13:59 +0000120 if (F.getContext().getDiagnosticsHotnessRequested())
Adam Nemet79ac42a2016-07-18 16:29:21 +0000121 BFI = &AM.getResult<BlockFrequencyAnalysis>(F);
122 else
123 BFI = nullptr;
124
125 return OptimizationRemarkEmitter(&F, BFI);
126}
127
128char OptimizationRemarkEmitterWrapperPass::ID = 0;
Adam Nemetaad81602016-07-15 17:23:20 +0000129static const char ore_name[] = "Optimization Remark Emitter";
130#define ORE_NAME "opt-remark-emitter"
131
Adam Nemet79ac42a2016-07-18 16:29:21 +0000132INITIALIZE_PASS_BEGIN(OptimizationRemarkEmitterWrapperPass, ORE_NAME, ore_name,
133 false, true)
Adam Nemetaad81602016-07-15 17:23:20 +0000134INITIALIZE_PASS_DEPENDENCY(LazyBFIPass)
Adam Nemet79ac42a2016-07-18 16:29:21 +0000135INITIALIZE_PASS_END(OptimizationRemarkEmitterWrapperPass, ORE_NAME, ore_name,
136 false, true)