blob: 98dfe595e97869cffd3b2e20ddaa6e7daaac153d [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"
Justin Bogner837a6f62014-04-18 21:52:00 +000021#include "llvm/ProfileData/InstrProfReader.h"
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +000022#include "llvm/Support/Endian.h"
Justin Bogneref512b92014-01-06 22:27:43 +000023#include "llvm/Support/FileSystem.h"
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +000024#include "llvm/Support/MD5.h"
Justin Bogneref512b92014-01-06 22:27:43 +000025
26using namespace clang;
27using namespace CodeGen;
28
Alex Lorenzee024992014-08-04 18:41:51 +000029void CodeGenPGO::setFuncName(StringRef Name,
30 llvm::GlobalValue::LinkageTypes Linkage) {
Justin Bogner111c6532014-12-02 23:15:30 +000031 StringRef RawFuncName = Name;
Bob Wilsonda1ebed2014-03-06 04:55:41 +000032
33 // Function names may be prefixed with a binary '1' to indicate
34 // that the backend should not modify the symbols due to any platform
35 // naming convention. Do not include that '1' in the PGO profile name.
Duncan P. N. Exon Smith2fe531c2014-03-17 21:18:30 +000036 if (RawFuncName[0] == '\1')
37 RawFuncName = RawFuncName.substr(1);
Bob Wilsonda1ebed2014-03-06 04:55:41 +000038
Justin Bogner111c6532014-12-02 23:15:30 +000039 FuncName = RawFuncName;
40 if (llvm::GlobalValue::isLocalLinkage(Linkage)) {
41 // For local symbols, prepend the main file name to distinguish them.
42 // Do not include the full path in the file name since there's no guarantee
43 // that it will stay the same, e.g., if the files are checked out from
44 // version control in different locations.
45 if (CGM.getCodeGenOpts().MainFileName.empty())
46 FuncName = FuncName.insert(0, "<unknown>:");
47 else
48 FuncName = FuncName.insert(0, CGM.getCodeGenOpts().MainFileName + ":");
Bob Wilsonda1ebed2014-03-06 04:55:41 +000049 }
Justin Bogner970ac602014-12-08 19:04:51 +000050
51 // If we're generating a profile, create a variable for the name.
52 if (CGM.getCodeGenOpts().ProfileInstrGenerate)
53 createFuncNameVar(Linkage);
Bob Wilsonda1ebed2014-03-06 04:55:41 +000054}
55
Alex Lorenzee024992014-08-04 18:41:51 +000056void CodeGenPGO::setFuncName(llvm::Function *Fn) {
57 setFuncName(Fn->getName(), Fn->getLinkage());
58}
59
Justin Bogner970ac602014-12-08 19:04:51 +000060void CodeGenPGO::createFuncNameVar(llvm::GlobalValue::LinkageTypes Linkage) {
Justin Bognere9fe0a22015-03-20 06:34:38 +000061 // We generally want to match the function's linkage, but available_externally
62 // and extern_weak both have the wrong semantics, and anything that doesn't
63 // need to link across compilation units doesn't need to be visible at all.
Justin Bogner970ac602014-12-08 19:04:51 +000064 if (Linkage == llvm::GlobalValue::ExternalWeakLinkage)
65 Linkage = llvm::GlobalValue::LinkOnceAnyLinkage;
66 else if (Linkage == llvm::GlobalValue::AvailableExternallyLinkage)
67 Linkage = llvm::GlobalValue::LinkOnceODRLinkage;
Justin Bognere9fe0a22015-03-20 06:34:38 +000068 else if (Linkage == llvm::GlobalValue::InternalLinkage ||
69 Linkage == llvm::GlobalValue::ExternalLinkage)
70 Linkage = llvm::GlobalValue::PrivateLinkage;
Alex Lorenzee024992014-08-04 18:41:51 +000071
Justin Bogner970ac602014-12-08 19:04:51 +000072 auto *Value =
73 llvm::ConstantDataArray::getString(CGM.getLLVMContext(), FuncName, false);
74 FuncNameVar =
75 new llvm::GlobalVariable(CGM.getModule(), Value->getType(), true, Linkage,
Xinliang David Li03711cb2015-10-22 22:25:11 +000076 Value, llvm::getInstrProfNameVarPrefix() + FuncName);
Duncan P. N. Exon Smith2fe531c2014-03-17 21:18:30 +000077
Justin Bogner970ac602014-12-08 19:04:51 +000078 // Hide the symbol so that we correctly get a copy for each executable.
79 if (!llvm::GlobalValue::isLocalLinkage(FuncNameVar->getLinkage()))
80 FuncNameVar->setVisibility(llvm::GlobalValue::HiddenVisibility);
Justin Bogneref512b92014-01-06 22:27:43 +000081}
82
83namespace {
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +000084/// \brief Stable hasher for PGO region counters.
85///
86/// PGOHash produces a stable hash of a given function's control flow.
87///
88/// Changing the output of this hash will invalidate all previously generated
89/// profiles -- i.e., don't do it.
90///
91/// \note When this hash does eventually change (years?), we still need to
92/// support old hashes. We'll need to pull in the version number from the
93/// profile data format and use the matching hash function.
94class PGOHash {
95 uint64_t Working;
96 unsigned Count;
97 llvm::MD5 MD5;
98
99 static const int NumBitsPerType = 6;
100 static const unsigned NumTypesPerWord = sizeof(uint64_t) * 8 / NumBitsPerType;
101 static const unsigned TooBig = 1u << NumBitsPerType;
102
103public:
104 /// \brief Hash values for AST nodes.
105 ///
106 /// Distinct values for AST nodes that have region counters attached.
107 ///
108 /// These values must be stable. All new members must be added at the end,
109 /// and no members should be removed. Changing the enumeration value for an
110 /// AST node will affect the hash of every function that contains that node.
111 enum HashType : unsigned char {
112 None = 0,
113 LabelStmt = 1,
114 WhileStmt,
115 DoStmt,
116 ForStmt,
117 CXXForRangeStmt,
118 ObjCForCollectionStmt,
119 SwitchStmt,
120 CaseStmt,
121 DefaultStmt,
122 IfStmt,
123 CXXTryStmt,
124 CXXCatchStmt,
125 ConditionalOperator,
126 BinaryOperatorLAnd,
127 BinaryOperatorLOr,
128 BinaryConditionalOperator,
129
130 // Keep this last. It's for the static assert that follows.
131 LastHashType
132 };
133 static_assert(LastHashType <= TooBig, "Too many types in HashType");
134
135 // TODO: When this format changes, take in a version number here, and use the
136 // old hash calculation for file formats that used the old hash.
137 PGOHash() : Working(0), Count(0) {}
138 void combine(HashType Type);
139 uint64_t finalize();
140};
141const int PGOHash::NumBitsPerType;
142const unsigned PGOHash::NumTypesPerWord;
143const unsigned PGOHash::TooBig;
144
Justin Bognere4ca4412015-02-23 19:27:00 +0000145/// A RecursiveASTVisitor that fills a map of statements to PGO counters.
146struct MapRegionCounters : public RecursiveASTVisitor<MapRegionCounters> {
147 /// The next counter value to assign.
148 unsigned NextCounter;
149 /// The function hash.
150 PGOHash Hash;
151 /// The map of statements to counters.
152 llvm::DenseMap<const Stmt *, unsigned> &CounterMap;
Justin Bogneref512b92014-01-06 22:27:43 +0000153
Justin Bognere4ca4412015-02-23 19:27:00 +0000154 MapRegionCounters(llvm::DenseMap<const Stmt *, unsigned> &CounterMap)
155 : NextCounter(0), CounterMap(CounterMap) {}
Justin Bogneref512b92014-01-06 22:27:43 +0000156
Justin Bognere4ca4412015-02-23 19:27:00 +0000157 // Blocks and lambdas are handled as separate functions, so we need not
158 // traverse them in the parent context.
159 bool TraverseBlockExpr(BlockExpr *BE) { return true; }
160 bool TraverseLambdaBody(LambdaExpr *LE) { return true; }
161 bool TraverseCapturedStmt(CapturedStmt *CS) { return true; }
Justin Bogneref512b92014-01-06 22:27:43 +0000162
Justin Bognere4ca4412015-02-23 19:27:00 +0000163 bool VisitDecl(const Decl *D) {
164 switch (D->getKind()) {
165 default:
166 break;
167 case Decl::Function:
168 case Decl::CXXMethod:
169 case Decl::CXXConstructor:
170 case Decl::CXXDestructor:
171 case Decl::CXXConversion:
172 case Decl::ObjCMethod:
173 case Decl::Block:
174 case Decl::Captured:
175 CounterMap[D->getBody()] = NextCounter++;
176 break;
177 }
178 return true;
179 }
180
181 bool VisitStmt(const Stmt *S) {
182 auto Type = getHashType(S);
183 if (Type == PGOHash::None)
Bob Wilsond8931422014-04-11 17:16:13 +0000184 return true;
Bob Wilsond8931422014-04-11 17:16:13 +0000185
Justin Bognere4ca4412015-02-23 19:27:00 +0000186 CounterMap[S] = NextCounter++;
187 Hash.combine(Type);
188 return true;
189 }
190 PGOHash::HashType getHashType(const Stmt *S) {
191 switch (S->getStmtClass()) {
192 default:
193 break;
194 case Stmt::LabelStmtClass:
195 return PGOHash::LabelStmt;
196 case Stmt::WhileStmtClass:
197 return PGOHash::WhileStmt;
198 case Stmt::DoStmtClass:
199 return PGOHash::DoStmt;
200 case Stmt::ForStmtClass:
201 return PGOHash::ForStmt;
202 case Stmt::CXXForRangeStmtClass:
203 return PGOHash::CXXForRangeStmt;
204 case Stmt::ObjCForCollectionStmtClass:
205 return PGOHash::ObjCForCollectionStmt;
206 case Stmt::SwitchStmtClass:
207 return PGOHash::SwitchStmt;
208 case Stmt::CaseStmtClass:
209 return PGOHash::CaseStmt;
210 case Stmt::DefaultStmtClass:
211 return PGOHash::DefaultStmt;
212 case Stmt::IfStmtClass:
213 return PGOHash::IfStmt;
214 case Stmt::CXXTryStmtClass:
215 return PGOHash::CXXTryStmt;
216 case Stmt::CXXCatchStmtClass:
217 return PGOHash::CXXCatchStmt;
218 case Stmt::ConditionalOperatorClass:
219 return PGOHash::ConditionalOperator;
220 case Stmt::BinaryConditionalOperatorClass:
221 return PGOHash::BinaryConditionalOperator;
222 case Stmt::BinaryOperatorClass: {
223 const BinaryOperator *BO = cast<BinaryOperator>(S);
224 if (BO->getOpcode() == BO_LAnd)
225 return PGOHash::BinaryOperatorLAnd;
226 if (BO->getOpcode() == BO_LOr)
227 return PGOHash::BinaryOperatorLOr;
228 break;
229 }
230 }
231 return PGOHash::None;
232 }
233};
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +0000234
Justin Bognere4ca4412015-02-23 19:27:00 +0000235/// A StmtVisitor that propagates the raw counts through the AST and
236/// records the count at statements where the value may change.
237struct ComputeRegionCounts : public ConstStmtVisitor<ComputeRegionCounts> {
238 /// PGO state.
239 CodeGenPGO &PGO;
240
241 /// A flag that is set when the current count should be recorded on the
242 /// next statement, such as at the exit of a loop.
243 bool RecordNextStmtCount;
244
Justin Bognera909abf2015-05-02 00:48:27 +0000245 /// The count at the current location in the traversal.
246 uint64_t CurrentCount;
247
Justin Bognere4ca4412015-02-23 19:27:00 +0000248 /// The map of statements to count values.
249 llvm::DenseMap<const Stmt *, uint64_t> &CountMap;
250
251 /// BreakContinueStack - Keep counts of breaks and continues inside loops.
252 struct BreakContinue {
253 uint64_t BreakCount;
254 uint64_t ContinueCount;
255 BreakContinue() : BreakCount(0), ContinueCount(0) {}
Justin Bogneref512b92014-01-06 22:27:43 +0000256 };
Justin Bognere4ca4412015-02-23 19:27:00 +0000257 SmallVector<BreakContinue, 8> BreakContinueStack;
Bob Wilsonbf854f02014-02-17 19:21:09 +0000258
Justin Bognere4ca4412015-02-23 19:27:00 +0000259 ComputeRegionCounts(llvm::DenseMap<const Stmt *, uint64_t> &CountMap,
260 CodeGenPGO &PGO)
261 : PGO(PGO), RecordNextStmtCount(false), CountMap(CountMap) {}
Bob Wilsonbf854f02014-02-17 19:21:09 +0000262
Justin Bognere4ca4412015-02-23 19:27:00 +0000263 void RecordStmtCount(const Stmt *S) {
264 if (RecordNextStmtCount) {
Justin Bognera909abf2015-05-02 00:48:27 +0000265 CountMap[S] = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000266 RecordNextStmtCount = false;
Bob Wilsonbf854f02014-02-17 19:21:09 +0000267 }
Justin Bognere4ca4412015-02-23 19:27:00 +0000268 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000269
Justin Bogner07193cc2015-05-01 23:41:09 +0000270 /// Set and return the current count.
271 uint64_t setCount(uint64_t Count) {
Justin Bognera909abf2015-05-02 00:48:27 +0000272 CurrentCount = Count;
Justin Bogner07193cc2015-05-01 23:41:09 +0000273 return Count;
274 }
275
Justin Bognere4ca4412015-02-23 19:27:00 +0000276 void VisitStmt(const Stmt *S) {
277 RecordStmtCount(S);
Benjamin Kramer642f1732015-07-02 21:03:14 +0000278 for (const Stmt *Child : S->children())
279 if (Child)
280 this->Visit(Child);
Justin Bognere4ca4412015-02-23 19:27:00 +0000281 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000282
Justin Bognere4ca4412015-02-23 19:27:00 +0000283 void VisitFunctionDecl(const FunctionDecl *D) {
284 // Counter tracks entry to the function body.
Justin Bogner07193cc2015-05-01 23:41:09 +0000285 uint64_t BodyCount = setCount(PGO.getRegionCount(D->getBody()));
286 CountMap[D->getBody()] = BodyCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000287 Visit(D->getBody());
288 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000289
Justin Bognere4ca4412015-02-23 19:27:00 +0000290 // Skip lambda expressions. We visit these as FunctionDecls when we're
291 // generating them and aren't interested in the body when generating a
292 // parent context.
293 void VisitLambdaExpr(const LambdaExpr *LE) {}
Bob Wilsonbf854f02014-02-17 19:21:09 +0000294
Justin Bognere4ca4412015-02-23 19:27:00 +0000295 void VisitCapturedDecl(const CapturedDecl *D) {
296 // Counter tracks entry to the capture body.
Justin Bogner07193cc2015-05-01 23:41:09 +0000297 uint64_t BodyCount = setCount(PGO.getRegionCount(D->getBody()));
298 CountMap[D->getBody()] = BodyCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000299 Visit(D->getBody());
300 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000301
Justin Bognere4ca4412015-02-23 19:27:00 +0000302 void VisitObjCMethodDecl(const ObjCMethodDecl *D) {
303 // Counter tracks entry to the method body.
Justin Bogner07193cc2015-05-01 23:41:09 +0000304 uint64_t BodyCount = setCount(PGO.getRegionCount(D->getBody()));
305 CountMap[D->getBody()] = BodyCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000306 Visit(D->getBody());
307 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000308
Justin Bognere4ca4412015-02-23 19:27:00 +0000309 void VisitBlockDecl(const BlockDecl *D) {
310 // Counter tracks entry to the block body.
Justin Bogner07193cc2015-05-01 23:41:09 +0000311 uint64_t BodyCount = setCount(PGO.getRegionCount(D->getBody()));
312 CountMap[D->getBody()] = BodyCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000313 Visit(D->getBody());
314 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000315
Justin Bognere4ca4412015-02-23 19:27:00 +0000316 void VisitReturnStmt(const ReturnStmt *S) {
317 RecordStmtCount(S);
318 if (S->getRetValue())
319 Visit(S->getRetValue());
Justin Bognera909abf2015-05-02 00:48:27 +0000320 CurrentCount = 0;
Justin Bognere4ca4412015-02-23 19:27:00 +0000321 RecordNextStmtCount = true;
322 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000323
Justin Bognerf959feb2015-04-28 06:31:55 +0000324 void VisitCXXThrowExpr(const CXXThrowExpr *E) {
325 RecordStmtCount(E);
326 if (E->getSubExpr())
327 Visit(E->getSubExpr());
Justin Bognera909abf2015-05-02 00:48:27 +0000328 CurrentCount = 0;
Justin Bognerf959feb2015-04-28 06:31:55 +0000329 RecordNextStmtCount = true;
330 }
331
Justin Bognere4ca4412015-02-23 19:27:00 +0000332 void VisitGotoStmt(const GotoStmt *S) {
333 RecordStmtCount(S);
Justin Bognera909abf2015-05-02 00:48:27 +0000334 CurrentCount = 0;
Justin Bognere4ca4412015-02-23 19:27:00 +0000335 RecordNextStmtCount = true;
336 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000337
Justin Bognere4ca4412015-02-23 19:27:00 +0000338 void VisitLabelStmt(const LabelStmt *S) {
339 RecordNextStmtCount = false;
340 // Counter tracks the block following the label.
Justin Bogner07193cc2015-05-01 23:41:09 +0000341 uint64_t BlockCount = setCount(PGO.getRegionCount(S));
342 CountMap[S] = BlockCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000343 Visit(S->getSubStmt());
344 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000345
Justin Bognere4ca4412015-02-23 19:27:00 +0000346 void VisitBreakStmt(const BreakStmt *S) {
347 RecordStmtCount(S);
348 assert(!BreakContinueStack.empty() && "break not in a loop or switch!");
Justin Bognera909abf2015-05-02 00:48:27 +0000349 BreakContinueStack.back().BreakCount += CurrentCount;
350 CurrentCount = 0;
Justin Bognere4ca4412015-02-23 19:27:00 +0000351 RecordNextStmtCount = true;
352 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000353
Justin Bognere4ca4412015-02-23 19:27:00 +0000354 void VisitContinueStmt(const ContinueStmt *S) {
355 RecordStmtCount(S);
356 assert(!BreakContinueStack.empty() && "continue stmt not in a loop!");
Justin Bognera909abf2015-05-02 00:48:27 +0000357 BreakContinueStack.back().ContinueCount += CurrentCount;
358 CurrentCount = 0;
Justin Bognere4ca4412015-02-23 19:27:00 +0000359 RecordNextStmtCount = true;
360 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000361
Justin Bognere4ca4412015-02-23 19:27:00 +0000362 void VisitWhileStmt(const WhileStmt *S) {
363 RecordStmtCount(S);
Justin Bognera909abf2015-05-02 00:48:27 +0000364 uint64_t ParentCount = CurrentCount;
Justin Bogner07193cc2015-05-01 23:41:09 +0000365
Justin Bognere4ca4412015-02-23 19:27:00 +0000366 BreakContinueStack.push_back(BreakContinue());
367 // Visit the body region first so the break/continue adjustments can be
368 // included when visiting the condition.
Justin Bogner07193cc2015-05-01 23:41:09 +0000369 uint64_t BodyCount = setCount(PGO.getRegionCount(S));
Justin Bognera909abf2015-05-02 00:48:27 +0000370 CountMap[S->getBody()] = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000371 Visit(S->getBody());
Justin Bognera909abf2015-05-02 00:48:27 +0000372 uint64_t BackedgeCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000373
374 // ...then go back and propagate counts through the condition. The count
375 // at the start of the condition is the sum of the incoming edges,
376 // the backedge from the end of the loop body, and the edges from
377 // continue statements.
378 BreakContinue BC = BreakContinueStack.pop_back_val();
Justin Bogner07193cc2015-05-01 23:41:09 +0000379 uint64_t CondCount =
380 setCount(ParentCount + BackedgeCount + BC.ContinueCount);
381 CountMap[S->getCond()] = CondCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000382 Visit(S->getCond());
Justin Bogner07193cc2015-05-01 23:41:09 +0000383 setCount(BC.BreakCount + CondCount - BodyCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000384 RecordNextStmtCount = true;
385 }
386
387 void VisitDoStmt(const DoStmt *S) {
388 RecordStmtCount(S);
Justin Bogner07193cc2015-05-01 23:41:09 +0000389 uint64_t LoopCount = PGO.getRegionCount(S);
390
Justin Bognere4ca4412015-02-23 19:27:00 +0000391 BreakContinueStack.push_back(BreakContinue());
Justin Bogner07193cc2015-05-01 23:41:09 +0000392 // The count doesn't include the fallthrough from the parent scope. Add it.
Justin Bognera909abf2015-05-02 00:48:27 +0000393 uint64_t BodyCount = setCount(LoopCount + CurrentCount);
Justin Bogner07193cc2015-05-01 23:41:09 +0000394 CountMap[S->getBody()] = BodyCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000395 Visit(S->getBody());
Justin Bognera909abf2015-05-02 00:48:27 +0000396 uint64_t BackedgeCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000397
398 BreakContinue BC = BreakContinueStack.pop_back_val();
399 // The count at the start of the condition is equal to the count at the
Justin Bogner07193cc2015-05-01 23:41:09 +0000400 // end of the body, plus any continues.
401 uint64_t CondCount = setCount(BackedgeCount + BC.ContinueCount);
402 CountMap[S->getCond()] = CondCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000403 Visit(S->getCond());
Justin Bogner07193cc2015-05-01 23:41:09 +0000404 setCount(BC.BreakCount + CondCount - LoopCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000405 RecordNextStmtCount = true;
406 }
407
408 void VisitForStmt(const ForStmt *S) {
409 RecordStmtCount(S);
410 if (S->getInit())
411 Visit(S->getInit());
Justin Bogner07193cc2015-05-01 23:41:09 +0000412
Justin Bognera909abf2015-05-02 00:48:27 +0000413 uint64_t ParentCount = CurrentCount;
Justin Bogner07193cc2015-05-01 23:41:09 +0000414
Justin Bognere4ca4412015-02-23 19:27:00 +0000415 BreakContinueStack.push_back(BreakContinue());
416 // Visit the body region first. (This is basically the same as a while
417 // loop; see further comments in VisitWhileStmt.)
Justin Bogner07193cc2015-05-01 23:41:09 +0000418 uint64_t BodyCount = setCount(PGO.getRegionCount(S));
419 CountMap[S->getBody()] = BodyCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000420 Visit(S->getBody());
Justin Bognera909abf2015-05-02 00:48:27 +0000421 uint64_t BackedgeCount = CurrentCount;
Justin Bogner07193cc2015-05-01 23:41:09 +0000422 BreakContinue BC = BreakContinueStack.pop_back_val();
Justin Bognere4ca4412015-02-23 19:27:00 +0000423
424 // The increment is essentially part of the body but it needs to include
425 // the count for all the continue statements.
426 if (S->getInc()) {
Justin Bogner07193cc2015-05-01 23:41:09 +0000427 uint64_t IncCount = setCount(BackedgeCount + BC.ContinueCount);
428 CountMap[S->getInc()] = IncCount;
Bob Wilsonbf854f02014-02-17 19:21:09 +0000429 Visit(S->getInc());
Justin Bognere4ca4412015-02-23 19:27:00 +0000430 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000431
Justin Bognere4ca4412015-02-23 19:27:00 +0000432 // ...then go back and propagate counts through the condition.
Justin Bogner07193cc2015-05-01 23:41:09 +0000433 uint64_t CondCount =
434 setCount(ParentCount + BackedgeCount + BC.ContinueCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000435 if (S->getCond()) {
Justin Bogner07193cc2015-05-01 23:41:09 +0000436 CountMap[S->getCond()] = CondCount;
Bob Wilsonbf854f02014-02-17 19:21:09 +0000437 Visit(S->getCond());
Bob Wilsonbf854f02014-02-17 19:21:09 +0000438 }
Justin Bogner07193cc2015-05-01 23:41:09 +0000439 setCount(BC.BreakCount + CondCount - BodyCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000440 RecordNextStmtCount = true;
441 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000442
Justin Bognere4ca4412015-02-23 19:27:00 +0000443 void VisitCXXForRangeStmt(const CXXForRangeStmt *S) {
444 RecordStmtCount(S);
Justin Bogner2e5d4842015-04-30 22:58:28 +0000445 Visit(S->getLoopVarStmt());
Justin Bognere4ca4412015-02-23 19:27:00 +0000446 Visit(S->getRangeStmt());
447 Visit(S->getBeginEndStmt());
Justin Bogner07193cc2015-05-01 23:41:09 +0000448
Justin Bognera909abf2015-05-02 00:48:27 +0000449 uint64_t ParentCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000450 BreakContinueStack.push_back(BreakContinue());
451 // Visit the body region first. (This is basically the same as a while
452 // loop; see further comments in VisitWhileStmt.)
Justin Bogner07193cc2015-05-01 23:41:09 +0000453 uint64_t BodyCount = setCount(PGO.getRegionCount(S));
454 CountMap[S->getBody()] = BodyCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000455 Visit(S->getBody());
Justin Bognera909abf2015-05-02 00:48:27 +0000456 uint64_t BackedgeCount = CurrentCount;
Justin Bogner07193cc2015-05-01 23:41:09 +0000457 BreakContinue BC = BreakContinueStack.pop_back_val();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000458
Justin Bognere4ca4412015-02-23 19:27:00 +0000459 // The increment is essentially part of the body but it needs to include
460 // the count for all the continue statements.
Justin Bogner07193cc2015-05-01 23:41:09 +0000461 uint64_t IncCount = setCount(BackedgeCount + BC.ContinueCount);
462 CountMap[S->getInc()] = IncCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000463 Visit(S->getInc());
Bob Wilsonbf854f02014-02-17 19:21:09 +0000464
Justin Bognere4ca4412015-02-23 19:27:00 +0000465 // ...then go back and propagate counts through the condition.
Justin Bogner07193cc2015-05-01 23:41:09 +0000466 uint64_t CondCount =
467 setCount(ParentCount + BackedgeCount + BC.ContinueCount);
468 CountMap[S->getCond()] = CondCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000469 Visit(S->getCond());
Justin Bogner07193cc2015-05-01 23:41:09 +0000470 setCount(BC.BreakCount + CondCount - BodyCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000471 RecordNextStmtCount = true;
472 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000473
Justin Bognere4ca4412015-02-23 19:27:00 +0000474 void VisitObjCForCollectionStmt(const ObjCForCollectionStmt *S) {
475 RecordStmtCount(S);
476 Visit(S->getElement());
Justin Bognera909abf2015-05-02 00:48:27 +0000477 uint64_t ParentCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000478 BreakContinueStack.push_back(BreakContinue());
Justin Bogner07193cc2015-05-01 23:41:09 +0000479 // Counter tracks the body of the loop.
480 uint64_t BodyCount = setCount(PGO.getRegionCount(S));
481 CountMap[S->getBody()] = BodyCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000482 Visit(S->getBody());
Justin Bognera909abf2015-05-02 00:48:27 +0000483 uint64_t BackedgeCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000484 BreakContinue BC = BreakContinueStack.pop_back_val();
Justin Bogner07193cc2015-05-01 23:41:09 +0000485
486 setCount(BC.BreakCount + ParentCount + BackedgeCount + BC.ContinueCount -
487 BodyCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000488 RecordNextStmtCount = true;
489 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000490
Justin Bognere4ca4412015-02-23 19:27:00 +0000491 void VisitSwitchStmt(const SwitchStmt *S) {
492 RecordStmtCount(S);
493 Visit(S->getCond());
Justin Bognera909abf2015-05-02 00:48:27 +0000494 CurrentCount = 0;
Justin Bognere4ca4412015-02-23 19:27:00 +0000495 BreakContinueStack.push_back(BreakContinue());
496 Visit(S->getBody());
497 // If the switch is inside a loop, add the continue counts.
498 BreakContinue BC = BreakContinueStack.pop_back_val();
499 if (!BreakContinueStack.empty())
500 BreakContinueStack.back().ContinueCount += BC.ContinueCount;
501 // Counter tracks the exit block of the switch.
Justin Bogner07193cc2015-05-01 23:41:09 +0000502 setCount(PGO.getRegionCount(S));
Justin Bognere4ca4412015-02-23 19:27:00 +0000503 RecordNextStmtCount = true;
504 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000505
Justin Bogner07193cc2015-05-01 23:41:09 +0000506 void VisitSwitchCase(const SwitchCase *S) {
Justin Bognere4ca4412015-02-23 19:27:00 +0000507 RecordNextStmtCount = false;
508 // Counter for this particular case. This counts only jumps from the
509 // switch header and does not include fallthrough from the case before
510 // this one.
Justin Bogner07193cc2015-05-01 23:41:09 +0000511 uint64_t CaseCount = PGO.getRegionCount(S);
Justin Bognera909abf2015-05-02 00:48:27 +0000512 setCount(CurrentCount + CaseCount);
Justin Bogner07193cc2015-05-01 23:41:09 +0000513 // We need the count without fallthrough in the mapping, so it's more useful
514 // for branch probabilities.
515 CountMap[S] = CaseCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000516 RecordNextStmtCount = true;
517 Visit(S->getSubStmt());
518 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000519
Justin Bognere4ca4412015-02-23 19:27:00 +0000520 void VisitIfStmt(const IfStmt *S) {
521 RecordStmtCount(S);
Justin Bognera909abf2015-05-02 00:48:27 +0000522 uint64_t ParentCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000523 Visit(S->getCond());
Bob Wilsonbf854f02014-02-17 19:21:09 +0000524
Justin Bogner07193cc2015-05-01 23:41:09 +0000525 // Counter tracks the "then" part of an if statement. The count for
526 // the "else" part, if it exists, will be calculated from this counter.
527 uint64_t ThenCount = setCount(PGO.getRegionCount(S));
528 CountMap[S->getThen()] = ThenCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000529 Visit(S->getThen());
Justin Bognera909abf2015-05-02 00:48:27 +0000530 uint64_t OutCount = CurrentCount;
Bob Wilsonbf854f02014-02-17 19:21:09 +0000531
Justin Bogner07193cc2015-05-01 23:41:09 +0000532 uint64_t ElseCount = ParentCount - ThenCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000533 if (S->getElse()) {
Justin Bogner07193cc2015-05-01 23:41:09 +0000534 setCount(ElseCount);
535 CountMap[S->getElse()] = ElseCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000536 Visit(S->getElse());
Justin Bognera909abf2015-05-02 00:48:27 +0000537 OutCount += CurrentCount;
Justin Bogner07193cc2015-05-01 23:41:09 +0000538 } else
539 OutCount += ElseCount;
540 setCount(OutCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000541 RecordNextStmtCount = true;
542 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000543
Justin Bognere4ca4412015-02-23 19:27:00 +0000544 void VisitCXXTryStmt(const CXXTryStmt *S) {
545 RecordStmtCount(S);
546 Visit(S->getTryBlock());
547 for (unsigned I = 0, E = S->getNumHandlers(); I < E; ++I)
548 Visit(S->getHandler(I));
549 // Counter tracks the continuation block of the try statement.
Justin Bogner07193cc2015-05-01 23:41:09 +0000550 setCount(PGO.getRegionCount(S));
Justin Bognere4ca4412015-02-23 19:27:00 +0000551 RecordNextStmtCount = true;
552 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000553
Justin Bognere4ca4412015-02-23 19:27:00 +0000554 void VisitCXXCatchStmt(const CXXCatchStmt *S) {
555 RecordNextStmtCount = false;
556 // Counter tracks the catch statement's handler block.
Justin Bogner07193cc2015-05-01 23:41:09 +0000557 uint64_t CatchCount = setCount(PGO.getRegionCount(S));
558 CountMap[S] = CatchCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000559 Visit(S->getHandlerBlock());
560 }
561
562 void VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) {
563 RecordStmtCount(E);
Justin Bognera909abf2015-05-02 00:48:27 +0000564 uint64_t ParentCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000565 Visit(E->getCond());
566
Justin Bogner07193cc2015-05-01 23:41:09 +0000567 // Counter tracks the "true" part of a conditional operator. The
568 // count in the "false" part will be calculated from this counter.
569 uint64_t TrueCount = setCount(PGO.getRegionCount(E));
570 CountMap[E->getTrueExpr()] = TrueCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000571 Visit(E->getTrueExpr());
Justin Bognera909abf2015-05-02 00:48:27 +0000572 uint64_t OutCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000573
Justin Bogner07193cc2015-05-01 23:41:09 +0000574 uint64_t FalseCount = setCount(ParentCount - TrueCount);
575 CountMap[E->getFalseExpr()] = FalseCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000576 Visit(E->getFalseExpr());
Justin Bognera909abf2015-05-02 00:48:27 +0000577 OutCount += CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000578
Justin Bogner07193cc2015-05-01 23:41:09 +0000579 setCount(OutCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000580 RecordNextStmtCount = true;
581 }
582
583 void VisitBinLAnd(const BinaryOperator *E) {
584 RecordStmtCount(E);
Justin Bognera909abf2015-05-02 00:48:27 +0000585 uint64_t ParentCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000586 Visit(E->getLHS());
Justin Bogner07193cc2015-05-01 23:41:09 +0000587 // Counter tracks the right hand side of a logical and operator.
588 uint64_t RHSCount = setCount(PGO.getRegionCount(E));
589 CountMap[E->getRHS()] = RHSCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000590 Visit(E->getRHS());
Justin Bognera909abf2015-05-02 00:48:27 +0000591 setCount(ParentCount + RHSCount - CurrentCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000592 RecordNextStmtCount = true;
593 }
594
595 void VisitBinLOr(const BinaryOperator *E) {
596 RecordStmtCount(E);
Justin Bognera909abf2015-05-02 00:48:27 +0000597 uint64_t ParentCount = CurrentCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000598 Visit(E->getLHS());
Justin Bogner07193cc2015-05-01 23:41:09 +0000599 // Counter tracks the right hand side of a logical or operator.
600 uint64_t RHSCount = setCount(PGO.getRegionCount(E));
601 CountMap[E->getRHS()] = RHSCount;
Justin Bognere4ca4412015-02-23 19:27:00 +0000602 Visit(E->getRHS());
Justin Bognera909abf2015-05-02 00:48:27 +0000603 setCount(ParentCount + RHSCount - CurrentCount);
Justin Bognere4ca4412015-02-23 19:27:00 +0000604 RecordNextStmtCount = true;
605 }
606};
Hans Wennborgdcfba332015-10-06 23:40:43 +0000607} // end anonymous namespace
Justin Bogneref512b92014-01-06 22:27:43 +0000608
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +0000609void PGOHash::combine(HashType Type) {
610 // Check that we never combine 0 and only have six bits.
611 assert(Type && "Hash is invalid: unexpected type 0");
612 assert(unsigned(Type) < TooBig && "Hash is invalid: too many types");
613
614 // Pass through MD5 if enough work has built up.
615 if (Count && Count % NumTypesPerWord == 0) {
616 using namespace llvm::support;
617 uint64_t Swapped = endian::byte_swap<uint64_t, little>(Working);
618 MD5.update(llvm::makeArrayRef((uint8_t *)&Swapped, sizeof(Swapped)));
619 Working = 0;
620 }
621
622 // Accumulate the current type.
623 ++Count;
624 Working = Working << NumBitsPerType | Type;
625}
626
627uint64_t PGOHash::finalize() {
628 // Use Working as the hash directly if we never used MD5.
629 if (Count <= NumTypesPerWord)
630 // No need to byte swap here, since none of the math was endian-dependent.
631 // This number will be byte-swapped as required on endianness transitions,
632 // so we will see the same value on the other side.
633 return Working;
634
635 // Check for remaining work in Working.
636 if (Working)
637 MD5.update(Working);
638
639 // Finalize the MD5 and return the hash.
640 llvm::MD5::MD5Result Result;
641 MD5.final(Result);
642 using namespace llvm::support;
643 return endian::read<uint64_t, little, unaligned>(Result);
644}
645
Alex Lorenzee024992014-08-04 18:41:51 +0000646void CodeGenPGO::checkGlobalDecl(GlobalDecl GD) {
647 // Make sure we only emit coverage mapping for one constructor/destructor.
648 // Clang emits several functions for the constructor and the destructor of
649 // a class. Every function is instrumented, but we only want to provide
650 // coverage for one of them. Because of that we only emit the coverage mapping
651 // for the base constructor/destructor.
652 if ((isa<CXXConstructorDecl>(GD.getDecl()) &&
Alex Lorenzd4236742014-08-11 18:21:34 +0000653 GD.getCtorType() != Ctor_Base) ||
Alex Lorenzee024992014-08-04 18:41:51 +0000654 (isa<CXXDestructorDecl>(GD.getDecl()) &&
655 GD.getDtorType() != Dtor_Base)) {
656 SkipCoverageMapping = true;
657 }
658}
659
Bob Wilsonda1ebed2014-03-06 04:55:41 +0000660void CodeGenPGO::assignRegionCounters(const Decl *D, llvm::Function *Fn) {
Justin Bogneref512b92014-01-06 22:27:43 +0000661 bool InstrumentRegions = CGM.getCodeGenOpts().ProfileInstrGenerate;
Justin Bogner837a6f62014-04-18 21:52:00 +0000662 llvm::IndexedInstrProfReader *PGOReader = CGM.getPGOReader();
663 if (!InstrumentRegions && !PGOReader)
Justin Bogneref512b92014-01-06 22:27:43 +0000664 return;
Justin Bogner3212b182014-04-25 07:20:05 +0000665 if (D->isImplicit())
Justin Bogneref512b92014-01-06 22:27:43 +0000666 return;
Alex Lorenzee024992014-08-04 18:41:51 +0000667 CGM.ClearUnusedCoverageMapping(D);
Bob Wilsonda1ebed2014-03-06 04:55:41 +0000668 setFuncName(Fn);
Duncan P. N. Exon Smith7c414512014-03-20 22:50:08 +0000669
Justin Bogneref512b92014-01-06 22:27:43 +0000670 mapRegionCounters(D);
Justin Bogner970ac602014-12-08 19:04:51 +0000671 if (CGM.getCodeGenOpts().CoverageMapping)
672 emitCounterRegionMapping(D);
Justin Bogner837a6f62014-04-18 21:52:00 +0000673 if (PGOReader) {
Justin Bogner40b8ba12014-06-26 01:45:07 +0000674 SourceManager &SM = CGM.getContext().getSourceManager();
675 loadRegionCounts(PGOReader, SM.isInMainFile(D->getLocation()));
Bob Wilsonbf854f02014-02-17 19:21:09 +0000676 computeRegionCounts(D);
Justin Bogner837a6f62014-04-18 21:52:00 +0000677 applyFunctionAttributes(PGOReader, Fn);
Bob Wilsonbf854f02014-02-17 19:21:09 +0000678 }
Justin Bogneref512b92014-01-06 22:27:43 +0000679}
680
681void CodeGenPGO::mapRegionCounters(const Decl *D) {
Duncan P. N. Exon Smith1b67cfd2014-03-26 19:26:05 +0000682 RegionCounterMap.reset(new llvm::DenseMap<const Stmt *, unsigned>);
Duncan P. N. Exon Smith3586be72014-03-26 19:26:02 +0000683 MapRegionCounters Walker(*RegionCounterMap);
Justin Bogneref512b92014-01-06 22:27:43 +0000684 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
Bob Wilsond8931422014-04-11 17:16:13 +0000685 Walker.TraverseDecl(const_cast<FunctionDecl *>(FD));
Bob Wilson5ec8fe12014-03-06 06:10:02 +0000686 else if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
Bob Wilsond8931422014-04-11 17:16:13 +0000687 Walker.TraverseDecl(const_cast<ObjCMethodDecl *>(MD));
Bob Wilsonc845c002014-03-06 20:24:27 +0000688 else if (const BlockDecl *BD = dyn_cast_or_null<BlockDecl>(D))
Bob Wilsond8931422014-04-11 17:16:13 +0000689 Walker.TraverseDecl(const_cast<BlockDecl *>(BD));
Justin Bogner81ab90f2014-04-15 00:50:54 +0000690 else if (const CapturedDecl *CD = dyn_cast_or_null<CapturedDecl>(D))
691 Walker.TraverseDecl(const_cast<CapturedDecl *>(CD));
Justin Bogner3212b182014-04-25 07:20:05 +0000692 assert(Walker.NextCounter > 0 && "no entry counter mapped for decl");
Justin Bogneref512b92014-01-06 22:27:43 +0000693 NumRegionCounters = Walker.NextCounter;
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +0000694 FunctionHash = Walker.Hash.finalize();
Justin Bogneref512b92014-01-06 22:27:43 +0000695}
696
Alex Lorenzee024992014-08-04 18:41:51 +0000697void CodeGenPGO::emitCounterRegionMapping(const Decl *D) {
698 if (SkipCoverageMapping)
699 return;
700 // Don't map the functions inside the system headers
701 auto Loc = D->getBody()->getLocStart();
702 if (CGM.getContext().getSourceManager().isInSystemHeader(Loc))
703 return;
704
Justin Bogner970ac602014-12-08 19:04:51 +0000705 std::string CoverageMapping;
Alex Lorenzee024992014-08-04 18:41:51 +0000706 llvm::raw_string_ostream OS(CoverageMapping);
707 CoverageMappingGen MappingGen(*CGM.getCoverageMapping(),
708 CGM.getContext().getSourceManager(),
Justin Bognere5ee6c52014-10-02 16:44:01 +0000709 CGM.getLangOpts(), RegionCounterMap.get());
Alex Lorenzee024992014-08-04 18:41:51 +0000710 MappingGen.emitCounterMapping(D, OS);
711 OS.flush();
Justin Bogner970ac602014-12-08 19:04:51 +0000712
713 if (CoverageMapping.empty())
714 return;
715
716 CGM.getCoverageMapping()->addFunctionMappingRecord(
717 FuncNameVar, FuncName, FunctionHash, CoverageMapping);
Alex Lorenzee024992014-08-04 18:41:51 +0000718}
719
720void
Justin Bogner60d852b2015-04-23 00:31:16 +0000721CodeGenPGO::emitEmptyCounterMapping(const Decl *D, StringRef Name,
Alex Lorenzee024992014-08-04 18:41:51 +0000722 llvm::GlobalValue::LinkageTypes Linkage) {
723 if (SkipCoverageMapping)
724 return;
Alex Lorenzee024992014-08-04 18:41:51 +0000725 // Don't map the functions inside the system headers
726 auto Loc = D->getBody()->getLocStart();
727 if (CGM.getContext().getSourceManager().isInSystemHeader(Loc))
728 return;
729
Justin Bogner970ac602014-12-08 19:04:51 +0000730 std::string CoverageMapping;
Alex Lorenzee024992014-08-04 18:41:51 +0000731 llvm::raw_string_ostream OS(CoverageMapping);
732 CoverageMappingGen MappingGen(*CGM.getCoverageMapping(),
733 CGM.getContext().getSourceManager(),
734 CGM.getLangOpts());
735 MappingGen.emitEmptyMapping(D, OS);
736 OS.flush();
Justin Bogner970ac602014-12-08 19:04:51 +0000737
738 if (CoverageMapping.empty())
739 return;
740
Justin Bogner60d852b2015-04-23 00:31:16 +0000741 setFuncName(Name, Linkage);
Justin Bogner970ac602014-12-08 19:04:51 +0000742 CGM.getCoverageMapping()->addFunctionMappingRecord(
743 FuncNameVar, FuncName, FunctionHash, CoverageMapping);
Alex Lorenzee024992014-08-04 18:41:51 +0000744}
745
Bob Wilsonbf854f02014-02-17 19:21:09 +0000746void CodeGenPGO::computeRegionCounts(const Decl *D) {
Duncan P. N. Exon Smith1b67cfd2014-03-26 19:26:05 +0000747 StmtCountMap.reset(new llvm::DenseMap<const Stmt *, uint64_t>);
Duncan P. N. Exon Smith3586be72014-03-26 19:26:02 +0000748 ComputeRegionCounts Walker(*StmtCountMap, *this);
Bob Wilsonbf854f02014-02-17 19:21:09 +0000749 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
750 Walker.VisitFunctionDecl(FD);
Bob Wilson5ec8fe12014-03-06 06:10:02 +0000751 else if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
752 Walker.VisitObjCMethodDecl(MD);
Bob Wilsonc845c002014-03-06 20:24:27 +0000753 else if (const BlockDecl *BD = dyn_cast_or_null<BlockDecl>(D))
754 Walker.VisitBlockDecl(BD);
Justin Bogner81ab90f2014-04-15 00:50:54 +0000755 else if (const CapturedDecl *CD = dyn_cast_or_null<CapturedDecl>(D))
756 Walker.VisitCapturedDecl(const_cast<CapturedDecl *>(CD));
Bob Wilsonbf854f02014-02-17 19:21:09 +0000757}
758
Justin Bogner837a6f62014-04-18 21:52:00 +0000759void
760CodeGenPGO::applyFunctionAttributes(llvm::IndexedInstrProfReader *PGOReader,
761 llvm::Function *Fn) {
Justin Bogner4c9c45c2014-03-12 18:14:32 +0000762 if (!haveRegionCounts())
763 return;
764
Justin Bogner837a6f62014-04-18 21:52:00 +0000765 uint64_t MaxFunctionCount = PGOReader->getMaximumFunctionCount();
Hans Wennborgdcfba332015-10-06 23:40:43 +0000766 uint64_t FunctionCount = getRegionCount(nullptr);
Justin Bogner4c9c45c2014-03-12 18:14:32 +0000767 if (FunctionCount >= (uint64_t)(0.3 * (double)MaxFunctionCount))
768 // Turn on InlineHint attribute for hot functions.
769 // FIXME: 30% is from preliminary tuning on SPEC, it may not be optimal.
770 Fn->addFnAttr(llvm::Attribute::InlineHint);
771 else if (FunctionCount <= (uint64_t)(0.01 * (double)MaxFunctionCount))
772 // Turn on Cold attribute for cold functions.
773 // FIXME: 1% is from preliminary tuning on SPEC, it may not be optimal.
774 Fn->addFnAttr(llvm::Attribute::Cold);
Diego Novilloaa8b1cb2015-05-27 21:58:42 +0000775
776 Fn->setEntryCount(FunctionCount);
Justin Bogner4c9c45c2014-03-12 18:14:32 +0000777}
778
Justin Bogner66242d62015-04-23 23:06:47 +0000779void CodeGenPGO::emitCounterIncrement(CGBuilderTy &Builder, const Stmt *S) {
Justin Bogner970ac602014-12-08 19:04:51 +0000780 if (!CGM.getCodeGenOpts().ProfileInstrGenerate || !RegionCounterMap)
Justin Bogneref512b92014-01-06 22:27:43 +0000781 return;
Duncan P. N. Exon Smith9f5260a2015-11-06 23:00:41 +0000782 if (!Builder.GetInsertBlock())
Justin Bogner203f91e2015-01-09 01:46:40 +0000783 return;
Justin Bogner66242d62015-04-23 23:06:47 +0000784
785 unsigned Counter = (*RegionCounterMap)[S];
Justin Bogner970ac602014-12-08 19:04:51 +0000786 auto *I8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext());
David Blaikie43f9bb72015-05-18 22:14:03 +0000787 Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::instrprof_increment),
788 {llvm::ConstantExpr::getBitCast(FuncNameVar, I8PtrTy),
Justin Bogner970ac602014-12-08 19:04:51 +0000789 Builder.getInt64(FunctionHash),
790 Builder.getInt32(NumRegionCounters),
David Blaikie43f9bb72015-05-18 22:14:03 +0000791 Builder.getInt32(Counter)});
Justin Bogneref512b92014-01-06 22:27:43 +0000792}
793
Justin Bogner40b8ba12014-06-26 01:45:07 +0000794void CodeGenPGO::loadRegionCounts(llvm::IndexedInstrProfReader *PGOReader,
795 bool IsInMainFile) {
796 CGM.getPGOStats().addVisited(IsInMainFile);
Justin Bogner7f8cf5b2014-12-02 22:38:52 +0000797 RegionCounts.clear();
Justin Bogner970ac602014-12-08 19:04:51 +0000798 if (std::error_code EC =
799 PGOReader->getFunctionCounts(FuncName, FunctionHash, RegionCounts)) {
Justin Bogner9c6818e2014-08-01 22:50:16 +0000800 if (EC == llvm::instrprof_error::unknown_function)
801 CGM.getPGOStats().addMissing(IsInMainFile);
802 else if (EC == llvm::instrprof_error::hash_mismatch)
803 CGM.getPGOStats().addMismatched(IsInMainFile);
804 else if (EC == llvm::instrprof_error::malformed)
805 // TODO: Consider a more specific warning for this case.
806 CGM.getPGOStats().addMismatched(IsInMainFile);
Justin Bogner7f8cf5b2014-12-02 22:38:52 +0000807 RegionCounts.clear();
Justin Bognere2ef2a02014-04-15 21:22:35 +0000808 }
Justin Bogneref512b92014-01-06 22:27:43 +0000809}
810
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000811/// \brief Calculate what to divide by to scale weights.
812///
813/// Given the maximum weight, calculate a divisor that will scale all the
814/// weights to strictly less than UINT32_MAX.
815static uint64_t calculateWeightScale(uint64_t MaxWeight) {
816 return MaxWeight < UINT32_MAX ? 1 : MaxWeight / UINT32_MAX + 1;
817}
818
819/// \brief Scale an individual branch weight (and add 1).
820///
821/// Scale a 64-bit weight down to 32-bits using \c Scale.
822///
823/// According to Laplace's Rule of Succession, it is better to compute the
824/// weight based on the count plus 1, so universally add 1 to the value.
825///
826/// \pre \c Scale was calculated by \a calculateWeightScale() with a weight no
827/// greater than \c Weight.
828static uint32_t scaleBranchWeight(uint64_t Weight, uint64_t Scale) {
829 assert(Scale && "scale by 0?");
830 uint64_t Scaled = Weight / Scale + 1;
831 assert(Scaled <= UINT32_MAX && "overflow 32-bits");
832 return Scaled;
833}
834
Justin Bogner65512642015-05-02 05:00:55 +0000835llvm::MDNode *CodeGenFunction::createProfileWeights(uint64_t TrueCount,
836 uint64_t FalseCount) {
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000837 // Check for empty weights.
Justin Bogneref512b92014-01-06 22:27:43 +0000838 if (!TrueCount && !FalseCount)
Duncan P. N. Exon Smitha5f804a2014-03-20 18:40:55 +0000839 return nullptr;
Justin Bogneref512b92014-01-06 22:27:43 +0000840
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000841 // Calculate how to scale down to 32-bits.
842 uint64_t Scale = calculateWeightScale(std::max(TrueCount, FalseCount));
843
Justin Bogneref512b92014-01-06 22:27:43 +0000844 llvm::MDBuilder MDHelper(CGM.getLLVMContext());
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000845 return MDHelper.createBranchWeights(scaleBranchWeight(TrueCount, Scale),
846 scaleBranchWeight(FalseCount, Scale));
Justin Bogneref512b92014-01-06 22:27:43 +0000847}
848
Justin Bogner65512642015-05-02 05:00:55 +0000849llvm::MDNode *
850CodeGenFunction::createProfileWeights(ArrayRef<uint64_t> Weights) {
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000851 // We need at least two elements to create meaningful weights.
852 if (Weights.size() < 2)
Duncan P. N. Exon Smitha5f804a2014-03-20 18:40:55 +0000853 return nullptr;
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000854
Justin Bognerf3aefca2014-04-04 02:48:51 +0000855 // Check for empty weights.
856 uint64_t MaxWeight = *std::max_element(Weights.begin(), Weights.end());
857 if (MaxWeight == 0)
858 return nullptr;
859
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000860 // Calculate how to scale down to 32-bits.
Justin Bognerf3aefca2014-04-04 02:48:51 +0000861 uint64_t Scale = calculateWeightScale(MaxWeight);
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000862
Justin Bogneref512b92014-01-06 22:27:43 +0000863 SmallVector<uint32_t, 16> ScaledWeights;
864 ScaledWeights.reserve(Weights.size());
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000865 for (uint64_t W : Weights)
866 ScaledWeights.push_back(scaleBranchWeight(W, Scale));
867
868 llvm::MDBuilder MDHelper(CGM.getLLVMContext());
Justin Bogneref512b92014-01-06 22:27:43 +0000869 return MDHelper.createBranchWeights(ScaledWeights);
870}
Bob Wilsonbf854f02014-02-17 19:21:09 +0000871
Justin Bogner65512642015-05-02 05:00:55 +0000872llvm::MDNode *CodeGenFunction::createProfileWeightsForLoop(const Stmt *Cond,
873 uint64_t LoopCount) {
874 if (!PGO.haveRegionCounts())
Duncan P. N. Exon Smitha5f804a2014-03-20 18:40:55 +0000875 return nullptr;
Justin Bogner65512642015-05-02 05:00:55 +0000876 Optional<uint64_t> CondCount = PGO.getStmtCount(Cond);
Justin Bogner1c21c282015-04-13 12:23:19 +0000877 assert(CondCount.hasValue() && "missing expected loop condition count");
878 if (*CondCount == 0)
Duncan P. N. Exon Smitha5f804a2014-03-20 18:40:55 +0000879 return nullptr;
Justin Bogner65512642015-05-02 05:00:55 +0000880 return createProfileWeights(LoopCount,
881 std::max(*CondCount, LoopCount) - LoopCount);
Bob Wilsonbf854f02014-02-17 19:21:09 +0000882}