blob: 4eefdd72b7e43397f6b33c678073df2070f51cb3 [file] [log] [blame]
Stephen Hines651f13c2014-04-23 16:59:28 -07001//===--- CodeGenPGO.cpp - PGO Instrumentation for LLVM CodeGen --*- 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// Instrumentation-based profile-guided optimization
11//
12//===----------------------------------------------------------------------===//
13
14#include "CodeGenPGO.h"
15#include "CodeGenFunction.h"
Stephen Hines176edba2014-12-01 14:53:08 -080016#include "CoverageMappingGen.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070017#include "clang/AST/RecursiveASTVisitor.h"
18#include "clang/AST/StmtVisitor.h"
Stephen Hines0e2c34f2015-03-23 12:09:02 -070019#include "llvm/IR/Intrinsics.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070020#include "llvm/IR/MDBuilder.h"
Stephen Hines6bcf27b2014-05-29 04:14:42 -070021#include "llvm/Support/Endian.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070022#include "llvm/Support/FileSystem.h"
Stephen Hines6bcf27b2014-05-29 04:14:42 -070023#include "llvm/Support/MD5.h"
Stephen Hines651f13c2014-04-23 16:59:28 -070024
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070025static llvm::cl::opt<bool> EnableValueProfiling(
26 "enable-value-profiling", llvm::cl::ZeroOrMore,
27 llvm::cl::desc("Enable value profiling"), llvm::cl::init(false));
28
Stephen Hines651f13c2014-04-23 16:59:28 -070029using namespace clang;
30using namespace CodeGen;
31
Stephen Hines176edba2014-12-01 14:53:08 -080032void CodeGenPGO::setFuncName(StringRef Name,
33 llvm::GlobalValue::LinkageTypes Linkage) {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080034 llvm::IndexedInstrProfReader *PGOReader = CGM.getPGOReader();
35 FuncName = llvm::getPGOFuncName(
36 Name, Linkage, CGM.getCodeGenOpts().MainFileName,
37 PGOReader ? PGOReader->getVersion() : llvm::IndexedInstrProf::Version);
Stephen Hines651f13c2014-04-23 16:59:28 -070038
Stephen Hines0e2c34f2015-03-23 12:09:02 -070039 // If we're generating a profile, create a variable for the name.
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070040 if (CGM.getCodeGenOpts().hasProfileClangInstr())
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -080041 FuncNameVar = llvm::createPGOFuncNameVar(CGM.getModule(), Linkage, FuncName);
Stephen Hines651f13c2014-04-23 16:59:28 -070042}
43
Stephen Hines176edba2014-12-01 14:53:08 -080044void CodeGenPGO::setFuncName(llvm::Function *Fn) {
45 setFuncName(Fn->getName(), Fn->getLinkage());
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070046 // Create PGOFuncName meta data.
47 llvm::createPGOFuncNameMetadata(*Fn, FuncName);
Stephen Hines176edba2014-12-01 14:53:08 -080048}
49
Stephen Hines651f13c2014-04-23 16:59:28 -070050namespace {
Stephen Hines6bcf27b2014-05-29 04:14:42 -070051/// \brief Stable hasher for PGO region counters.
52///
53/// PGOHash produces a stable hash of a given function's control flow.
54///
55/// Changing the output of this hash will invalidate all previously generated
56/// profiles -- i.e., don't do it.
57///
58/// \note When this hash does eventually change (years?), we still need to
59/// support old hashes. We'll need to pull in the version number from the
60/// profile data format and use the matching hash function.
61class PGOHash {
62 uint64_t Working;
63 unsigned Count;
64 llvm::MD5 MD5;
65
66 static const int NumBitsPerType = 6;
67 static const unsigned NumTypesPerWord = sizeof(uint64_t) * 8 / NumBitsPerType;
68 static const unsigned TooBig = 1u << NumBitsPerType;
69
70public:
71 /// \brief Hash values for AST nodes.
72 ///
73 /// Distinct values for AST nodes that have region counters attached.
74 ///
75 /// These values must be stable. All new members must be added at the end,
76 /// and no members should be removed. Changing the enumeration value for an
77 /// AST node will affect the hash of every function that contains that node.
78 enum HashType : unsigned char {
79 None = 0,
80 LabelStmt = 1,
81 WhileStmt,
82 DoStmt,
83 ForStmt,
84 CXXForRangeStmt,
85 ObjCForCollectionStmt,
86 SwitchStmt,
87 CaseStmt,
88 DefaultStmt,
89 IfStmt,
90 CXXTryStmt,
91 CXXCatchStmt,
92 ConditionalOperator,
93 BinaryOperatorLAnd,
94 BinaryOperatorLOr,
95 BinaryConditionalOperator,
96
97 // Keep this last. It's for the static assert that follows.
98 LastHashType
99 };
100 static_assert(LastHashType <= TooBig, "Too many types in HashType");
101
102 // TODO: When this format changes, take in a version number here, and use the
103 // old hash calculation for file formats that used the old hash.
104 PGOHash() : Working(0), Count(0) {}
105 void combine(HashType Type);
106 uint64_t finalize();
107};
108const int PGOHash::NumBitsPerType;
109const unsigned PGOHash::NumTypesPerWord;
110const unsigned PGOHash::TooBig;
111
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700112/// A RecursiveASTVisitor that fills a map of statements to PGO counters.
113struct MapRegionCounters : public RecursiveASTVisitor<MapRegionCounters> {
114 /// The next counter value to assign.
115 unsigned NextCounter;
116 /// The function hash.
117 PGOHash Hash;
118 /// The map of statements to counters.
119 llvm::DenseMap<const Stmt *, unsigned> &CounterMap;
Stephen Hines651f13c2014-04-23 16:59:28 -0700120
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700121 MapRegionCounters(llvm::DenseMap<const Stmt *, unsigned> &CounterMap)
122 : NextCounter(0), CounterMap(CounterMap) {}
Stephen Hines651f13c2014-04-23 16:59:28 -0700123
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700124 // Blocks and lambdas are handled as separate functions, so we need not
125 // traverse them in the parent context.
126 bool TraverseBlockExpr(BlockExpr *BE) { return true; }
127 bool TraverseLambdaBody(LambdaExpr *LE) { return true; }
128 bool TraverseCapturedStmt(CapturedStmt *CS) { return true; }
Stephen Hines651f13c2014-04-23 16:59:28 -0700129
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700130 bool VisitDecl(const Decl *D) {
131 switch (D->getKind()) {
132 default:
133 break;
134 case Decl::Function:
135 case Decl::CXXMethod:
136 case Decl::CXXConstructor:
137 case Decl::CXXDestructor:
138 case Decl::CXXConversion:
139 case Decl::ObjCMethod:
140 case Decl::Block:
141 case Decl::Captured:
142 CounterMap[D->getBody()] = NextCounter++;
143 break;
144 }
145 return true;
146 }
147
148 bool VisitStmt(const Stmt *S) {
149 auto Type = getHashType(S);
150 if (Type == PGOHash::None)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700151 return true;
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700152
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700153 CounterMap[S] = NextCounter++;
154 Hash.combine(Type);
155 return true;
156 }
157 PGOHash::HashType getHashType(const Stmt *S) {
158 switch (S->getStmtClass()) {
159 default:
160 break;
161 case Stmt::LabelStmtClass:
162 return PGOHash::LabelStmt;
163 case Stmt::WhileStmtClass:
164 return PGOHash::WhileStmt;
165 case Stmt::DoStmtClass:
166 return PGOHash::DoStmt;
167 case Stmt::ForStmtClass:
168 return PGOHash::ForStmt;
169 case Stmt::CXXForRangeStmtClass:
170 return PGOHash::CXXForRangeStmt;
171 case Stmt::ObjCForCollectionStmtClass:
172 return PGOHash::ObjCForCollectionStmt;
173 case Stmt::SwitchStmtClass:
174 return PGOHash::SwitchStmt;
175 case Stmt::CaseStmtClass:
176 return PGOHash::CaseStmt;
177 case Stmt::DefaultStmtClass:
178 return PGOHash::DefaultStmt;
179 case Stmt::IfStmtClass:
180 return PGOHash::IfStmt;
181 case Stmt::CXXTryStmtClass:
182 return PGOHash::CXXTryStmt;
183 case Stmt::CXXCatchStmtClass:
184 return PGOHash::CXXCatchStmt;
185 case Stmt::ConditionalOperatorClass:
186 return PGOHash::ConditionalOperator;
187 case Stmt::BinaryConditionalOperatorClass:
188 return PGOHash::BinaryConditionalOperator;
189 case Stmt::BinaryOperatorClass: {
190 const BinaryOperator *BO = cast<BinaryOperator>(S);
191 if (BO->getOpcode() == BO_LAnd)
192 return PGOHash::BinaryOperatorLAnd;
193 if (BO->getOpcode() == BO_LOr)
194 return PGOHash::BinaryOperatorLOr;
195 break;
196 }
197 }
198 return PGOHash::None;
199 }
200};
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700201
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700202/// A StmtVisitor that propagates the raw counts through the AST and
203/// records the count at statements where the value may change.
204struct ComputeRegionCounts : public ConstStmtVisitor<ComputeRegionCounts> {
205 /// PGO state.
206 CodeGenPGO &PGO;
207
208 /// A flag that is set when the current count should be recorded on the
209 /// next statement, such as at the exit of a loop.
210 bool RecordNextStmtCount;
211
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700212 /// The count at the current location in the traversal.
213 uint64_t CurrentCount;
214
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700215 /// The map of statements to count values.
216 llvm::DenseMap<const Stmt *, uint64_t> &CountMap;
217
218 /// BreakContinueStack - Keep counts of breaks and continues inside loops.
219 struct BreakContinue {
220 uint64_t BreakCount;
221 uint64_t ContinueCount;
222 BreakContinue() : BreakCount(0), ContinueCount(0) {}
Stephen Hines651f13c2014-04-23 16:59:28 -0700223 };
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700224 SmallVector<BreakContinue, 8> BreakContinueStack;
Stephen Hines651f13c2014-04-23 16:59:28 -0700225
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700226 ComputeRegionCounts(llvm::DenseMap<const Stmt *, uint64_t> &CountMap,
227 CodeGenPGO &PGO)
228 : PGO(PGO), RecordNextStmtCount(false), CountMap(CountMap) {}
Stephen Hines651f13c2014-04-23 16:59:28 -0700229
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700230 void RecordStmtCount(const Stmt *S) {
231 if (RecordNextStmtCount) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700232 CountMap[S] = CurrentCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700233 RecordNextStmtCount = false;
Stephen Hines651f13c2014-04-23 16:59:28 -0700234 }
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700235 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700236
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700237 /// Set and return the current count.
238 uint64_t setCount(uint64_t Count) {
239 CurrentCount = Count;
240 return Count;
241 }
242
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700243 void VisitStmt(const Stmt *S) {
244 RecordStmtCount(S);
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800245 for (const Stmt *Child : S->children())
246 if (Child)
247 this->Visit(Child);
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700248 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700249
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700250 void VisitFunctionDecl(const FunctionDecl *D) {
251 // Counter tracks entry to the function body.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700252 uint64_t BodyCount = setCount(PGO.getRegionCount(D->getBody()));
253 CountMap[D->getBody()] = BodyCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700254 Visit(D->getBody());
255 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700256
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700257 // Skip lambda expressions. We visit these as FunctionDecls when we're
258 // generating them and aren't interested in the body when generating a
259 // parent context.
260 void VisitLambdaExpr(const LambdaExpr *LE) {}
Stephen Hines651f13c2014-04-23 16:59:28 -0700261
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700262 void VisitCapturedDecl(const CapturedDecl *D) {
263 // Counter tracks entry to the capture body.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700264 uint64_t BodyCount = setCount(PGO.getRegionCount(D->getBody()));
265 CountMap[D->getBody()] = BodyCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700266 Visit(D->getBody());
267 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700268
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700269 void VisitObjCMethodDecl(const ObjCMethodDecl *D) {
270 // Counter tracks entry to the method body.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700271 uint64_t BodyCount = setCount(PGO.getRegionCount(D->getBody()));
272 CountMap[D->getBody()] = BodyCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700273 Visit(D->getBody());
274 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700275
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700276 void VisitBlockDecl(const BlockDecl *D) {
277 // Counter tracks entry to the block body.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700278 uint64_t BodyCount = setCount(PGO.getRegionCount(D->getBody()));
279 CountMap[D->getBody()] = BodyCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700280 Visit(D->getBody());
281 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700282
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700283 void VisitReturnStmt(const ReturnStmt *S) {
284 RecordStmtCount(S);
285 if (S->getRetValue())
286 Visit(S->getRetValue());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700287 CurrentCount = 0;
288 RecordNextStmtCount = true;
289 }
290
291 void VisitCXXThrowExpr(const CXXThrowExpr *E) {
292 RecordStmtCount(E);
293 if (E->getSubExpr())
294 Visit(E->getSubExpr());
295 CurrentCount = 0;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700296 RecordNextStmtCount = true;
297 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700298
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700299 void VisitGotoStmt(const GotoStmt *S) {
300 RecordStmtCount(S);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700301 CurrentCount = 0;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700302 RecordNextStmtCount = true;
303 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700304
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700305 void VisitLabelStmt(const LabelStmt *S) {
306 RecordNextStmtCount = false;
307 // Counter tracks the block following the label.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700308 uint64_t BlockCount = setCount(PGO.getRegionCount(S));
309 CountMap[S] = BlockCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700310 Visit(S->getSubStmt());
311 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700312
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700313 void VisitBreakStmt(const BreakStmt *S) {
314 RecordStmtCount(S);
315 assert(!BreakContinueStack.empty() && "break not in a loop or switch!");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700316 BreakContinueStack.back().BreakCount += CurrentCount;
317 CurrentCount = 0;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700318 RecordNextStmtCount = true;
319 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700320
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700321 void VisitContinueStmt(const ContinueStmt *S) {
322 RecordStmtCount(S);
323 assert(!BreakContinueStack.empty() && "continue stmt not in a loop!");
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700324 BreakContinueStack.back().ContinueCount += CurrentCount;
325 CurrentCount = 0;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700326 RecordNextStmtCount = true;
327 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700328
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700329 void VisitWhileStmt(const WhileStmt *S) {
330 RecordStmtCount(S);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700331 uint64_t ParentCount = CurrentCount;
332
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700333 BreakContinueStack.push_back(BreakContinue());
334 // Visit the body region first so the break/continue adjustments can be
335 // included when visiting the condition.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700336 uint64_t BodyCount = setCount(PGO.getRegionCount(S));
337 CountMap[S->getBody()] = CurrentCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700338 Visit(S->getBody());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700339 uint64_t BackedgeCount = CurrentCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700340
341 // ...then go back and propagate counts through the condition. The count
342 // at the start of the condition is the sum of the incoming edges,
343 // the backedge from the end of the loop body, and the edges from
344 // continue statements.
345 BreakContinue BC = BreakContinueStack.pop_back_val();
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700346 uint64_t CondCount =
347 setCount(ParentCount + BackedgeCount + BC.ContinueCount);
348 CountMap[S->getCond()] = CondCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700349 Visit(S->getCond());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700350 setCount(BC.BreakCount + CondCount - BodyCount);
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700351 RecordNextStmtCount = true;
352 }
353
354 void VisitDoStmt(const DoStmt *S) {
355 RecordStmtCount(S);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700356 uint64_t LoopCount = PGO.getRegionCount(S);
357
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700358 BreakContinueStack.push_back(BreakContinue());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700359 // The count doesn't include the fallthrough from the parent scope. Add it.
360 uint64_t BodyCount = setCount(LoopCount + CurrentCount);
361 CountMap[S->getBody()] = BodyCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700362 Visit(S->getBody());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700363 uint64_t BackedgeCount = CurrentCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700364
365 BreakContinue BC = BreakContinueStack.pop_back_val();
366 // The count at the start of the condition is equal to the count at the
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700367 // end of the body, plus any continues.
368 uint64_t CondCount = setCount(BackedgeCount + BC.ContinueCount);
369 CountMap[S->getCond()] = CondCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700370 Visit(S->getCond());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700371 setCount(BC.BreakCount + CondCount - LoopCount);
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700372 RecordNextStmtCount = true;
373 }
374
375 void VisitForStmt(const ForStmt *S) {
376 RecordStmtCount(S);
377 if (S->getInit())
378 Visit(S->getInit());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700379
380 uint64_t ParentCount = CurrentCount;
381
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700382 BreakContinueStack.push_back(BreakContinue());
383 // Visit the body region first. (This is basically the same as a while
384 // loop; see further comments in VisitWhileStmt.)
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700385 uint64_t BodyCount = setCount(PGO.getRegionCount(S));
386 CountMap[S->getBody()] = BodyCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700387 Visit(S->getBody());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700388 uint64_t BackedgeCount = CurrentCount;
389 BreakContinue BC = BreakContinueStack.pop_back_val();
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700390
391 // The increment is essentially part of the body but it needs to include
392 // the count for all the continue statements.
393 if (S->getInc()) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700394 uint64_t IncCount = setCount(BackedgeCount + BC.ContinueCount);
395 CountMap[S->getInc()] = IncCount;
Stephen Hines651f13c2014-04-23 16:59:28 -0700396 Visit(S->getInc());
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700397 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700398
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700399 // ...then go back and propagate counts through the condition.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700400 uint64_t CondCount =
401 setCount(ParentCount + BackedgeCount + BC.ContinueCount);
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700402 if (S->getCond()) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700403 CountMap[S->getCond()] = CondCount;
Stephen Hines651f13c2014-04-23 16:59:28 -0700404 Visit(S->getCond());
Stephen Hines651f13c2014-04-23 16:59:28 -0700405 }
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700406 setCount(BC.BreakCount + CondCount - BodyCount);
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700407 RecordNextStmtCount = true;
408 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700409
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700410 void VisitCXXForRangeStmt(const CXXForRangeStmt *S) {
411 RecordStmtCount(S);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700412 Visit(S->getLoopVarStmt());
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700413 Visit(S->getRangeStmt());
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700414 Visit(S->getBeginStmt());
415 Visit(S->getEndStmt());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700416
417 uint64_t ParentCount = CurrentCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700418 BreakContinueStack.push_back(BreakContinue());
419 // Visit the body region first. (This is basically the same as a while
420 // loop; see further comments in VisitWhileStmt.)
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700421 uint64_t BodyCount = setCount(PGO.getRegionCount(S));
422 CountMap[S->getBody()] = BodyCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700423 Visit(S->getBody());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700424 uint64_t BackedgeCount = CurrentCount;
425 BreakContinue BC = BreakContinueStack.pop_back_val();
Stephen Hines651f13c2014-04-23 16:59:28 -0700426
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700427 // The increment is essentially part of the body but it needs to include
428 // the count for all the continue statements.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700429 uint64_t IncCount = setCount(BackedgeCount + BC.ContinueCount);
430 CountMap[S->getInc()] = IncCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700431 Visit(S->getInc());
Stephen Hines651f13c2014-04-23 16:59:28 -0700432
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700433 // ...then go back and propagate counts through the condition.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700434 uint64_t CondCount =
435 setCount(ParentCount + BackedgeCount + BC.ContinueCount);
436 CountMap[S->getCond()] = CondCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700437 Visit(S->getCond());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700438 setCount(BC.BreakCount + CondCount - BodyCount);
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700439 RecordNextStmtCount = true;
440 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700441
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700442 void VisitObjCForCollectionStmt(const ObjCForCollectionStmt *S) {
443 RecordStmtCount(S);
444 Visit(S->getElement());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700445 uint64_t ParentCount = CurrentCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700446 BreakContinueStack.push_back(BreakContinue());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700447 // Counter tracks the body of the loop.
448 uint64_t BodyCount = setCount(PGO.getRegionCount(S));
449 CountMap[S->getBody()] = BodyCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700450 Visit(S->getBody());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700451 uint64_t BackedgeCount = CurrentCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700452 BreakContinue BC = BreakContinueStack.pop_back_val();
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700453
454 setCount(BC.BreakCount + ParentCount + BackedgeCount + BC.ContinueCount -
455 BodyCount);
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700456 RecordNextStmtCount = true;
457 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700458
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700459 void VisitSwitchStmt(const SwitchStmt *S) {
460 RecordStmtCount(S);
461 Visit(S->getCond());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700462 CurrentCount = 0;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700463 BreakContinueStack.push_back(BreakContinue());
464 Visit(S->getBody());
465 // If the switch is inside a loop, add the continue counts.
466 BreakContinue BC = BreakContinueStack.pop_back_val();
467 if (!BreakContinueStack.empty())
468 BreakContinueStack.back().ContinueCount += BC.ContinueCount;
469 // Counter tracks the exit block of the switch.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700470 setCount(PGO.getRegionCount(S));
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700471 RecordNextStmtCount = true;
472 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700473
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700474 void VisitSwitchCase(const SwitchCase *S) {
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700475 RecordNextStmtCount = false;
476 // Counter for this particular case. This counts only jumps from the
477 // switch header and does not include fallthrough from the case before
478 // this one.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700479 uint64_t CaseCount = PGO.getRegionCount(S);
480 setCount(CurrentCount + CaseCount);
481 // We need the count without fallthrough in the mapping, so it's more useful
482 // for branch probabilities.
483 CountMap[S] = CaseCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700484 RecordNextStmtCount = true;
485 Visit(S->getSubStmt());
486 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700487
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700488 void VisitIfStmt(const IfStmt *S) {
489 RecordStmtCount(S);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700490 uint64_t ParentCount = CurrentCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700491 Visit(S->getCond());
Stephen Hines651f13c2014-04-23 16:59:28 -0700492
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700493 // Counter tracks the "then" part of an if statement. The count for
494 // the "else" part, if it exists, will be calculated from this counter.
495 uint64_t ThenCount = setCount(PGO.getRegionCount(S));
496 CountMap[S->getThen()] = ThenCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700497 Visit(S->getThen());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700498 uint64_t OutCount = CurrentCount;
Stephen Hines651f13c2014-04-23 16:59:28 -0700499
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700500 uint64_t ElseCount = ParentCount - ThenCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700501 if (S->getElse()) {
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700502 setCount(ElseCount);
503 CountMap[S->getElse()] = ElseCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700504 Visit(S->getElse());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700505 OutCount += CurrentCount;
506 } else
507 OutCount += ElseCount;
508 setCount(OutCount);
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700509 RecordNextStmtCount = true;
510 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700511
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700512 void VisitCXXTryStmt(const CXXTryStmt *S) {
513 RecordStmtCount(S);
514 Visit(S->getTryBlock());
515 for (unsigned I = 0, E = S->getNumHandlers(); I < E; ++I)
516 Visit(S->getHandler(I));
517 // Counter tracks the continuation block of the try statement.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700518 setCount(PGO.getRegionCount(S));
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700519 RecordNextStmtCount = true;
520 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700521
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700522 void VisitCXXCatchStmt(const CXXCatchStmt *S) {
523 RecordNextStmtCount = false;
524 // Counter tracks the catch statement's handler block.
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700525 uint64_t CatchCount = setCount(PGO.getRegionCount(S));
526 CountMap[S] = CatchCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700527 Visit(S->getHandlerBlock());
528 }
529
530 void VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) {
531 RecordStmtCount(E);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700532 uint64_t ParentCount = CurrentCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700533 Visit(E->getCond());
534
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700535 // Counter tracks the "true" part of a conditional operator. The
536 // count in the "false" part will be calculated from this counter.
537 uint64_t TrueCount = setCount(PGO.getRegionCount(E));
538 CountMap[E->getTrueExpr()] = TrueCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700539 Visit(E->getTrueExpr());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700540 uint64_t OutCount = CurrentCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700541
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700542 uint64_t FalseCount = setCount(ParentCount - TrueCount);
543 CountMap[E->getFalseExpr()] = FalseCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700544 Visit(E->getFalseExpr());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700545 OutCount += CurrentCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700546
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700547 setCount(OutCount);
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700548 RecordNextStmtCount = true;
549 }
550
551 void VisitBinLAnd(const BinaryOperator *E) {
552 RecordStmtCount(E);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700553 uint64_t ParentCount = CurrentCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700554 Visit(E->getLHS());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700555 // Counter tracks the right hand side of a logical and operator.
556 uint64_t RHSCount = setCount(PGO.getRegionCount(E));
557 CountMap[E->getRHS()] = RHSCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700558 Visit(E->getRHS());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700559 setCount(ParentCount + RHSCount - CurrentCount);
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700560 RecordNextStmtCount = true;
561 }
562
563 void VisitBinLOr(const BinaryOperator *E) {
564 RecordStmtCount(E);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700565 uint64_t ParentCount = CurrentCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700566 Visit(E->getLHS());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700567 // Counter tracks the right hand side of a logical or operator.
568 uint64_t RHSCount = setCount(PGO.getRegionCount(E));
569 CountMap[E->getRHS()] = RHSCount;
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700570 Visit(E->getRHS());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700571 setCount(ParentCount + RHSCount - CurrentCount);
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700572 RecordNextStmtCount = true;
573 }
574};
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800575} // end anonymous namespace
Stephen Hines651f13c2014-04-23 16:59:28 -0700576
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700577void PGOHash::combine(HashType Type) {
578 // Check that we never combine 0 and only have six bits.
579 assert(Type && "Hash is invalid: unexpected type 0");
580 assert(unsigned(Type) < TooBig && "Hash is invalid: too many types");
581
582 // Pass through MD5 if enough work has built up.
583 if (Count && Count % NumTypesPerWord == 0) {
584 using namespace llvm::support;
585 uint64_t Swapped = endian::byte_swap<uint64_t, little>(Working);
586 MD5.update(llvm::makeArrayRef((uint8_t *)&Swapped, sizeof(Swapped)));
587 Working = 0;
588 }
589
590 // Accumulate the current type.
591 ++Count;
592 Working = Working << NumBitsPerType | Type;
593}
594
595uint64_t PGOHash::finalize() {
596 // Use Working as the hash directly if we never used MD5.
597 if (Count <= NumTypesPerWord)
598 // No need to byte swap here, since none of the math was endian-dependent.
599 // This number will be byte-swapped as required on endianness transitions,
600 // so we will see the same value on the other side.
601 return Working;
602
603 // Check for remaining work in Working.
604 if (Working)
605 MD5.update(Working);
606
607 // Finalize the MD5 and return the hash.
608 llvm::MD5::MD5Result Result;
609 MD5.final(Result);
610 using namespace llvm::support;
611 return endian::read<uint64_t, little, unaligned>(Result);
612}
613
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800614void CodeGenPGO::assignRegionCounters(GlobalDecl GD, llvm::Function *Fn) {
615 const Decl *D = GD.getDecl();
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700616 bool InstrumentRegions = CGM.getCodeGenOpts().hasProfileClangInstr();
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700617 llvm::IndexedInstrProfReader *PGOReader = CGM.getPGOReader();
618 if (!InstrumentRegions && !PGOReader)
Stephen Hines651f13c2014-04-23 16:59:28 -0700619 return;
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700620 if (D->isImplicit())
Stephen Hines651f13c2014-04-23 16:59:28 -0700621 return;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800622 // Constructors and destructors may be represented by several functions in IR.
623 // If so, instrument only base variant, others are implemented by delegation
624 // to the base one, it would be counted twice otherwise.
625 if (CGM.getTarget().getCXXABI().hasConstructorVariants() &&
626 ((isa<CXXConstructorDecl>(GD.getDecl()) &&
627 GD.getCtorType() != Ctor_Base) ||
628 (isa<CXXDestructorDecl>(GD.getDecl()) &&
629 GD.getDtorType() != Dtor_Base))) {
630 return;
631 }
Stephen Hines176edba2014-12-01 14:53:08 -0800632 CGM.ClearUnusedCoverageMapping(D);
Stephen Hines651f13c2014-04-23 16:59:28 -0700633 setFuncName(Fn);
Stephen Hines651f13c2014-04-23 16:59:28 -0700634
635 mapRegionCounters(D);
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700636 if (CGM.getCodeGenOpts().CoverageMapping)
637 emitCounterRegionMapping(D);
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700638 if (PGOReader) {
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700639 SourceManager &SM = CGM.getContext().getSourceManager();
640 loadRegionCounts(PGOReader, SM.isInMainFile(D->getLocation()));
Stephen Hines651f13c2014-04-23 16:59:28 -0700641 computeRegionCounts(D);
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700642 applyFunctionAttributes(PGOReader, Fn);
Stephen Hines651f13c2014-04-23 16:59:28 -0700643 }
644}
645
646void CodeGenPGO::mapRegionCounters(const Decl *D) {
647 RegionCounterMap.reset(new llvm::DenseMap<const Stmt *, unsigned>);
648 MapRegionCounters Walker(*RegionCounterMap);
649 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700650 Walker.TraverseDecl(const_cast<FunctionDecl *>(FD));
Stephen Hines651f13c2014-04-23 16:59:28 -0700651 else if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700652 Walker.TraverseDecl(const_cast<ObjCMethodDecl *>(MD));
Stephen Hines651f13c2014-04-23 16:59:28 -0700653 else if (const BlockDecl *BD = dyn_cast_or_null<BlockDecl>(D))
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700654 Walker.TraverseDecl(const_cast<BlockDecl *>(BD));
655 else if (const CapturedDecl *CD = dyn_cast_or_null<CapturedDecl>(D))
656 Walker.TraverseDecl(const_cast<CapturedDecl *>(CD));
657 assert(Walker.NextCounter > 0 && "no entry counter mapped for decl");
Stephen Hines651f13c2014-04-23 16:59:28 -0700658 NumRegionCounters = Walker.NextCounter;
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700659 FunctionHash = Walker.Hash.finalize();
Stephen Hines651f13c2014-04-23 16:59:28 -0700660}
661
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700662bool CodeGenPGO::skipRegionMappingForDecl(const Decl *D) {
Stephen Hines176edba2014-12-01 14:53:08 -0800663 if (SkipCoverageMapping)
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700664 return true;
665
666 // Don't map the functions in system headers.
667 const auto &SM = CGM.getContext().getSourceManager();
Stephen Hines176edba2014-12-01 14:53:08 -0800668 auto Loc = D->getBody()->getLocStart();
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700669 return SM.isInSystemHeader(Loc);
670}
671
672void CodeGenPGO::emitCounterRegionMapping(const Decl *D) {
673 if (skipRegionMappingForDecl(D))
Stephen Hines176edba2014-12-01 14:53:08 -0800674 return;
675
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700676 std::string CoverageMapping;
Stephen Hines176edba2014-12-01 14:53:08 -0800677 llvm::raw_string_ostream OS(CoverageMapping);
678 CoverageMappingGen MappingGen(*CGM.getCoverageMapping(),
679 CGM.getContext().getSourceManager(),
680 CGM.getLangOpts(), RegionCounterMap.get());
681 MappingGen.emitCounterMapping(D, OS);
682 OS.flush();
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700683
684 if (CoverageMapping.empty())
685 return;
686
687 CGM.getCoverageMapping()->addFunctionMappingRecord(
688 FuncNameVar, FuncName, FunctionHash, CoverageMapping);
Stephen Hines176edba2014-12-01 14:53:08 -0800689}
690
691void
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700692CodeGenPGO::emitEmptyCounterMapping(const Decl *D, StringRef Name,
Stephen Hines176edba2014-12-01 14:53:08 -0800693 llvm::GlobalValue::LinkageTypes Linkage) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700694 if (skipRegionMappingForDecl(D))
Stephen Hines176edba2014-12-01 14:53:08 -0800695 return;
696
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700697 std::string CoverageMapping;
Stephen Hines176edba2014-12-01 14:53:08 -0800698 llvm::raw_string_ostream OS(CoverageMapping);
699 CoverageMappingGen MappingGen(*CGM.getCoverageMapping(),
700 CGM.getContext().getSourceManager(),
701 CGM.getLangOpts());
702 MappingGen.emitEmptyMapping(D, OS);
703 OS.flush();
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700704
705 if (CoverageMapping.empty())
706 return;
707
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700708 setFuncName(Name, Linkage);
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700709 CGM.getCoverageMapping()->addFunctionMappingRecord(
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700710 FuncNameVar, FuncName, FunctionHash, CoverageMapping, false);
Stephen Hines176edba2014-12-01 14:53:08 -0800711}
712
Stephen Hines651f13c2014-04-23 16:59:28 -0700713void CodeGenPGO::computeRegionCounts(const Decl *D) {
714 StmtCountMap.reset(new llvm::DenseMap<const Stmt *, uint64_t>);
715 ComputeRegionCounts Walker(*StmtCountMap, *this);
716 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
717 Walker.VisitFunctionDecl(FD);
718 else if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
719 Walker.VisitObjCMethodDecl(MD);
720 else if (const BlockDecl *BD = dyn_cast_or_null<BlockDecl>(D))
721 Walker.VisitBlockDecl(BD);
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700722 else if (const CapturedDecl *CD = dyn_cast_or_null<CapturedDecl>(D))
723 Walker.VisitCapturedDecl(const_cast<CapturedDecl *>(CD));
Stephen Hines651f13c2014-04-23 16:59:28 -0700724}
725
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700726void
727CodeGenPGO::applyFunctionAttributes(llvm::IndexedInstrProfReader *PGOReader,
728 llvm::Function *Fn) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700729 if (!haveRegionCounts())
730 return;
731
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800732 uint64_t FunctionCount = getRegionCount(nullptr);
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700733 Fn->setEntryCount(FunctionCount);
Stephen Hines651f13c2014-04-23 16:59:28 -0700734}
735
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700736void CodeGenPGO::emitCounterIncrement(CGBuilderTy &Builder, const Stmt *S) {
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700737 if (!CGM.getCodeGenOpts().hasProfileClangInstr() || !RegionCounterMap)
Stephen Hines651f13c2014-04-23 16:59:28 -0700738 return;
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800739 if (!Builder.GetInsertBlock())
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700740 return;
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700741
742 unsigned Counter = (*RegionCounterMap)[S];
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700743 auto *I8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext());
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700744 Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::instrprof_increment),
745 {llvm::ConstantExpr::getBitCast(FuncNameVar, I8PtrTy),
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700746 Builder.getInt64(FunctionHash),
747 Builder.getInt32(NumRegionCounters),
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700748 Builder.getInt32(Counter)});
Stephen Hines651f13c2014-04-23 16:59:28 -0700749}
750
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700751// This method either inserts a call to the profile run-time during
752// instrumentation or puts profile data into metadata for PGO use.
753void CodeGenPGO::valueProfile(CGBuilderTy &Builder, uint32_t ValueKind,
754 llvm::Instruction *ValueSite, llvm::Value *ValuePtr) {
755
756 if (!EnableValueProfiling)
757 return;
758
759 if (!ValuePtr || !ValueSite || !Builder.GetInsertBlock())
760 return;
761
762 if (isa<llvm::Constant>(ValuePtr))
763 return;
764
765 bool InstrumentValueSites = CGM.getCodeGenOpts().hasProfileClangInstr();
766 if (InstrumentValueSites && RegionCounterMap) {
767 auto BuilderInsertPoint = Builder.saveIP();
768 Builder.SetInsertPoint(ValueSite);
769 llvm::Value *Args[5] = {
770 llvm::ConstantExpr::getBitCast(FuncNameVar, Builder.getInt8PtrTy()),
771 Builder.getInt64(FunctionHash),
772 Builder.CreatePtrToInt(ValuePtr, Builder.getInt64Ty()),
773 Builder.getInt32(ValueKind),
774 Builder.getInt32(NumValueSites[ValueKind]++)
775 };
776 Builder.CreateCall(
777 CGM.getIntrinsic(llvm::Intrinsic::instrprof_value_profile), Args);
778 Builder.restoreIP(BuilderInsertPoint);
779 return;
780 }
781
782 llvm::IndexedInstrProfReader *PGOReader = CGM.getPGOReader();
783 if (PGOReader && haveRegionCounts()) {
784 // We record the top most called three functions at each call site.
785 // Profile metadata contains "VP" string identifying this metadata
786 // as value profiling data, then a uint32_t value for the value profiling
787 // kind, a uint64_t value for the total number of times the call is
788 // executed, followed by the function hash and execution count (uint64_t)
789 // pairs for each function.
790 if (NumValueSites[ValueKind] >= ProfRecord->getNumValueSites(ValueKind))
791 return;
792
793 llvm::annotateValueSite(CGM.getModule(), *ValueSite, *ProfRecord,
794 (llvm::InstrProfValueKind)ValueKind,
795 NumValueSites[ValueKind]);
796
797 NumValueSites[ValueKind]++;
798 }
799}
800
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700801void CodeGenPGO::loadRegionCounts(llvm::IndexedInstrProfReader *PGOReader,
802 bool IsInMainFile) {
803 CGM.getPGOStats().addVisited(IsInMainFile);
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700804 RegionCounts.clear();
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700805 llvm::Expected<llvm::InstrProfRecord> RecordExpected =
806 PGOReader->getInstrProfRecord(FuncName, FunctionHash);
807 if (auto E = RecordExpected.takeError()) {
808 auto IPE = llvm::InstrProfError::take(std::move(E));
809 if (IPE == llvm::instrprof_error::unknown_function)
Stephen Hines176edba2014-12-01 14:53:08 -0800810 CGM.getPGOStats().addMissing(IsInMainFile);
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700811 else if (IPE == llvm::instrprof_error::hash_mismatch)
Stephen Hines176edba2014-12-01 14:53:08 -0800812 CGM.getPGOStats().addMismatched(IsInMainFile);
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700813 else if (IPE == llvm::instrprof_error::malformed)
Stephen Hines176edba2014-12-01 14:53:08 -0800814 // TODO: Consider a more specific warning for this case.
815 CGM.getPGOStats().addMismatched(IsInMainFile);
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700816 return;
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700817 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -0700818 ProfRecord =
819 llvm::make_unique<llvm::InstrProfRecord>(std::move(RecordExpected.get()));
820 RegionCounts = ProfRecord->Counts;
Stephen Hines651f13c2014-04-23 16:59:28 -0700821}
822
Stephen Hines651f13c2014-04-23 16:59:28 -0700823/// \brief Calculate what to divide by to scale weights.
824///
825/// Given the maximum weight, calculate a divisor that will scale all the
826/// weights to strictly less than UINT32_MAX.
827static uint64_t calculateWeightScale(uint64_t MaxWeight) {
828 return MaxWeight < UINT32_MAX ? 1 : MaxWeight / UINT32_MAX + 1;
829}
830
831/// \brief Scale an individual branch weight (and add 1).
832///
833/// Scale a 64-bit weight down to 32-bits using \c Scale.
834///
835/// According to Laplace's Rule of Succession, it is better to compute the
836/// weight based on the count plus 1, so universally add 1 to the value.
837///
838/// \pre \c Scale was calculated by \a calculateWeightScale() with a weight no
839/// greater than \c Weight.
840static uint32_t scaleBranchWeight(uint64_t Weight, uint64_t Scale) {
841 assert(Scale && "scale by 0?");
842 uint64_t Scaled = Weight / Scale + 1;
843 assert(Scaled <= UINT32_MAX && "overflow 32-bits");
844 return Scaled;
845}
846
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700847llvm::MDNode *CodeGenFunction::createProfileWeights(uint64_t TrueCount,
848 uint64_t FalseCount) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700849 // Check for empty weights.
850 if (!TrueCount && !FalseCount)
851 return nullptr;
852
853 // Calculate how to scale down to 32-bits.
854 uint64_t Scale = calculateWeightScale(std::max(TrueCount, FalseCount));
855
856 llvm::MDBuilder MDHelper(CGM.getLLVMContext());
857 return MDHelper.createBranchWeights(scaleBranchWeight(TrueCount, Scale),
858 scaleBranchWeight(FalseCount, Scale));
859}
860
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700861llvm::MDNode *
862CodeGenFunction::createProfileWeights(ArrayRef<uint64_t> Weights) {
Stephen Hines651f13c2014-04-23 16:59:28 -0700863 // We need at least two elements to create meaningful weights.
864 if (Weights.size() < 2)
865 return nullptr;
866
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700867 // Check for empty weights.
868 uint64_t MaxWeight = *std::max_element(Weights.begin(), Weights.end());
869 if (MaxWeight == 0)
870 return nullptr;
871
Stephen Hines651f13c2014-04-23 16:59:28 -0700872 // Calculate how to scale down to 32-bits.
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700873 uint64_t Scale = calculateWeightScale(MaxWeight);
Stephen Hines651f13c2014-04-23 16:59:28 -0700874
875 SmallVector<uint32_t, 16> ScaledWeights;
876 ScaledWeights.reserve(Weights.size());
877 for (uint64_t W : Weights)
878 ScaledWeights.push_back(scaleBranchWeight(W, Scale));
879
880 llvm::MDBuilder MDHelper(CGM.getLLVMContext());
881 return MDHelper.createBranchWeights(ScaledWeights);
882}
883
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700884llvm::MDNode *CodeGenFunction::createProfileWeightsForLoop(const Stmt *Cond,
885 uint64_t LoopCount) {
886 if (!PGO.haveRegionCounts())
Stephen Hines651f13c2014-04-23 16:59:28 -0700887 return nullptr;
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700888 Optional<uint64_t> CondCount = PGO.getStmtCount(Cond);
Pirama Arumuga Nainar58878f82015-05-06 11:48:57 -0700889 assert(CondCount.hasValue() && "missing expected loop condition count");
890 if (*CondCount == 0)
Stephen Hines651f13c2014-04-23 16:59:28 -0700891 return nullptr;
Pirama Arumuga Nainarb6d69932015-07-01 12:25:36 -0700892 return createProfileWeights(LoopCount,
893 std::max(*CondCount, LoopCount) - LoopCount);
Stephen Hines651f13c2014-04-23 16:59:28 -0700894}