blob: 48900ac3e8ae7c5f81a5f3ec25bf45d3716de8d5 [file] [log] [blame]
Justin Bogneref512b92014-01-06 22:27:43 +00001//===--- 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"
Alex Lorenzee024992014-08-04 18:41:51 +000016#include "CoverageMappingGen.h"
Justin Bogneref512b92014-01-06 22:27:43 +000017#include "clang/AST/RecursiveASTVisitor.h"
18#include "clang/AST/StmtVisitor.h"
Justin Bogner970ac602014-12-08 19:04:51 +000019#include "llvm/IR/Intrinsics.h"
Justin Bogneref512b92014-01-06 22:27:43 +000020#include "llvm/IR/MDBuilder.h"
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +000021#include "llvm/Support/Endian.h"
Justin Bogneref512b92014-01-06 22:27:43 +000022#include "llvm/Support/FileSystem.h"
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +000023#include "llvm/Support/MD5.h"
Justin Bogneref512b92014-01-06 22:27:43 +000024
Zachary Turner8065f0b2017-12-01 00:53:10 +000025static llvm::cl::opt<bool>
26 EnableValueProfiling("enable-value-profiling", llvm::cl::ZeroOrMore,
27 llvm::cl::desc("Enable value profiling"),
28 llvm::cl::Hidden, llvm::cl::init(false));
Betul Buyukkurt518276a2016-01-23 22:50:44 +000029
Justin Bogneref512b92014-01-06 22:27:43 +000030using namespace clang;
31using namespace CodeGen;
32
Alex Lorenzee024992014-08-04 18:41:51 +000033void CodeGenPGO::setFuncName(StringRef Name,
34 llvm::GlobalValue::LinkageTypes Linkage) {
Xinliang David Lia569e242015-12-05 05:37:15 +000035 llvm::IndexedInstrProfReader *PGOReader = CGM.getPGOReader();
36 FuncName = llvm::getPGOFuncName(
37 Name, Linkage, CGM.getCodeGenOpts().MainFileName,
38 PGOReader ? PGOReader->getVersion() : llvm::IndexedInstrProf::Version);
Justin Bogner970ac602014-12-08 19:04:51 +000039
40 // If we're generating a profile, create a variable for the name.
Rong Xu9837ef52016-02-04 18:39:09 +000041 if (CGM.getCodeGenOpts().hasProfileClangInstr())
Xinliang David Li2d7ec5a2015-11-09 00:04:16 +000042 FuncNameVar = llvm::createPGOFuncNameVar(CGM.getModule(), Linkage, FuncName);
Bob Wilsonda1ebed2014-03-06 04:55:41 +000043}
44
Alex Lorenzee024992014-08-04 18:41:51 +000045void CodeGenPGO::setFuncName(llvm::Function *Fn) {
46 setFuncName(Fn->getName(), Fn->getLinkage());
Rong Xuf932f542016-04-22 21:19:05 +000047 // Create PGOFuncName meta data.
48 llvm::createPGOFuncNameMetadata(*Fn, FuncName);
Alex Lorenzee024992014-08-04 18:41:51 +000049}
50
Vedant Kumar61869712017-11-14 23:56:53 +000051/// The version of the PGO hash algorithm.
52enum PGOHashVersion : unsigned {
53 PGO_HASH_V1,
54 PGO_HASH_V2,
55
56 // Keep this set to the latest hash version.
57 PGO_HASH_LATEST = PGO_HASH_V2
58};
59
Justin Bogneref512b92014-01-06 22:27:43 +000060namespace {
Adrian Prantl9fc8faf2018-05-09 01:00:01 +000061/// Stable hasher for PGO region counters.
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +000062///
63/// PGOHash produces a stable hash of a given function's control flow.
64///
65/// Changing the output of this hash will invalidate all previously generated
66/// profiles -- i.e., don't do it.
67///
68/// \note When this hash does eventually change (years?), we still need to
69/// support old hashes. We'll need to pull in the version number from the
70/// profile data format and use the matching hash function.
71class PGOHash {
72 uint64_t Working;
73 unsigned Count;
Vedant Kumar61869712017-11-14 23:56:53 +000074 PGOHashVersion HashVersion;
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +000075 llvm::MD5 MD5;
76
77 static const int NumBitsPerType = 6;
78 static const unsigned NumTypesPerWord = sizeof(uint64_t) * 8 / NumBitsPerType;
79 static const unsigned TooBig = 1u << NumBitsPerType;
80
81public:
Adrian Prantl9fc8faf2018-05-09 01:00:01 +000082 /// Hash values for AST nodes.
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +000083 ///
84 /// Distinct values for AST nodes that have region counters attached.
85 ///
86 /// These values must be stable. All new members must be added at the end,
87 /// and no members should be removed. Changing the enumeration value for an
88 /// AST node will affect the hash of every function that contains that node.
89 enum HashType : unsigned char {
90 None = 0,
91 LabelStmt = 1,
92 WhileStmt,
93 DoStmt,
94 ForStmt,
95 CXXForRangeStmt,
96 ObjCForCollectionStmt,
97 SwitchStmt,
98 CaseStmt,
99 DefaultStmt,
100 IfStmt,
101 CXXTryStmt,
102 CXXCatchStmt,
103 ConditionalOperator,
104 BinaryOperatorLAnd,
105 BinaryOperatorLOr,
106 BinaryConditionalOperator,
Vedant Kumar61869712017-11-14 23:56:53 +0000107 // The preceding values are available with PGO_HASH_V1.
108
109 EndOfScope,
110 IfThenBranch,
111 IfElseBranch,
112 GotoStmt,
113 IndirectGotoStmt,
114 BreakStmt,
115 ContinueStmt,
116 ReturnStmt,
117 ThrowExpr,
118 UnaryOperatorLNot,
119 BinaryOperatorLT,
120 BinaryOperatorGT,
121 BinaryOperatorLE,
122 BinaryOperatorGE,
123 BinaryOperatorEQ,
124 BinaryOperatorNE,
125 // The preceding values are available with PGO_HASH_V2.
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +0000126
127 // Keep this last. It's for the static assert that follows.
128 LastHashType
129 };
130 static_assert(LastHashType <= TooBig, "Too many types in HashType");
131
Vedant Kumar61869712017-11-14 23:56:53 +0000132 PGOHash(PGOHashVersion HashVersion)
133 : Working(0), Count(0), HashVersion(HashVersion), MD5() {}
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +0000134 void combine(HashType Type);
135 uint64_t finalize();
Vedant Kumar61869712017-11-14 23:56:53 +0000136 PGOHashVersion getHashVersion() const { return HashVersion; }
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +0000137};
138const int PGOHash::NumBitsPerType;
139const unsigned PGOHash::NumTypesPerWord;
140const unsigned PGOHash::TooBig;
141
Vedant Kumar61869712017-11-14 23:56:53 +0000142/// Get the PGO hash version used in the given indexed profile.
143static PGOHashVersion getPGOHashVersion(llvm::IndexedInstrProfReader *PGOReader,
144 CodeGenModule &CGM) {
145 if (PGOReader->getVersion() <= 4)
146 return PGO_HASH_V1;
147 return PGO_HASH_V2;
148}
149
Justin Bognere4ca4412015-02-23 19:27:00 +0000150/// A RecursiveASTVisitor that fills a map of statements to PGO counters.
151struct MapRegionCounters : public RecursiveASTVisitor<MapRegionCounters> {
Vedant Kumar61869712017-11-14 23:56:53 +0000152 using Base = RecursiveASTVisitor<MapRegionCounters>;
153
Justin Bognere4ca4412015-02-23 19:27:00 +0000154 /// The next counter value to assign.
155 unsigned NextCounter;
156 /// The function hash.
157 PGOHash Hash;
158 /// The map of statements to counters.
159 llvm::DenseMap<const Stmt *, unsigned> &CounterMap;
Justin Bogneref512b92014-01-06 22:27:43 +0000160
Vedant Kumar61869712017-11-14 23:56:53 +0000161 MapRegionCounters(PGOHashVersion HashVersion,
162 llvm::DenseMap<const Stmt *, unsigned> &CounterMap)
163 : NextCounter(0), Hash(HashVersion), CounterMap(CounterMap) {}
Justin Bogneref512b92014-01-06 22:27:43 +0000164
Justin Bognere4ca4412015-02-23 19:27:00 +0000165 // Blocks and lambdas are handled as separate functions, so we need not
166 // traverse them in the parent context.
167 bool TraverseBlockExpr(BlockExpr *BE) { return true; }
168 bool TraverseLambdaBody(LambdaExpr *LE) { return true; }
169 bool TraverseCapturedStmt(CapturedStmt *CS) { return true; }
Justin Bogneref512b92014-01-06 22:27:43 +0000170
Justin Bognere4ca4412015-02-23 19:27:00 +0000171 bool VisitDecl(const Decl *D) {
172 switch (D->getKind()) {
173 default:
174 break;
175 case Decl::Function:
176 case Decl::CXXMethod:
177 case Decl::CXXConstructor:
178 case Decl::CXXDestructor:
179 case Decl::CXXConversion:
180 case Decl::ObjCMethod:
181 case Decl::Block:
182 case Decl::Captured:
183 CounterMap[D->getBody()] = NextCounter++;
184 break;
185 }
186 return true;
187 }
188
Vedant Kumar61869712017-11-14 23:56:53 +0000189 /// If \p S gets a fresh counter, update the counter mappings. Return the
190 /// V1 hash of \p S.
191 PGOHash::HashType updateCounterMappings(Stmt *S) {
192 auto Type = getHashType(PGO_HASH_V1, S);
193 if (Type != PGOHash::None)
194 CounterMap[S] = NextCounter++;
195 return Type;
196 }
Bob Wilsond8931422014-04-11 17:16:13 +0000197
Vedant Kumar61869712017-11-14 23:56:53 +0000198 /// Include \p S in the function hash.
199 bool VisitStmt(Stmt *S) {
200 auto Type = updateCounterMappings(S);
201 if (Hash.getHashVersion() != PGO_HASH_V1)
202 Type = getHashType(Hash.getHashVersion(), S);
203 if (Type != PGOHash::None)
204 Hash.combine(Type);
Justin Bognere4ca4412015-02-23 19:27:00 +0000205 return true;
206 }
Vedant Kumar61869712017-11-14 23:56:53 +0000207
208 bool TraverseIfStmt(IfStmt *If) {
209 // If we used the V1 hash, use the default traversal.
210 if (Hash.getHashVersion() == PGO_HASH_V1)
211 return Base::TraverseIfStmt(If);
212
213 // Otherwise, keep track of which branch we're in while traversing.
214 VisitStmt(If);
215 for (Stmt *CS : If->children()) {
216 if (!CS)
217 continue;
218 if (CS == If->getThen())
219 Hash.combine(PGOHash::IfThenBranch);
220 else if (CS == If->getElse())
221 Hash.combine(PGOHash::IfElseBranch);
222 TraverseStmt(CS);
223 }
224 Hash.combine(PGOHash::EndOfScope);
225 return true;
226 }
227
228// If the statement type \p N is nestable, and its nesting impacts profile
229// stability, define a custom traversal which tracks the end of the statement
230// in the hash (provided we're not using the V1 hash).
231#define DEFINE_NESTABLE_TRAVERSAL(N) \
232 bool Traverse##N(N *S) { \
233 Base::Traverse##N(S); \
234 if (Hash.getHashVersion() != PGO_HASH_V1) \
235 Hash.combine(PGOHash::EndOfScope); \
236 return true; \
237 }
238
239 DEFINE_NESTABLE_TRAVERSAL(WhileStmt)
240 DEFINE_NESTABLE_TRAVERSAL(DoStmt)
241 DEFINE_NESTABLE_TRAVERSAL(ForStmt)
242 DEFINE_NESTABLE_TRAVERSAL(CXXForRangeStmt)
243 DEFINE_NESTABLE_TRAVERSAL(ObjCForCollectionStmt)
244 DEFINE_NESTABLE_TRAVERSAL(CXXTryStmt)
245 DEFINE_NESTABLE_TRAVERSAL(CXXCatchStmt)
246
247 /// Get version \p HashVersion of the PGO hash for \p S.
248 PGOHash::HashType getHashType(PGOHashVersion HashVersion, const Stmt *S) {
Justin Bognere4ca4412015-02-23 19:27:00 +0000249 switch (S->getStmtClass()) {
250 default:
251 break;
252 case Stmt::LabelStmtClass:
253 return PGOHash::LabelStmt;
254 case Stmt::WhileStmtClass:
255 return PGOHash::WhileStmt;
256 case Stmt::DoStmtClass:
257 return PGOHash::DoStmt;
258 case Stmt::ForStmtClass:
259 return PGOHash::ForStmt;
260 case Stmt::CXXForRangeStmtClass:
261 return PGOHash::CXXForRangeStmt;
262 case Stmt::ObjCForCollectionStmtClass:
263 return PGOHash::ObjCForCollectionStmt;
264 case Stmt::SwitchStmtClass:
265 return PGOHash::SwitchStmt;
266 case Stmt::CaseStmtClass:
267 return PGOHash::CaseStmt;
268 case Stmt::DefaultStmtClass:
269 return PGOHash::DefaultStmt;
270 case Stmt::IfStmtClass:
271 return PGOHash::IfStmt;
272 case Stmt::CXXTryStmtClass:
273 return PGOHash::CXXTryStmt;
274 case Stmt::CXXCatchStmtClass:
275 return PGOHash::CXXCatchStmt;
276 case Stmt::ConditionalOperatorClass:
277 return PGOHash::ConditionalOperator;
278 case Stmt::BinaryConditionalOperatorClass:
279 return PGOHash::BinaryConditionalOperator;
280 case Stmt::BinaryOperatorClass: {
281 const BinaryOperator *BO = cast<BinaryOperator>(S);
282 if (BO->getOpcode() == BO_LAnd)
283 return PGOHash::BinaryOperatorLAnd;
284 if (BO->getOpcode() == BO_LOr)
285 return PGOHash::BinaryOperatorLOr;
Vedant Kumar61869712017-11-14 23:56:53 +0000286 if (HashVersion == PGO_HASH_V2) {
287 switch (BO->getOpcode()) {
288 default:
289 break;
290 case BO_LT:
291 return PGOHash::BinaryOperatorLT;
292 case BO_GT:
293 return PGOHash::BinaryOperatorGT;
294 case BO_LE:
295 return PGOHash::BinaryOperatorLE;
296 case BO_GE:
297 return PGOHash::BinaryOperatorGE;
298 case BO_EQ:
299 return PGOHash::BinaryOperatorEQ;
300 case BO_NE:
301 return PGOHash::BinaryOperatorNE;
302 }
303 }
Justin Bognere4ca4412015-02-23 19:27:00 +0000304 break;
305 }
306 }
Vedant Kumar61869712017-11-14 23:56:53 +0000307
308 if (HashVersion == PGO_HASH_V2) {
309 switch (S->getStmtClass()) {
310 default:
311 break;
312 case Stmt::GotoStmtClass:
313 return PGOHash::GotoStmt;
314 case Stmt::IndirectGotoStmtClass:
315 return PGOHash::IndirectGotoStmt;
316 case Stmt::BreakStmtClass:
317 return PGOHash::BreakStmt;
318 case Stmt::ContinueStmtClass:
319 return PGOHash::ContinueStmt;
320 case Stmt::ReturnStmtClass:
321 return PGOHash::ReturnStmt;
322 case Stmt::CXXThrowExprClass:
323 return PGOHash::ThrowExpr;
324 case Stmt::UnaryOperatorClass: {
325 const UnaryOperator *UO = cast<UnaryOperator>(S);
326 if (UO->getOpcode() == UO_LNot)
327 return PGOHash::UnaryOperatorLNot;
328 break;
329 }
330 }
331 }
332
Justin Bognere4ca4412015-02-23 19:27:00 +0000333 return PGOHash::None;
334 }
335};
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +0000336
Justin Bognere4ca4412015-02-23 19:27:00 +0000337/// A StmtVisitor that propagates the raw counts through the AST and
338/// records the count at statements where the value may change.
339struct ComputeRegionCounts : public ConstStmtVisitor<ComputeRegionCounts> {
340 /// PGO state.
341 CodeGenPGO &PGO;
342
343 /// A flag that is set when the current count should be recorded on the
344 /// next statement, such as at the exit of a loop.
345 bool RecordNextStmtCount;
346
Justin Bognera909abf2015-05-02 00:48:27 +0000347 /// The count at the current location in the traversal.
348 uint64_t CurrentCount;
349
Justin Bognere4ca4412015-02-23 19:27:00 +0000350 /// The map of statements to count values.
351 llvm::DenseMap<const Stmt *, uint64_t> &CountMap;
352
353 /// BreakContinueStack - Keep counts of breaks and continues inside loops.
354 struct BreakContinue {
355 uint64_t BreakCount;
356 uint64_t ContinueCount;
357 BreakContinue() : BreakCount(0), ContinueCount(0) {}
Justin Bogneref512b92014-01-06 22:27:43 +0000358 };
Justin Bognere4ca4412015-02-23 19:27:00 +0000359 SmallVector<BreakContinue, 8> BreakContinueStack;
Bob Wilsonbf854f02014-02-17 19:21:09 +0000360
Justin Bognere4ca4412015-02-23 19:27:00 +0000361 ComputeRegionCounts(llvm::DenseMap<const Stmt *, uint64_t> &CountMap,
362 CodeGenPGO &PGO)
363 : PGO(PGO), RecordNextStmtCount(false), CountMap(CountMap) {}
Bob Wilsonbf854f02014-02-17 19:21:09 +0000364
Justin Bognere4ca4412015-02-23 19:27:00 +0000365 void RecordStmtCount(const Stmt *S) {
366 if (RecordNextStmtCount) {
Justin Bognera909abf2015-05-02 00:48:27 +0000367 CountMap[S] = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000368 RecordNextStmtCount = false;
Bob Wilsonbf854f02014-02-17 19:21:09 +0000369 }
Justin Bognere4ca4412015-02-23 19:27:00 +0000370 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000371
Justin Bogner07193cc2015-05-01 23:41:09 +0000372 /// Set and return the current count.
373 uint64_t setCount(uint64_t Count) {
Justin Bognera909abf2015-05-02 00:48:27 +0000374 CurrentCount = Count;
Justin Bogner07193cc2015-05-01 23:41:09 +0000375 return Count;
376 }
377
Justin Bognere4ca4412015-02-23 19:27:00 +0000378 void VisitStmt(const Stmt *S) {
379 RecordStmtCount(S);
Benjamin Kramer642f1732015-07-02 21:03:14 +0000380 for (const Stmt *Child : S->children())
381 if (Child)
382 this->Visit(Child);
Justin Bognere4ca4412015-02-23 19:27:00 +0000383 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000384
Justin Bognere4ca4412015-02-23 19:27:00 +0000385 void VisitFunctionDecl(const FunctionDecl *D) {
386 // Counter tracks entry to the function body.
Justin Bogner07193cc2015-05-01 23:41:09 +0000387 uint64_t BodyCount = setCount(PGO.getRegionCount(D->getBody()));
388 CountMap[D->getBody()] = BodyCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000389 Visit(D->getBody());
390 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000391
Justin Bognere4ca4412015-02-23 19:27:00 +0000392 // Skip lambda expressions. We visit these as FunctionDecls when we're
393 // generating them and aren't interested in the body when generating a
394 // parent context.
395 void VisitLambdaExpr(const LambdaExpr *LE) {}
Bob Wilsonbf854f02014-02-17 19:21:09 +0000396
Justin Bognere4ca4412015-02-23 19:27:00 +0000397 void VisitCapturedDecl(const CapturedDecl *D) {
398 // Counter tracks entry to the capture body.
Justin Bogner07193cc2015-05-01 23:41:09 +0000399 uint64_t BodyCount = setCount(PGO.getRegionCount(D->getBody()));
400 CountMap[D->getBody()] = BodyCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000401 Visit(D->getBody());
402 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000403
Justin Bognere4ca4412015-02-23 19:27:00 +0000404 void VisitObjCMethodDecl(const ObjCMethodDecl *D) {
405 // Counter tracks entry to the method body.
Justin Bogner07193cc2015-05-01 23:41:09 +0000406 uint64_t BodyCount = setCount(PGO.getRegionCount(D->getBody()));
407 CountMap[D->getBody()] = BodyCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000408 Visit(D->getBody());
409 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000410
Justin Bognere4ca4412015-02-23 19:27:00 +0000411 void VisitBlockDecl(const BlockDecl *D) {
412 // Counter tracks entry to the block body.
Justin Bogner07193cc2015-05-01 23:41:09 +0000413 uint64_t BodyCount = setCount(PGO.getRegionCount(D->getBody()));
414 CountMap[D->getBody()] = BodyCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000415 Visit(D->getBody());
416 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000417
Justin Bognere4ca4412015-02-23 19:27:00 +0000418 void VisitReturnStmt(const ReturnStmt *S) {
419 RecordStmtCount(S);
420 if (S->getRetValue())
421 Visit(S->getRetValue());
Justin Bognera909abf2015-05-02 00:48:27 +0000422 CurrentCount = 0;
Justin Bognere4ca4412015-02-23 19:27:00 +0000423 RecordNextStmtCount = true;
424 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000425
Justin Bognerf959feb2015-04-28 06:31:55 +0000426 void VisitCXXThrowExpr(const CXXThrowExpr *E) {
427 RecordStmtCount(E);
428 if (E->getSubExpr())
429 Visit(E->getSubExpr());
Justin Bognera909abf2015-05-02 00:48:27 +0000430 CurrentCount = 0;
Justin Bognerf959feb2015-04-28 06:31:55 +0000431 RecordNextStmtCount = true;
432 }
433
Justin Bognere4ca4412015-02-23 19:27:00 +0000434 void VisitGotoStmt(const GotoStmt *S) {
435 RecordStmtCount(S);
Justin Bognera909abf2015-05-02 00:48:27 +0000436 CurrentCount = 0;
Justin Bognere4ca4412015-02-23 19:27:00 +0000437 RecordNextStmtCount = true;
438 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000439
Justin Bognere4ca4412015-02-23 19:27:00 +0000440 void VisitLabelStmt(const LabelStmt *S) {
441 RecordNextStmtCount = false;
442 // Counter tracks the block following the label.
Justin Bogner07193cc2015-05-01 23:41:09 +0000443 uint64_t BlockCount = setCount(PGO.getRegionCount(S));
444 CountMap[S] = BlockCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000445 Visit(S->getSubStmt());
446 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000447
Justin Bognere4ca4412015-02-23 19:27:00 +0000448 void VisitBreakStmt(const BreakStmt *S) {
449 RecordStmtCount(S);
450 assert(!BreakContinueStack.empty() && "break not in a loop or switch!");
Justin Bognera909abf2015-05-02 00:48:27 +0000451 BreakContinueStack.back().BreakCount += CurrentCount;
452 CurrentCount = 0;
Justin Bognere4ca4412015-02-23 19:27:00 +0000453 RecordNextStmtCount = true;
454 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000455
Justin Bognere4ca4412015-02-23 19:27:00 +0000456 void VisitContinueStmt(const ContinueStmt *S) {
457 RecordStmtCount(S);
458 assert(!BreakContinueStack.empty() && "continue stmt not in a loop!");
Justin Bognera909abf2015-05-02 00:48:27 +0000459 BreakContinueStack.back().ContinueCount += CurrentCount;
460 CurrentCount = 0;
Justin Bognere4ca4412015-02-23 19:27:00 +0000461 RecordNextStmtCount = true;
462 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000463
Justin Bognere4ca4412015-02-23 19:27:00 +0000464 void VisitWhileStmt(const WhileStmt *S) {
465 RecordStmtCount(S);
Justin Bognera909abf2015-05-02 00:48:27 +0000466 uint64_t ParentCount = CurrentCount;
Justin Bogner07193cc2015-05-01 23:41:09 +0000467
Justin Bognere4ca4412015-02-23 19:27:00 +0000468 BreakContinueStack.push_back(BreakContinue());
469 // Visit the body region first so the break/continue adjustments can be
470 // included when visiting the condition.
Justin Bogner07193cc2015-05-01 23:41:09 +0000471 uint64_t BodyCount = setCount(PGO.getRegionCount(S));
Justin Bognera909abf2015-05-02 00:48:27 +0000472 CountMap[S->getBody()] = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000473 Visit(S->getBody());
Justin Bognera909abf2015-05-02 00:48:27 +0000474 uint64_t BackedgeCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000475
476 // ...then go back and propagate counts through the condition. The count
477 // at the start of the condition is the sum of the incoming edges,
478 // the backedge from the end of the loop body, and the edges from
479 // continue statements.
480 BreakContinue BC = BreakContinueStack.pop_back_val();
Justin Bogner07193cc2015-05-01 23:41:09 +0000481 uint64_t CondCount =
482 setCount(ParentCount + BackedgeCount + BC.ContinueCount);
483 CountMap[S->getCond()] = CondCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000484 Visit(S->getCond());
Justin Bogner07193cc2015-05-01 23:41:09 +0000485 setCount(BC.BreakCount + CondCount - BodyCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000486 RecordNextStmtCount = true;
487 }
488
489 void VisitDoStmt(const DoStmt *S) {
490 RecordStmtCount(S);
Justin Bogner07193cc2015-05-01 23:41:09 +0000491 uint64_t LoopCount = PGO.getRegionCount(S);
492
Justin Bognere4ca4412015-02-23 19:27:00 +0000493 BreakContinueStack.push_back(BreakContinue());
Justin Bogner07193cc2015-05-01 23:41:09 +0000494 // The count doesn't include the fallthrough from the parent scope. Add it.
Justin Bognera909abf2015-05-02 00:48:27 +0000495 uint64_t BodyCount = setCount(LoopCount + CurrentCount);
Justin Bogner07193cc2015-05-01 23:41:09 +0000496 CountMap[S->getBody()] = BodyCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000497 Visit(S->getBody());
Justin Bognera909abf2015-05-02 00:48:27 +0000498 uint64_t BackedgeCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000499
500 BreakContinue BC = BreakContinueStack.pop_back_val();
501 // The count at the start of the condition is equal to the count at the
Justin Bogner07193cc2015-05-01 23:41:09 +0000502 // end of the body, plus any continues.
503 uint64_t CondCount = setCount(BackedgeCount + BC.ContinueCount);
504 CountMap[S->getCond()] = CondCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000505 Visit(S->getCond());
Justin Bogner07193cc2015-05-01 23:41:09 +0000506 setCount(BC.BreakCount + CondCount - LoopCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000507 RecordNextStmtCount = true;
508 }
509
510 void VisitForStmt(const ForStmt *S) {
511 RecordStmtCount(S);
512 if (S->getInit())
513 Visit(S->getInit());
Justin Bogner07193cc2015-05-01 23:41:09 +0000514
Justin Bognera909abf2015-05-02 00:48:27 +0000515 uint64_t ParentCount = CurrentCount;
Justin Bogner07193cc2015-05-01 23:41:09 +0000516
Justin Bognere4ca4412015-02-23 19:27:00 +0000517 BreakContinueStack.push_back(BreakContinue());
518 // Visit the body region first. (This is basically the same as a while
519 // loop; see further comments in VisitWhileStmt.)
Justin Bogner07193cc2015-05-01 23:41:09 +0000520 uint64_t BodyCount = setCount(PGO.getRegionCount(S));
521 CountMap[S->getBody()] = BodyCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000522 Visit(S->getBody());
Justin Bognera909abf2015-05-02 00:48:27 +0000523 uint64_t BackedgeCount = CurrentCount;
Justin Bogner07193cc2015-05-01 23:41:09 +0000524 BreakContinue BC = BreakContinueStack.pop_back_val();
Justin Bognere4ca4412015-02-23 19:27:00 +0000525
526 // The increment is essentially part of the body but it needs to include
527 // the count for all the continue statements.
528 if (S->getInc()) {
Justin Bogner07193cc2015-05-01 23:41:09 +0000529 uint64_t IncCount = setCount(BackedgeCount + BC.ContinueCount);
530 CountMap[S->getInc()] = IncCount;
Bob Wilsonbf854f02014-02-17 19:21:09 +0000531 Visit(S->getInc());
Justin Bognere4ca4412015-02-23 19:27:00 +0000532 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000533
Justin Bognere4ca4412015-02-23 19:27:00 +0000534 // ...then go back and propagate counts through the condition.
Justin Bogner07193cc2015-05-01 23:41:09 +0000535 uint64_t CondCount =
536 setCount(ParentCount + BackedgeCount + BC.ContinueCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000537 if (S->getCond()) {
Justin Bogner07193cc2015-05-01 23:41:09 +0000538 CountMap[S->getCond()] = CondCount;
Bob Wilsonbf854f02014-02-17 19:21:09 +0000539 Visit(S->getCond());
Bob Wilsonbf854f02014-02-17 19:21:09 +0000540 }
Justin Bogner07193cc2015-05-01 23:41:09 +0000541 setCount(BC.BreakCount + CondCount - BodyCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000542 RecordNextStmtCount = true;
543 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000544
Justin Bognere4ca4412015-02-23 19:27:00 +0000545 void VisitCXXForRangeStmt(const CXXForRangeStmt *S) {
546 RecordStmtCount(S);
Richard Smith8baa5002018-09-28 18:44:09 +0000547 if (S->getInit())
548 Visit(S->getInit());
Justin Bogner2e5d4842015-04-30 22:58:28 +0000549 Visit(S->getLoopVarStmt());
Justin Bognere4ca4412015-02-23 19:27:00 +0000550 Visit(S->getRangeStmt());
Richard Smith01694c32016-03-20 10:33:40 +0000551 Visit(S->getBeginStmt());
552 Visit(S->getEndStmt());
Justin Bogner07193cc2015-05-01 23:41:09 +0000553
Justin Bognera909abf2015-05-02 00:48:27 +0000554 uint64_t ParentCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000555 BreakContinueStack.push_back(BreakContinue());
556 // Visit the body region first. (This is basically the same as a while
557 // loop; see further comments in VisitWhileStmt.)
Justin Bogner07193cc2015-05-01 23:41:09 +0000558 uint64_t BodyCount = setCount(PGO.getRegionCount(S));
559 CountMap[S->getBody()] = BodyCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000560 Visit(S->getBody());
Justin Bognera909abf2015-05-02 00:48:27 +0000561 uint64_t BackedgeCount = CurrentCount;
Justin Bogner07193cc2015-05-01 23:41:09 +0000562 BreakContinue BC = BreakContinueStack.pop_back_val();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000563
Justin Bognere4ca4412015-02-23 19:27:00 +0000564 // The increment is essentially part of the body but it needs to include
565 // the count for all the continue statements.
Justin Bogner07193cc2015-05-01 23:41:09 +0000566 uint64_t IncCount = setCount(BackedgeCount + BC.ContinueCount);
567 CountMap[S->getInc()] = IncCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000568 Visit(S->getInc());
Bob Wilsonbf854f02014-02-17 19:21:09 +0000569
Justin Bognere4ca4412015-02-23 19:27:00 +0000570 // ...then go back and propagate counts through the condition.
Justin Bogner07193cc2015-05-01 23:41:09 +0000571 uint64_t CondCount =
572 setCount(ParentCount + BackedgeCount + BC.ContinueCount);
573 CountMap[S->getCond()] = CondCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000574 Visit(S->getCond());
Justin Bogner07193cc2015-05-01 23:41:09 +0000575 setCount(BC.BreakCount + CondCount - BodyCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000576 RecordNextStmtCount = true;
577 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000578
Justin Bognere4ca4412015-02-23 19:27:00 +0000579 void VisitObjCForCollectionStmt(const ObjCForCollectionStmt *S) {
580 RecordStmtCount(S);
581 Visit(S->getElement());
Justin Bognera909abf2015-05-02 00:48:27 +0000582 uint64_t ParentCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000583 BreakContinueStack.push_back(BreakContinue());
Justin Bogner07193cc2015-05-01 23:41:09 +0000584 // Counter tracks the body of the loop.
585 uint64_t BodyCount = setCount(PGO.getRegionCount(S));
586 CountMap[S->getBody()] = BodyCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000587 Visit(S->getBody());
Justin Bognera909abf2015-05-02 00:48:27 +0000588 uint64_t BackedgeCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000589 BreakContinue BC = BreakContinueStack.pop_back_val();
Justin Bogner07193cc2015-05-01 23:41:09 +0000590
591 setCount(BC.BreakCount + ParentCount + BackedgeCount + BC.ContinueCount -
592 BodyCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000593 RecordNextStmtCount = true;
594 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000595
Justin Bognere4ca4412015-02-23 19:27:00 +0000596 void VisitSwitchStmt(const SwitchStmt *S) {
597 RecordStmtCount(S);
Vedant Kumarf2a6ec52016-10-14 23:38:13 +0000598 if (S->getInit())
599 Visit(S->getInit());
Justin Bognere4ca4412015-02-23 19:27:00 +0000600 Visit(S->getCond());
Justin Bognera909abf2015-05-02 00:48:27 +0000601 CurrentCount = 0;
Justin Bognere4ca4412015-02-23 19:27:00 +0000602 BreakContinueStack.push_back(BreakContinue());
603 Visit(S->getBody());
604 // If the switch is inside a loop, add the continue counts.
605 BreakContinue BC = BreakContinueStack.pop_back_val();
606 if (!BreakContinueStack.empty())
607 BreakContinueStack.back().ContinueCount += BC.ContinueCount;
608 // Counter tracks the exit block of the switch.
Justin Bogner07193cc2015-05-01 23:41:09 +0000609 setCount(PGO.getRegionCount(S));
Justin Bognere4ca4412015-02-23 19:27:00 +0000610 RecordNextStmtCount = true;
611 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000612
Justin Bogner07193cc2015-05-01 23:41:09 +0000613 void VisitSwitchCase(const SwitchCase *S) {
Justin Bognere4ca4412015-02-23 19:27:00 +0000614 RecordNextStmtCount = false;
615 // Counter for this particular case. This counts only jumps from the
616 // switch header and does not include fallthrough from the case before
617 // this one.
Justin Bogner07193cc2015-05-01 23:41:09 +0000618 uint64_t CaseCount = PGO.getRegionCount(S);
Justin Bognera909abf2015-05-02 00:48:27 +0000619 setCount(CurrentCount + CaseCount);
Justin Bogner07193cc2015-05-01 23:41:09 +0000620 // We need the count without fallthrough in the mapping, so it's more useful
621 // for branch probabilities.
622 CountMap[S] = CaseCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000623 RecordNextStmtCount = true;
624 Visit(S->getSubStmt());
625 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000626
Justin Bognere4ca4412015-02-23 19:27:00 +0000627 void VisitIfStmt(const IfStmt *S) {
628 RecordStmtCount(S);
Justin Bognera909abf2015-05-02 00:48:27 +0000629 uint64_t ParentCount = CurrentCount;
Vedant Kumar9d2a16b2016-10-14 23:38:16 +0000630 if (S->getInit())
631 Visit(S->getInit());
Justin Bognere4ca4412015-02-23 19:27:00 +0000632 Visit(S->getCond());
Bob Wilsonbf854f02014-02-17 19:21:09 +0000633
Justin Bogner07193cc2015-05-01 23:41:09 +0000634 // Counter tracks the "then" part of an if statement. The count for
635 // the "else" part, if it exists, will be calculated from this counter.
636 uint64_t ThenCount = setCount(PGO.getRegionCount(S));
637 CountMap[S->getThen()] = ThenCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000638 Visit(S->getThen());
Justin Bognera909abf2015-05-02 00:48:27 +0000639 uint64_t OutCount = CurrentCount;
Bob Wilsonbf854f02014-02-17 19:21:09 +0000640
Justin Bogner07193cc2015-05-01 23:41:09 +0000641 uint64_t ElseCount = ParentCount - ThenCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000642 if (S->getElse()) {
Justin Bogner07193cc2015-05-01 23:41:09 +0000643 setCount(ElseCount);
644 CountMap[S->getElse()] = ElseCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000645 Visit(S->getElse());
Justin Bognera909abf2015-05-02 00:48:27 +0000646 OutCount += CurrentCount;
Justin Bogner07193cc2015-05-01 23:41:09 +0000647 } else
648 OutCount += ElseCount;
649 setCount(OutCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000650 RecordNextStmtCount = true;
651 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000652
Justin Bognere4ca4412015-02-23 19:27:00 +0000653 void VisitCXXTryStmt(const CXXTryStmt *S) {
654 RecordStmtCount(S);
655 Visit(S->getTryBlock());
656 for (unsigned I = 0, E = S->getNumHandlers(); I < E; ++I)
657 Visit(S->getHandler(I));
658 // Counter tracks the continuation block of the try statement.
Justin Bogner07193cc2015-05-01 23:41:09 +0000659 setCount(PGO.getRegionCount(S));
Justin Bognere4ca4412015-02-23 19:27:00 +0000660 RecordNextStmtCount = true;
661 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000662
Justin Bognere4ca4412015-02-23 19:27:00 +0000663 void VisitCXXCatchStmt(const CXXCatchStmt *S) {
664 RecordNextStmtCount = false;
665 // Counter tracks the catch statement's handler block.
Justin Bogner07193cc2015-05-01 23:41:09 +0000666 uint64_t CatchCount = setCount(PGO.getRegionCount(S));
667 CountMap[S] = CatchCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000668 Visit(S->getHandlerBlock());
669 }
670
671 void VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) {
672 RecordStmtCount(E);
Justin Bognera909abf2015-05-02 00:48:27 +0000673 uint64_t ParentCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000674 Visit(E->getCond());
675
Justin Bogner07193cc2015-05-01 23:41:09 +0000676 // Counter tracks the "true" part of a conditional operator. The
677 // count in the "false" part will be calculated from this counter.
678 uint64_t TrueCount = setCount(PGO.getRegionCount(E));
679 CountMap[E->getTrueExpr()] = TrueCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000680 Visit(E->getTrueExpr());
Justin Bognera909abf2015-05-02 00:48:27 +0000681 uint64_t OutCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000682
Justin Bogner07193cc2015-05-01 23:41:09 +0000683 uint64_t FalseCount = setCount(ParentCount - TrueCount);
684 CountMap[E->getFalseExpr()] = FalseCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000685 Visit(E->getFalseExpr());
Justin Bognera909abf2015-05-02 00:48:27 +0000686 OutCount += CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000687
Justin Bogner07193cc2015-05-01 23:41:09 +0000688 setCount(OutCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000689 RecordNextStmtCount = true;
690 }
691
692 void VisitBinLAnd(const BinaryOperator *E) {
693 RecordStmtCount(E);
Justin Bognera909abf2015-05-02 00:48:27 +0000694 uint64_t ParentCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000695 Visit(E->getLHS());
Justin Bogner07193cc2015-05-01 23:41:09 +0000696 // Counter tracks the right hand side of a logical and operator.
697 uint64_t RHSCount = setCount(PGO.getRegionCount(E));
698 CountMap[E->getRHS()] = RHSCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000699 Visit(E->getRHS());
Justin Bognera909abf2015-05-02 00:48:27 +0000700 setCount(ParentCount + RHSCount - CurrentCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000701 RecordNextStmtCount = true;
702 }
703
704 void VisitBinLOr(const BinaryOperator *E) {
705 RecordStmtCount(E);
Justin Bognera909abf2015-05-02 00:48:27 +0000706 uint64_t ParentCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000707 Visit(E->getLHS());
Justin Bogner07193cc2015-05-01 23:41:09 +0000708 // Counter tracks the right hand side of a logical or operator.
709 uint64_t RHSCount = setCount(PGO.getRegionCount(E));
710 CountMap[E->getRHS()] = RHSCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000711 Visit(E->getRHS());
Justin Bognera909abf2015-05-02 00:48:27 +0000712 setCount(ParentCount + RHSCount - CurrentCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000713 RecordNextStmtCount = true;
714 }
715};
Hans Wennborgdcfba332015-10-06 23:40:43 +0000716} // end anonymous namespace
Justin Bogneref512b92014-01-06 22:27:43 +0000717
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +0000718void PGOHash::combine(HashType Type) {
719 // Check that we never combine 0 and only have six bits.
720 assert(Type && "Hash is invalid: unexpected type 0");
721 assert(unsigned(Type) < TooBig && "Hash is invalid: too many types");
722
723 // Pass through MD5 if enough work has built up.
724 if (Count && Count % NumTypesPerWord == 0) {
725 using namespace llvm::support;
726 uint64_t Swapped = endian::byte_swap<uint64_t, little>(Working);
727 MD5.update(llvm::makeArrayRef((uint8_t *)&Swapped, sizeof(Swapped)));
728 Working = 0;
729 }
730
731 // Accumulate the current type.
732 ++Count;
733 Working = Working << NumBitsPerType | Type;
734}
735
736uint64_t PGOHash::finalize() {
737 // Use Working as the hash directly if we never used MD5.
738 if (Count <= NumTypesPerWord)
739 // No need to byte swap here, since none of the math was endian-dependent.
740 // This number will be byte-swapped as required on endianness transitions,
741 // so we will see the same value on the other side.
742 return Working;
743
744 // Check for remaining work in Working.
745 if (Working)
746 MD5.update(Working);
747
748 // Finalize the MD5 and return the hash.
749 llvm::MD5::MD5Result Result;
750 MD5.final(Result);
751 using namespace llvm::support;
Zachary Turner82a0c972017-03-20 23:33:18 +0000752 return Result.low();
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +0000753}
754
Serge Pavlov3a561452015-12-06 14:32:39 +0000755void CodeGenPGO::assignRegionCounters(GlobalDecl GD, llvm::Function *Fn) {
756 const Decl *D = GD.getDecl();
Vedant Kumar33d0a1c2017-06-30 21:02:14 +0000757 if (!D->hasBody())
758 return;
759
Rong Xu9837ef52016-02-04 18:39:09 +0000760 bool InstrumentRegions = CGM.getCodeGenOpts().hasProfileClangInstr();
Justin Bogner837a6f62014-04-18 21:52:00 +0000761 llvm::IndexedInstrProfReader *PGOReader = CGM.getPGOReader();
762 if (!InstrumentRegions && !PGOReader)
Justin Bogneref512b92014-01-06 22:27:43 +0000763 return;
Justin Bogner3212b182014-04-25 07:20:05 +0000764 if (D->isImplicit())
Justin Bogneref512b92014-01-06 22:27:43 +0000765 return;
Serge Pavlov3a561452015-12-06 14:32:39 +0000766 // Constructors and destructors may be represented by several functions in IR.
767 // If so, instrument only base variant, others are implemented by delegation
768 // to the base one, it would be counted twice otherwise.
Vedant Kumar7f809b22017-02-24 01:15:19 +0000769 if (CGM.getTarget().getCXXABI().hasConstructorVariants()) {
770 if (isa<CXXDestructorDecl>(D) && GD.getDtorType() != Dtor_Base)
771 return;
772
773 if (const auto *CCD = dyn_cast<CXXConstructorDecl>(D))
774 if (GD.getCtorType() != Ctor_Base &&
775 CodeGenFunction::IsConstructorDelegationValid(CCD))
776 return;
Serge Pavlov3a561452015-12-06 14:32:39 +0000777 }
Alex Lorenzee024992014-08-04 18:41:51 +0000778 CGM.ClearUnusedCoverageMapping(D);
Bob Wilsonda1ebed2014-03-06 04:55:41 +0000779 setFuncName(Fn);
Duncan P. N. Exon Smith7c414512014-03-20 22:50:08 +0000780
Justin Bogneref512b92014-01-06 22:27:43 +0000781 mapRegionCounters(D);
Justin Bogner970ac602014-12-08 19:04:51 +0000782 if (CGM.getCodeGenOpts().CoverageMapping)
783 emitCounterRegionMapping(D);
Justin Bogner837a6f62014-04-18 21:52:00 +0000784 if (PGOReader) {
Justin Bogner40b8ba12014-06-26 01:45:07 +0000785 SourceManager &SM = CGM.getContext().getSourceManager();
786 loadRegionCounts(PGOReader, SM.isInMainFile(D->getLocation()));
Bob Wilsonbf854f02014-02-17 19:21:09 +0000787 computeRegionCounts(D);
Justin Bogner837a6f62014-04-18 21:52:00 +0000788 applyFunctionAttributes(PGOReader, Fn);
Bob Wilsonbf854f02014-02-17 19:21:09 +0000789 }
Justin Bogneref512b92014-01-06 22:27:43 +0000790}
791
792void CodeGenPGO::mapRegionCounters(const Decl *D) {
Vedant Kumar61869712017-11-14 23:56:53 +0000793 // Use the latest hash version when inserting instrumentation, but use the
794 // version in the indexed profile if we're reading PGO data.
795 PGOHashVersion HashVersion = PGO_HASH_LATEST;
796 if (auto *PGOReader = CGM.getPGOReader())
797 HashVersion = getPGOHashVersion(PGOReader, CGM);
798
Duncan P. N. Exon Smith1b67cfd2014-03-26 19:26:05 +0000799 RegionCounterMap.reset(new llvm::DenseMap<const Stmt *, unsigned>);
Vedant Kumar61869712017-11-14 23:56:53 +0000800 MapRegionCounters Walker(HashVersion, *RegionCounterMap);
Justin Bogneref512b92014-01-06 22:27:43 +0000801 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
Bob Wilsond8931422014-04-11 17:16:13 +0000802 Walker.TraverseDecl(const_cast<FunctionDecl *>(FD));
Bob Wilson5ec8fe12014-03-06 06:10:02 +0000803 else if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
Bob Wilsond8931422014-04-11 17:16:13 +0000804 Walker.TraverseDecl(const_cast<ObjCMethodDecl *>(MD));
Bob Wilsonc845c002014-03-06 20:24:27 +0000805 else if (const BlockDecl *BD = dyn_cast_or_null<BlockDecl>(D))
Bob Wilsond8931422014-04-11 17:16:13 +0000806 Walker.TraverseDecl(const_cast<BlockDecl *>(BD));
Justin Bogner81ab90f2014-04-15 00:50:54 +0000807 else if (const CapturedDecl *CD = dyn_cast_or_null<CapturedDecl>(D))
808 Walker.TraverseDecl(const_cast<CapturedDecl *>(CD));
Justin Bogner3212b182014-04-25 07:20:05 +0000809 assert(Walker.NextCounter > 0 && "no entry counter mapped for decl");
Justin Bogneref512b92014-01-06 22:27:43 +0000810 NumRegionCounters = Walker.NextCounter;
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +0000811 FunctionHash = Walker.Hash.finalize();
Justin Bogneref512b92014-01-06 22:27:43 +0000812}
813
Vedant Kumarc468bb82016-07-11 22:57:44 +0000814bool CodeGenPGO::skipRegionMappingForDecl(const Decl *D) {
Vedant Kumarbc370f02017-04-24 20:52:04 +0000815 if (!D->getBody())
816 return true;
817
Vedant Kumarc468bb82016-07-11 22:57:44 +0000818 // Don't map the functions in system headers.
819 const auto &SM = CGM.getContext().getSourceManager();
Stephen Kellyf2ceec42018-08-09 21:08:08 +0000820 auto Loc = D->getBody()->getBeginLoc();
Vedant Kumarc468bb82016-07-11 22:57:44 +0000821 return SM.isInSystemHeader(Loc);
822}
823
824void CodeGenPGO::emitCounterRegionMapping(const Decl *D) {
825 if (skipRegionMappingForDecl(D))
Alex Lorenzee024992014-08-04 18:41:51 +0000826 return;
827
Justin Bogner970ac602014-12-08 19:04:51 +0000828 std::string CoverageMapping;
Alex Lorenzee024992014-08-04 18:41:51 +0000829 llvm::raw_string_ostream OS(CoverageMapping);
830 CoverageMappingGen MappingGen(*CGM.getCoverageMapping(),
831 CGM.getContext().getSourceManager(),
Justin Bognere5ee6c52014-10-02 16:44:01 +0000832 CGM.getLangOpts(), RegionCounterMap.get());
Alex Lorenzee024992014-08-04 18:41:51 +0000833 MappingGen.emitCounterMapping(D, OS);
834 OS.flush();
Justin Bogner970ac602014-12-08 19:04:51 +0000835
836 if (CoverageMapping.empty())
837 return;
838
839 CGM.getCoverageMapping()->addFunctionMappingRecord(
840 FuncNameVar, FuncName, FunctionHash, CoverageMapping);
Alex Lorenzee024992014-08-04 18:41:51 +0000841}
842
843void
Justin Bogner60d852b2015-04-23 00:31:16 +0000844CodeGenPGO::emitEmptyCounterMapping(const Decl *D, StringRef Name,
Alex Lorenzee024992014-08-04 18:41:51 +0000845 llvm::GlobalValue::LinkageTypes Linkage) {
Vedant Kumarc468bb82016-07-11 22:57:44 +0000846 if (skipRegionMappingForDecl(D))
Alex Lorenzee024992014-08-04 18:41:51 +0000847 return;
848
Justin Bogner970ac602014-12-08 19:04:51 +0000849 std::string CoverageMapping;
Alex Lorenzee024992014-08-04 18:41:51 +0000850 llvm::raw_string_ostream OS(CoverageMapping);
851 CoverageMappingGen MappingGen(*CGM.getCoverageMapping(),
852 CGM.getContext().getSourceManager(),
853 CGM.getLangOpts());
854 MappingGen.emitEmptyMapping(D, OS);
855 OS.flush();
Justin Bogner970ac602014-12-08 19:04:51 +0000856
857 if (CoverageMapping.empty())
858 return;
859
Justin Bogner60d852b2015-04-23 00:31:16 +0000860 setFuncName(Name, Linkage);
Justin Bogner970ac602014-12-08 19:04:51 +0000861 CGM.getCoverageMapping()->addFunctionMappingRecord(
Xinliang David Li2129ae52016-01-07 20:05:55 +0000862 FuncNameVar, FuncName, FunctionHash, CoverageMapping, false);
Alex Lorenzee024992014-08-04 18:41:51 +0000863}
864
Bob Wilsonbf854f02014-02-17 19:21:09 +0000865void CodeGenPGO::computeRegionCounts(const Decl *D) {
Duncan P. N. Exon Smith1b67cfd2014-03-26 19:26:05 +0000866 StmtCountMap.reset(new llvm::DenseMap<const Stmt *, uint64_t>);
Duncan P. N. Exon Smith3586be72014-03-26 19:26:02 +0000867 ComputeRegionCounts Walker(*StmtCountMap, *this);
Bob Wilsonbf854f02014-02-17 19:21:09 +0000868 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
869 Walker.VisitFunctionDecl(FD);
Bob Wilson5ec8fe12014-03-06 06:10:02 +0000870 else if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
871 Walker.VisitObjCMethodDecl(MD);
Bob Wilsonc845c002014-03-06 20:24:27 +0000872 else if (const BlockDecl *BD = dyn_cast_or_null<BlockDecl>(D))
873 Walker.VisitBlockDecl(BD);
Justin Bogner81ab90f2014-04-15 00:50:54 +0000874 else if (const CapturedDecl *CD = dyn_cast_or_null<CapturedDecl>(D))
875 Walker.VisitCapturedDecl(const_cast<CapturedDecl *>(CD));
Bob Wilsonbf854f02014-02-17 19:21:09 +0000876}
877
Justin Bogner837a6f62014-04-18 21:52:00 +0000878void
879CodeGenPGO::applyFunctionAttributes(llvm::IndexedInstrProfReader *PGOReader,
880 llvm::Function *Fn) {
Justin Bogner4c9c45c2014-03-12 18:14:32 +0000881 if (!haveRegionCounts())
882 return;
883
Hans Wennborgdcfba332015-10-06 23:40:43 +0000884 uint64_t FunctionCount = getRegionCount(nullptr);
Diego Novilloaa8b1cb2015-05-27 21:58:42 +0000885 Fn->setEntryCount(FunctionCount);
Justin Bogner4c9c45c2014-03-12 18:14:32 +0000886}
887
Vedant Kumar502bbfa2017-02-25 06:35:45 +0000888void CodeGenPGO::emitCounterIncrement(CGBuilderTy &Builder, const Stmt *S,
889 llvm::Value *StepV) {
Rong Xu9837ef52016-02-04 18:39:09 +0000890 if (!CGM.getCodeGenOpts().hasProfileClangInstr() || !RegionCounterMap)
Justin Bogneref512b92014-01-06 22:27:43 +0000891 return;
Duncan P. N. Exon Smith9f5260a2015-11-06 23:00:41 +0000892 if (!Builder.GetInsertBlock())
Justin Bogner203f91e2015-01-09 01:46:40 +0000893 return;
Justin Bogner66242d62015-04-23 23:06:47 +0000894
895 unsigned Counter = (*RegionCounterMap)[S];
Justin Bogner970ac602014-12-08 19:04:51 +0000896 auto *I8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext());
Vedant Kumar502bbfa2017-02-25 06:35:45 +0000897
898 llvm::Value *Args[] = {llvm::ConstantExpr::getBitCast(FuncNameVar, I8PtrTy),
899 Builder.getInt64(FunctionHash),
900 Builder.getInt32(NumRegionCounters),
901 Builder.getInt32(Counter), StepV};
902 if (!StepV)
903 Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::instrprof_increment),
904 makeArrayRef(Args, 4));
905 else
906 Builder.CreateCall(
907 CGM.getIntrinsic(llvm::Intrinsic::instrprof_increment_step),
908 makeArrayRef(Args));
Justin Bogneref512b92014-01-06 22:27:43 +0000909}
910
Betul Buyukkurt518276a2016-01-23 22:50:44 +0000911// This method either inserts a call to the profile run-time during
912// instrumentation or puts profile data into metadata for PGO use.
913void CodeGenPGO::valueProfile(CGBuilderTy &Builder, uint32_t ValueKind,
914 llvm::Instruction *ValueSite, llvm::Value *ValuePtr) {
915
916 if (!EnableValueProfiling)
917 return;
918
919 if (!ValuePtr || !ValueSite || !Builder.GetInsertBlock())
920 return;
921
Betul Buyukkurt3da993c2016-03-31 18:41:34 +0000922 if (isa<llvm::Constant>(ValuePtr))
923 return;
924
Rong Xu9837ef52016-02-04 18:39:09 +0000925 bool InstrumentValueSites = CGM.getCodeGenOpts().hasProfileClangInstr();
Betul Buyukkurt518276a2016-01-23 22:50:44 +0000926 if (InstrumentValueSites && RegionCounterMap) {
Betul Buyukkurtcb6f5f12016-03-29 20:44:09 +0000927 auto BuilderInsertPoint = Builder.saveIP();
928 Builder.SetInsertPoint(ValueSite);
Betul Buyukkurt518276a2016-01-23 22:50:44 +0000929 llvm::Value *Args[5] = {
Betul Buyukkurtcb6f5f12016-03-29 20:44:09 +0000930 llvm::ConstantExpr::getBitCast(FuncNameVar, Builder.getInt8PtrTy()),
Betul Buyukkurt518276a2016-01-23 22:50:44 +0000931 Builder.getInt64(FunctionHash),
932 Builder.CreatePtrToInt(ValuePtr, Builder.getInt64Ty()),
933 Builder.getInt32(ValueKind),
934 Builder.getInt32(NumValueSites[ValueKind]++)
935 };
936 Builder.CreateCall(
937 CGM.getIntrinsic(llvm::Intrinsic::instrprof_value_profile), Args);
Betul Buyukkurtcb6f5f12016-03-29 20:44:09 +0000938 Builder.restoreIP(BuilderInsertPoint);
Betul Buyukkurt518276a2016-01-23 22:50:44 +0000939 return;
940 }
941
942 llvm::IndexedInstrProfReader *PGOReader = CGM.getPGOReader();
943 if (PGOReader && haveRegionCounts()) {
944 // We record the top most called three functions at each call site.
945 // Profile metadata contains "VP" string identifying this metadata
946 // as value profiling data, then a uint32_t value for the value profiling
947 // kind, a uint64_t value for the total number of times the call is
948 // executed, followed by the function hash and execution count (uint64_t)
949 // pairs for each function.
950 if (NumValueSites[ValueKind] >= ProfRecord->getNumValueSites(ValueKind))
951 return;
Betul Buyukkurt518276a2016-01-23 22:50:44 +0000952
Xinliang David Li5527a9d2016-02-04 19:54:17 +0000953 llvm::annotateValueSite(CGM.getModule(), *ValueSite, *ProfRecord,
954 (llvm::InstrProfValueKind)ValueKind,
955 NumValueSites[ValueKind]);
Betul Buyukkurt518276a2016-01-23 22:50:44 +0000956
Betul Buyukkurt518276a2016-01-23 22:50:44 +0000957 NumValueSites[ValueKind]++;
958 }
959}
960
Justin Bogner40b8ba12014-06-26 01:45:07 +0000961void CodeGenPGO::loadRegionCounts(llvm::IndexedInstrProfReader *PGOReader,
962 bool IsInMainFile) {
963 CGM.getPGOStats().addVisited(IsInMainFile);
Justin Bogner7f8cf5b2014-12-02 22:38:52 +0000964 RegionCounts.clear();
Vedant Kumarfa2d5952016-05-19 03:54:54 +0000965 llvm::Expected<llvm::InstrProfRecord> RecordExpected =
Betul Buyukkurt518276a2016-01-23 22:50:44 +0000966 PGOReader->getInstrProfRecord(FuncName, FunctionHash);
Vedant Kumarfa2d5952016-05-19 03:54:54 +0000967 if (auto E = RecordExpected.takeError()) {
968 auto IPE = llvm::InstrProfError::take(std::move(E));
969 if (IPE == llvm::instrprof_error::unknown_function)
Justin Bogner9c6818e2014-08-01 22:50:16 +0000970 CGM.getPGOStats().addMissing(IsInMainFile);
Vedant Kumarfa2d5952016-05-19 03:54:54 +0000971 else if (IPE == llvm::instrprof_error::hash_mismatch)
Justin Bogner9c6818e2014-08-01 22:50:16 +0000972 CGM.getPGOStats().addMismatched(IsInMainFile);
Vedant Kumarfa2d5952016-05-19 03:54:54 +0000973 else if (IPE == llvm::instrprof_error::malformed)
Justin Bogner9c6818e2014-08-01 22:50:16 +0000974 // TODO: Consider a more specific warning for this case.
975 CGM.getPGOStats().addMismatched(IsInMainFile);
Betul Buyukkurt518276a2016-01-23 22:50:44 +0000976 return;
Justin Bognere2ef2a02014-04-15 21:22:35 +0000977 }
Betul Buyukkurt518276a2016-01-23 22:50:44 +0000978 ProfRecord =
Vedant Kumarfa2d5952016-05-19 03:54:54 +0000979 llvm::make_unique<llvm::InstrProfRecord>(std::move(RecordExpected.get()));
Betul Buyukkurt518276a2016-01-23 22:50:44 +0000980 RegionCounts = ProfRecord->Counts;
Justin Bogneref512b92014-01-06 22:27:43 +0000981}
982
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000983/// Calculate what to divide by to scale weights.
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000984///
985/// Given the maximum weight, calculate a divisor that will scale all the
986/// weights to strictly less than UINT32_MAX.
987static uint64_t calculateWeightScale(uint64_t MaxWeight) {
988 return MaxWeight < UINT32_MAX ? 1 : MaxWeight / UINT32_MAX + 1;
989}
990
Adrian Prantl9fc8faf2018-05-09 01:00:01 +0000991/// Scale an individual branch weight (and add 1).
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000992///
993/// Scale a 64-bit weight down to 32-bits using \c Scale.
994///
995/// According to Laplace's Rule of Succession, it is better to compute the
996/// weight based on the count plus 1, so universally add 1 to the value.
997///
998/// \pre \c Scale was calculated by \a calculateWeightScale() with a weight no
999/// greater than \c Weight.
1000static uint32_t scaleBranchWeight(uint64_t Weight, uint64_t Scale) {
1001 assert(Scale && "scale by 0?");
1002 uint64_t Scaled = Weight / Scale + 1;
1003 assert(Scaled <= UINT32_MAX && "overflow 32-bits");
1004 return Scaled;
1005}
1006
Justin Bogner65512642015-05-02 05:00:55 +00001007llvm::MDNode *CodeGenFunction::createProfileWeights(uint64_t TrueCount,
1008 uint64_t FalseCount) {
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +00001009 // Check for empty weights.
Justin Bogneref512b92014-01-06 22:27:43 +00001010 if (!TrueCount && !FalseCount)
Duncan P. N. Exon Smitha5f804a2014-03-20 18:40:55 +00001011 return nullptr;
Justin Bogneref512b92014-01-06 22:27:43 +00001012
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +00001013 // Calculate how to scale down to 32-bits.
1014 uint64_t Scale = calculateWeightScale(std::max(TrueCount, FalseCount));
1015
Justin Bogneref512b92014-01-06 22:27:43 +00001016 llvm::MDBuilder MDHelper(CGM.getLLVMContext());
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +00001017 return MDHelper.createBranchWeights(scaleBranchWeight(TrueCount, Scale),
1018 scaleBranchWeight(FalseCount, Scale));
Justin Bogneref512b92014-01-06 22:27:43 +00001019}
1020
Justin Bogner65512642015-05-02 05:00:55 +00001021llvm::MDNode *
1022CodeGenFunction::createProfileWeights(ArrayRef<uint64_t> Weights) {
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +00001023 // We need at least two elements to create meaningful weights.
1024 if (Weights.size() < 2)
Duncan P. N. Exon Smitha5f804a2014-03-20 18:40:55 +00001025 return nullptr;
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +00001026
Justin Bognerf3aefca2014-04-04 02:48:51 +00001027 // Check for empty weights.
1028 uint64_t MaxWeight = *std::max_element(Weights.begin(), Weights.end());
1029 if (MaxWeight == 0)
1030 return nullptr;
1031
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +00001032 // Calculate how to scale down to 32-bits.
Justin Bognerf3aefca2014-04-04 02:48:51 +00001033 uint64_t Scale = calculateWeightScale(MaxWeight);
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +00001034
Justin Bogneref512b92014-01-06 22:27:43 +00001035 SmallVector<uint32_t, 16> ScaledWeights;
1036 ScaledWeights.reserve(Weights.size());
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +00001037 for (uint64_t W : Weights)
1038 ScaledWeights.push_back(scaleBranchWeight(W, Scale));
1039
1040 llvm::MDBuilder MDHelper(CGM.getLLVMContext());
Justin Bogneref512b92014-01-06 22:27:43 +00001041 return MDHelper.createBranchWeights(ScaledWeights);
1042}
Bob Wilsonbf854f02014-02-17 19:21:09 +00001043
Justin Bogner65512642015-05-02 05:00:55 +00001044llvm::MDNode *CodeGenFunction::createProfileWeightsForLoop(const Stmt *Cond,
1045 uint64_t LoopCount) {
1046 if (!PGO.haveRegionCounts())
Duncan P. N. Exon Smitha5f804a2014-03-20 18:40:55 +00001047 return nullptr;
Justin Bogner65512642015-05-02 05:00:55 +00001048 Optional<uint64_t> CondCount = PGO.getStmtCount(Cond);
Justin Bogner1c21c282015-04-13 12:23:19 +00001049 assert(CondCount.hasValue() && "missing expected loop condition count");
1050 if (*CondCount == 0)
Duncan P. N. Exon Smitha5f804a2014-03-20 18:40:55 +00001051 return nullptr;
Justin Bogner65512642015-05-02 05:00:55 +00001052 return createProfileWeights(LoopCount,
1053 std::max(*CondCount, LoopCount) - LoopCount);
Bob Wilsonbf854f02014-02-17 19:21:09 +00001054}