blob: a88335d0ac76c94c2ba0b6a69c506c2083080251 [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) {
61 // Usually, we want to match the function's linkage, but
62 // available_externally and extern_weak both have the wrong semantics.
63 if (Linkage == llvm::GlobalValue::ExternalWeakLinkage)
64 Linkage = llvm::GlobalValue::LinkOnceAnyLinkage;
65 else if (Linkage == llvm::GlobalValue::AvailableExternallyLinkage)
66 Linkage = llvm::GlobalValue::LinkOnceODRLinkage;
Alex Lorenzee024992014-08-04 18:41:51 +000067
Justin Bogner970ac602014-12-08 19:04:51 +000068 auto *Value =
69 llvm::ConstantDataArray::getString(CGM.getLLVMContext(), FuncName, false);
70 FuncNameVar =
71 new llvm::GlobalVariable(CGM.getModule(), Value->getType(), true, Linkage,
72 Value, "__llvm_profile_name_" + FuncName);
Duncan P. N. Exon Smith2fe531c2014-03-17 21:18:30 +000073
Justin Bogner970ac602014-12-08 19:04:51 +000074 // Hide the symbol so that we correctly get a copy for each executable.
75 if (!llvm::GlobalValue::isLocalLinkage(FuncNameVar->getLinkage()))
76 FuncNameVar->setVisibility(llvm::GlobalValue::HiddenVisibility);
Justin Bogneref512b92014-01-06 22:27:43 +000077}
78
79namespace {
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +000080/// \brief Stable hasher for PGO region counters.
81///
82/// PGOHash produces a stable hash of a given function's control flow.
83///
84/// Changing the output of this hash will invalidate all previously generated
85/// profiles -- i.e., don't do it.
86///
87/// \note When this hash does eventually change (years?), we still need to
88/// support old hashes. We'll need to pull in the version number from the
89/// profile data format and use the matching hash function.
90class PGOHash {
91 uint64_t Working;
92 unsigned Count;
93 llvm::MD5 MD5;
94
95 static const int NumBitsPerType = 6;
96 static const unsigned NumTypesPerWord = sizeof(uint64_t) * 8 / NumBitsPerType;
97 static const unsigned TooBig = 1u << NumBitsPerType;
98
99public:
100 /// \brief Hash values for AST nodes.
101 ///
102 /// Distinct values for AST nodes that have region counters attached.
103 ///
104 /// These values must be stable. All new members must be added at the end,
105 /// and no members should be removed. Changing the enumeration value for an
106 /// AST node will affect the hash of every function that contains that node.
107 enum HashType : unsigned char {
108 None = 0,
109 LabelStmt = 1,
110 WhileStmt,
111 DoStmt,
112 ForStmt,
113 CXXForRangeStmt,
114 ObjCForCollectionStmt,
115 SwitchStmt,
116 CaseStmt,
117 DefaultStmt,
118 IfStmt,
119 CXXTryStmt,
120 CXXCatchStmt,
121 ConditionalOperator,
122 BinaryOperatorLAnd,
123 BinaryOperatorLOr,
124 BinaryConditionalOperator,
125
126 // Keep this last. It's for the static assert that follows.
127 LastHashType
128 };
129 static_assert(LastHashType <= TooBig, "Too many types in HashType");
130
131 // TODO: When this format changes, take in a version number here, and use the
132 // old hash calculation for file formats that used the old hash.
133 PGOHash() : Working(0), Count(0) {}
134 void combine(HashType Type);
135 uint64_t finalize();
136};
137const int PGOHash::NumBitsPerType;
138const unsigned PGOHash::NumTypesPerWord;
139const unsigned PGOHash::TooBig;
140
Justin Bognere4ca4412015-02-23 19:27:00 +0000141/// A RecursiveASTVisitor that fills a map of statements to PGO counters.
142struct MapRegionCounters : public RecursiveASTVisitor<MapRegionCounters> {
143 /// The next counter value to assign.
144 unsigned NextCounter;
145 /// The function hash.
146 PGOHash Hash;
147 /// The map of statements to counters.
148 llvm::DenseMap<const Stmt *, unsigned> &CounterMap;
Justin Bogneref512b92014-01-06 22:27:43 +0000149
Justin Bognere4ca4412015-02-23 19:27:00 +0000150 MapRegionCounters(llvm::DenseMap<const Stmt *, unsigned> &CounterMap)
151 : NextCounter(0), CounterMap(CounterMap) {}
Justin Bogneref512b92014-01-06 22:27:43 +0000152
Justin Bognere4ca4412015-02-23 19:27:00 +0000153 // Blocks and lambdas are handled as separate functions, so we need not
154 // traverse them in the parent context.
155 bool TraverseBlockExpr(BlockExpr *BE) { return true; }
156 bool TraverseLambdaBody(LambdaExpr *LE) { return true; }
157 bool TraverseCapturedStmt(CapturedStmt *CS) { return true; }
Justin Bogneref512b92014-01-06 22:27:43 +0000158
Justin Bognere4ca4412015-02-23 19:27:00 +0000159 bool VisitDecl(const Decl *D) {
160 switch (D->getKind()) {
161 default:
162 break;
163 case Decl::Function:
164 case Decl::CXXMethod:
165 case Decl::CXXConstructor:
166 case Decl::CXXDestructor:
167 case Decl::CXXConversion:
168 case Decl::ObjCMethod:
169 case Decl::Block:
170 case Decl::Captured:
171 CounterMap[D->getBody()] = NextCounter++;
172 break;
173 }
174 return true;
175 }
176
177 bool VisitStmt(const Stmt *S) {
178 auto Type = getHashType(S);
179 if (Type == PGOHash::None)
Bob Wilsond8931422014-04-11 17:16:13 +0000180 return true;
Bob Wilsond8931422014-04-11 17:16:13 +0000181
Justin Bognere4ca4412015-02-23 19:27:00 +0000182 CounterMap[S] = NextCounter++;
183 Hash.combine(Type);
184 return true;
185 }
186 PGOHash::HashType getHashType(const Stmt *S) {
187 switch (S->getStmtClass()) {
188 default:
189 break;
190 case Stmt::LabelStmtClass:
191 return PGOHash::LabelStmt;
192 case Stmt::WhileStmtClass:
193 return PGOHash::WhileStmt;
194 case Stmt::DoStmtClass:
195 return PGOHash::DoStmt;
196 case Stmt::ForStmtClass:
197 return PGOHash::ForStmt;
198 case Stmt::CXXForRangeStmtClass:
199 return PGOHash::CXXForRangeStmt;
200 case Stmt::ObjCForCollectionStmtClass:
201 return PGOHash::ObjCForCollectionStmt;
202 case Stmt::SwitchStmtClass:
203 return PGOHash::SwitchStmt;
204 case Stmt::CaseStmtClass:
205 return PGOHash::CaseStmt;
206 case Stmt::DefaultStmtClass:
207 return PGOHash::DefaultStmt;
208 case Stmt::IfStmtClass:
209 return PGOHash::IfStmt;
210 case Stmt::CXXTryStmtClass:
211 return PGOHash::CXXTryStmt;
212 case Stmt::CXXCatchStmtClass:
213 return PGOHash::CXXCatchStmt;
214 case Stmt::ConditionalOperatorClass:
215 return PGOHash::ConditionalOperator;
216 case Stmt::BinaryConditionalOperatorClass:
217 return PGOHash::BinaryConditionalOperator;
218 case Stmt::BinaryOperatorClass: {
219 const BinaryOperator *BO = cast<BinaryOperator>(S);
220 if (BO->getOpcode() == BO_LAnd)
221 return PGOHash::BinaryOperatorLAnd;
222 if (BO->getOpcode() == BO_LOr)
223 return PGOHash::BinaryOperatorLOr;
224 break;
225 }
226 }
227 return PGOHash::None;
228 }
229};
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +0000230
Justin Bognere4ca4412015-02-23 19:27:00 +0000231/// A StmtVisitor that propagates the raw counts through the AST and
232/// records the count at statements where the value may change.
233struct ComputeRegionCounts : public ConstStmtVisitor<ComputeRegionCounts> {
234 /// PGO state.
235 CodeGenPGO &PGO;
236
237 /// A flag that is set when the current count should be recorded on the
238 /// next statement, such as at the exit of a loop.
239 bool RecordNextStmtCount;
240
241 /// The map of statements to count values.
242 llvm::DenseMap<const Stmt *, uint64_t> &CountMap;
243
244 /// BreakContinueStack - Keep counts of breaks and continues inside loops.
245 struct BreakContinue {
246 uint64_t BreakCount;
247 uint64_t ContinueCount;
248 BreakContinue() : BreakCount(0), ContinueCount(0) {}
Justin Bogneref512b92014-01-06 22:27:43 +0000249 };
Justin Bognere4ca4412015-02-23 19:27:00 +0000250 SmallVector<BreakContinue, 8> BreakContinueStack;
Bob Wilsonbf854f02014-02-17 19:21:09 +0000251
Justin Bognere4ca4412015-02-23 19:27:00 +0000252 ComputeRegionCounts(llvm::DenseMap<const Stmt *, uint64_t> &CountMap,
253 CodeGenPGO &PGO)
254 : PGO(PGO), RecordNextStmtCount(false), CountMap(CountMap) {}
Bob Wilsonbf854f02014-02-17 19:21:09 +0000255
Justin Bognere4ca4412015-02-23 19:27:00 +0000256 void RecordStmtCount(const Stmt *S) {
257 if (RecordNextStmtCount) {
Duncan P. N. Exon Smith3586be72014-03-26 19:26:02 +0000258 CountMap[S] = PGO.getCurrentRegionCount();
Justin Bognere4ca4412015-02-23 19:27:00 +0000259 RecordNextStmtCount = false;
Bob Wilsonbf854f02014-02-17 19:21:09 +0000260 }
Justin Bognere4ca4412015-02-23 19:27:00 +0000261 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000262
Justin Bognere4ca4412015-02-23 19:27:00 +0000263 void VisitStmt(const Stmt *S) {
264 RecordStmtCount(S);
265 for (Stmt::const_child_range I = S->children(); I; ++I) {
266 if (*I)
267 this->Visit(*I);
Bob Wilsonbf854f02014-02-17 19:21:09 +0000268 }
Justin Bognere4ca4412015-02-23 19:27:00 +0000269 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000270
Justin Bognere4ca4412015-02-23 19:27:00 +0000271 void VisitFunctionDecl(const FunctionDecl *D) {
272 // Counter tracks entry to the function body.
273 RegionCounter Cnt(PGO, D->getBody());
274 Cnt.beginRegion();
275 CountMap[D->getBody()] = PGO.getCurrentRegionCount();
276 Visit(D->getBody());
277 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000278
Justin Bognere4ca4412015-02-23 19:27:00 +0000279 // Skip lambda expressions. We visit these as FunctionDecls when we're
280 // generating them and aren't interested in the body when generating a
281 // parent context.
282 void VisitLambdaExpr(const LambdaExpr *LE) {}
Bob Wilsonbf854f02014-02-17 19:21:09 +0000283
Justin Bognere4ca4412015-02-23 19:27:00 +0000284 void VisitCapturedDecl(const CapturedDecl *D) {
285 // Counter tracks entry to the capture body.
286 RegionCounter Cnt(PGO, D->getBody());
287 Cnt.beginRegion();
288 CountMap[D->getBody()] = PGO.getCurrentRegionCount();
289 Visit(D->getBody());
290 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000291
Justin Bognere4ca4412015-02-23 19:27:00 +0000292 void VisitObjCMethodDecl(const ObjCMethodDecl *D) {
293 // Counter tracks entry to the method body.
294 RegionCounter Cnt(PGO, D->getBody());
295 Cnt.beginRegion();
296 CountMap[D->getBody()] = PGO.getCurrentRegionCount();
297 Visit(D->getBody());
298 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000299
Justin Bognere4ca4412015-02-23 19:27:00 +0000300 void VisitBlockDecl(const BlockDecl *D) {
301 // Counter tracks entry to the block body.
302 RegionCounter Cnt(PGO, D->getBody());
303 Cnt.beginRegion();
304 CountMap[D->getBody()] = PGO.getCurrentRegionCount();
305 Visit(D->getBody());
306 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000307
Justin Bognere4ca4412015-02-23 19:27:00 +0000308 void VisitReturnStmt(const ReturnStmt *S) {
309 RecordStmtCount(S);
310 if (S->getRetValue())
311 Visit(S->getRetValue());
312 PGO.setCurrentRegionUnreachable();
313 RecordNextStmtCount = true;
314 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000315
Justin Bognere4ca4412015-02-23 19:27:00 +0000316 void VisitGotoStmt(const GotoStmt *S) {
317 RecordStmtCount(S);
318 PGO.setCurrentRegionUnreachable();
319 RecordNextStmtCount = true;
320 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000321
Justin Bognere4ca4412015-02-23 19:27:00 +0000322 void VisitLabelStmt(const LabelStmt *S) {
323 RecordNextStmtCount = false;
324 // Counter tracks the block following the label.
325 RegionCounter Cnt(PGO, S);
326 Cnt.beginRegion();
327 CountMap[S] = PGO.getCurrentRegionCount();
328 Visit(S->getSubStmt());
329 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000330
Justin Bognere4ca4412015-02-23 19:27:00 +0000331 void VisitBreakStmt(const BreakStmt *S) {
332 RecordStmtCount(S);
333 assert(!BreakContinueStack.empty() && "break not in a loop or switch!");
334 BreakContinueStack.back().BreakCount += PGO.getCurrentRegionCount();
335 PGO.setCurrentRegionUnreachable();
336 RecordNextStmtCount = true;
337 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000338
Justin Bognere4ca4412015-02-23 19:27:00 +0000339 void VisitContinueStmt(const ContinueStmt *S) {
340 RecordStmtCount(S);
341 assert(!BreakContinueStack.empty() && "continue stmt not in a loop!");
342 BreakContinueStack.back().ContinueCount += PGO.getCurrentRegionCount();
343 PGO.setCurrentRegionUnreachable();
344 RecordNextStmtCount = true;
345 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000346
Justin Bognere4ca4412015-02-23 19:27:00 +0000347 void VisitWhileStmt(const WhileStmt *S) {
348 RecordStmtCount(S);
349 // Counter tracks the body of the loop.
350 RegionCounter Cnt(PGO, S);
351 BreakContinueStack.push_back(BreakContinue());
352 // Visit the body region first so the break/continue adjustments can be
353 // included when visiting the condition.
354 Cnt.beginRegion();
355 CountMap[S->getBody()] = PGO.getCurrentRegionCount();
356 Visit(S->getBody());
357 Cnt.adjustForControlFlow();
358
359 // ...then go back and propagate counts through the condition. The count
360 // at the start of the condition is the sum of the incoming edges,
361 // the backedge from the end of the loop body, and the edges from
362 // continue statements.
363 BreakContinue BC = BreakContinueStack.pop_back_val();
364 Cnt.setCurrentRegionCount(Cnt.getParentCount() + Cnt.getAdjustedCount() +
365 BC.ContinueCount);
366 CountMap[S->getCond()] = PGO.getCurrentRegionCount();
367 Visit(S->getCond());
368 Cnt.adjustForControlFlow();
369 Cnt.applyAdjustmentsToRegion(BC.BreakCount + BC.ContinueCount);
370 RecordNextStmtCount = true;
371 }
372
373 void VisitDoStmt(const DoStmt *S) {
374 RecordStmtCount(S);
375 // Counter tracks the body of the loop.
376 RegionCounter Cnt(PGO, S);
377 BreakContinueStack.push_back(BreakContinue());
378 Cnt.beginRegion(/*AddIncomingFallThrough=*/true);
379 CountMap[S->getBody()] = PGO.getCurrentRegionCount();
380 Visit(S->getBody());
381 Cnt.adjustForControlFlow();
382
383 BreakContinue BC = BreakContinueStack.pop_back_val();
384 // The count at the start of the condition is equal to the count at the
385 // end of the body. The adjusted count does not include either the
386 // fall-through count coming into the loop or the continue count, so add
387 // both of those separately. This is coincidentally the same equation as
388 // with while loops but for different reasons.
389 Cnt.setCurrentRegionCount(Cnt.getParentCount() + Cnt.getAdjustedCount() +
390 BC.ContinueCount);
391 CountMap[S->getCond()] = PGO.getCurrentRegionCount();
392 Visit(S->getCond());
393 Cnt.adjustForControlFlow();
394 Cnt.applyAdjustmentsToRegion(BC.BreakCount + BC.ContinueCount);
395 RecordNextStmtCount = true;
396 }
397
398 void VisitForStmt(const ForStmt *S) {
399 RecordStmtCount(S);
400 if (S->getInit())
401 Visit(S->getInit());
402 // Counter tracks the body of the loop.
403 RegionCounter Cnt(PGO, S);
404 BreakContinueStack.push_back(BreakContinue());
405 // Visit the body region first. (This is basically the same as a while
406 // loop; see further comments in VisitWhileStmt.)
407 Cnt.beginRegion();
408 CountMap[S->getBody()] = PGO.getCurrentRegionCount();
409 Visit(S->getBody());
410 Cnt.adjustForControlFlow();
411
412 // The increment is essentially part of the body but it needs to include
413 // the count for all the continue statements.
414 if (S->getInc()) {
Bob Wilsonbf854f02014-02-17 19:21:09 +0000415 Cnt.setCurrentRegionCount(PGO.getCurrentRegionCount() +
416 BreakContinueStack.back().ContinueCount);
Duncan P. N. Exon Smith3586be72014-03-26 19:26:02 +0000417 CountMap[S->getInc()] = PGO.getCurrentRegionCount();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000418 Visit(S->getInc());
419 Cnt.adjustForControlFlow();
Justin Bognere4ca4412015-02-23 19:27:00 +0000420 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000421
Justin Bognere4ca4412015-02-23 19:27:00 +0000422 BreakContinue BC = BreakContinueStack.pop_back_val();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000423
Justin Bognere4ca4412015-02-23 19:27:00 +0000424 // ...then go back and propagate counts through the condition.
425 if (S->getCond()) {
426 Cnt.setCurrentRegionCount(Cnt.getParentCount() + Cnt.getAdjustedCount() +
Bob Wilsonbf854f02014-02-17 19:21:09 +0000427 BC.ContinueCount);
Duncan P. N. Exon Smith3586be72014-03-26 19:26:02 +0000428 CountMap[S->getCond()] = PGO.getCurrentRegionCount();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000429 Visit(S->getCond());
430 Cnt.adjustForControlFlow();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000431 }
Justin Bognere4ca4412015-02-23 19:27:00 +0000432 Cnt.applyAdjustmentsToRegion(BC.BreakCount + BC.ContinueCount);
433 RecordNextStmtCount = true;
434 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000435
Justin Bognere4ca4412015-02-23 19:27:00 +0000436 void VisitCXXForRangeStmt(const CXXForRangeStmt *S) {
437 RecordStmtCount(S);
438 Visit(S->getRangeStmt());
439 Visit(S->getBeginEndStmt());
440 // Counter tracks the body of the loop.
441 RegionCounter Cnt(PGO, S);
442 BreakContinueStack.push_back(BreakContinue());
443 // Visit the body region first. (This is basically the same as a while
444 // loop; see further comments in VisitWhileStmt.)
445 Cnt.beginRegion();
446 CountMap[S->getLoopVarStmt()] = PGO.getCurrentRegionCount();
447 Visit(S->getLoopVarStmt());
448 Visit(S->getBody());
449 Cnt.adjustForControlFlow();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000450
Justin Bognere4ca4412015-02-23 19:27:00 +0000451 // The increment is essentially part of the body but it needs to include
452 // the count for all the continue statements.
453 Cnt.setCurrentRegionCount(PGO.getCurrentRegionCount() +
454 BreakContinueStack.back().ContinueCount);
455 CountMap[S->getInc()] = PGO.getCurrentRegionCount();
456 Visit(S->getInc());
457 Cnt.adjustForControlFlow();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000458
Justin Bognere4ca4412015-02-23 19:27:00 +0000459 BreakContinue BC = BreakContinueStack.pop_back_val();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000460
Justin Bognere4ca4412015-02-23 19:27:00 +0000461 // ...then go back and propagate counts through the condition.
462 Cnt.setCurrentRegionCount(Cnt.getParentCount() + Cnt.getAdjustedCount() +
463 BC.ContinueCount);
464 CountMap[S->getCond()] = PGO.getCurrentRegionCount();
465 Visit(S->getCond());
466 Cnt.adjustForControlFlow();
467 Cnt.applyAdjustmentsToRegion(BC.BreakCount + BC.ContinueCount);
468 RecordNextStmtCount = true;
469 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000470
Justin Bognere4ca4412015-02-23 19:27:00 +0000471 void VisitObjCForCollectionStmt(const ObjCForCollectionStmt *S) {
472 RecordStmtCount(S);
473 Visit(S->getElement());
474 // Counter tracks the body of the loop.
475 RegionCounter Cnt(PGO, S);
476 BreakContinueStack.push_back(BreakContinue());
477 Cnt.beginRegion();
478 CountMap[S->getBody()] = PGO.getCurrentRegionCount();
479 Visit(S->getBody());
480 BreakContinue BC = BreakContinueStack.pop_back_val();
481 Cnt.adjustForControlFlow();
482 Cnt.applyAdjustmentsToRegion(BC.BreakCount + BC.ContinueCount);
483 RecordNextStmtCount = true;
484 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000485
Justin Bognere4ca4412015-02-23 19:27:00 +0000486 void VisitSwitchStmt(const SwitchStmt *S) {
487 RecordStmtCount(S);
488 Visit(S->getCond());
489 PGO.setCurrentRegionUnreachable();
490 BreakContinueStack.push_back(BreakContinue());
491 Visit(S->getBody());
492 // If the switch is inside a loop, add the continue counts.
493 BreakContinue BC = BreakContinueStack.pop_back_val();
494 if (!BreakContinueStack.empty())
495 BreakContinueStack.back().ContinueCount += BC.ContinueCount;
496 // Counter tracks the exit block of the switch.
497 RegionCounter ExitCnt(PGO, S);
498 ExitCnt.beginRegion();
499 RecordNextStmtCount = true;
500 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000501
Justin Bognere4ca4412015-02-23 19:27:00 +0000502 void VisitCaseStmt(const CaseStmt *S) {
503 RecordNextStmtCount = false;
504 // Counter for this particular case. This counts only jumps from the
505 // switch header and does not include fallthrough from the case before
506 // this one.
507 RegionCounter Cnt(PGO, S);
508 Cnt.beginRegion(/*AddIncomingFallThrough=*/true);
509 CountMap[S] = Cnt.getCount();
510 RecordNextStmtCount = true;
511 Visit(S->getSubStmt());
512 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000513
Justin Bognere4ca4412015-02-23 19:27:00 +0000514 void VisitDefaultStmt(const DefaultStmt *S) {
515 RecordNextStmtCount = false;
516 // Counter for this default case. This does not include fallthrough from
517 // the previous case.
518 RegionCounter Cnt(PGO, S);
519 Cnt.beginRegion(/*AddIncomingFallThrough=*/true);
520 CountMap[S] = Cnt.getCount();
521 RecordNextStmtCount = true;
522 Visit(S->getSubStmt());
523 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000524
Justin Bognere4ca4412015-02-23 19:27:00 +0000525 void VisitIfStmt(const IfStmt *S) {
526 RecordStmtCount(S);
527 // Counter tracks the "then" part of an if statement. The count for
528 // the "else" part, if it exists, will be calculated from this counter.
529 RegionCounter Cnt(PGO, S);
530 Visit(S->getCond());
Bob Wilsonbf854f02014-02-17 19:21:09 +0000531
Justin Bognere4ca4412015-02-23 19:27:00 +0000532 Cnt.beginRegion();
533 CountMap[S->getThen()] = PGO.getCurrentRegionCount();
534 Visit(S->getThen());
535 Cnt.adjustForControlFlow();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000536
Justin Bognere4ca4412015-02-23 19:27:00 +0000537 if (S->getElse()) {
Bob Wilsonbf854f02014-02-17 19:21:09 +0000538 Cnt.beginElseRegion();
Justin Bognere4ca4412015-02-23 19:27:00 +0000539 CountMap[S->getElse()] = PGO.getCurrentRegionCount();
540 Visit(S->getElse());
Bob Wilsonbf854f02014-02-17 19:21:09 +0000541 Cnt.adjustForControlFlow();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000542 }
Justin Bognere4ca4412015-02-23 19:27:00 +0000543 Cnt.applyAdjustmentsToRegion(0);
544 RecordNextStmtCount = true;
545 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000546
Justin Bognere4ca4412015-02-23 19:27:00 +0000547 void VisitCXXTryStmt(const CXXTryStmt *S) {
548 RecordStmtCount(S);
549 Visit(S->getTryBlock());
550 for (unsigned I = 0, E = S->getNumHandlers(); I < E; ++I)
551 Visit(S->getHandler(I));
552 // Counter tracks the continuation block of the try statement.
553 RegionCounter Cnt(PGO, S);
554 Cnt.beginRegion();
555 RecordNextStmtCount = true;
556 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000557
Justin Bognere4ca4412015-02-23 19:27:00 +0000558 void VisitCXXCatchStmt(const CXXCatchStmt *S) {
559 RecordNextStmtCount = false;
560 // Counter tracks the catch statement's handler block.
561 RegionCounter Cnt(PGO, S);
562 Cnt.beginRegion();
563 CountMap[S] = PGO.getCurrentRegionCount();
564 Visit(S->getHandlerBlock());
565 }
566
567 void VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) {
568 RecordStmtCount(E);
569 // Counter tracks the "true" part of a conditional operator. The
570 // count in the "false" part will be calculated from this counter.
571 RegionCounter Cnt(PGO, E);
572 Visit(E->getCond());
573
574 Cnt.beginRegion();
575 CountMap[E->getTrueExpr()] = PGO.getCurrentRegionCount();
576 Visit(E->getTrueExpr());
577 Cnt.adjustForControlFlow();
578
579 Cnt.beginElseRegion();
580 CountMap[E->getFalseExpr()] = PGO.getCurrentRegionCount();
581 Visit(E->getFalseExpr());
582 Cnt.adjustForControlFlow();
583
584 Cnt.applyAdjustmentsToRegion(0);
585 RecordNextStmtCount = true;
586 }
587
588 void VisitBinLAnd(const BinaryOperator *E) {
589 RecordStmtCount(E);
590 // Counter tracks the right hand side of a logical and operator.
591 RegionCounter Cnt(PGO, E);
592 Visit(E->getLHS());
593 Cnt.beginRegion();
594 CountMap[E->getRHS()] = PGO.getCurrentRegionCount();
595 Visit(E->getRHS());
596 Cnt.adjustForControlFlow();
597 Cnt.applyAdjustmentsToRegion(0);
598 RecordNextStmtCount = true;
599 }
600
601 void VisitBinLOr(const BinaryOperator *E) {
602 RecordStmtCount(E);
603 // Counter tracks the right hand side of a logical or operator.
604 RegionCounter Cnt(PGO, E);
605 Visit(E->getLHS());
606 Cnt.beginRegion();
607 CountMap[E->getRHS()] = PGO.getCurrentRegionCount();
608 Visit(E->getRHS());
609 Cnt.adjustForControlFlow();
610 Cnt.applyAdjustmentsToRegion(0);
611 RecordNextStmtCount = true;
612 }
613};
Justin Bogneref512b92014-01-06 22:27:43 +0000614}
615
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +0000616void PGOHash::combine(HashType Type) {
617 // Check that we never combine 0 and only have six bits.
618 assert(Type && "Hash is invalid: unexpected type 0");
619 assert(unsigned(Type) < TooBig && "Hash is invalid: too many types");
620
621 // Pass through MD5 if enough work has built up.
622 if (Count && Count % NumTypesPerWord == 0) {
623 using namespace llvm::support;
624 uint64_t Swapped = endian::byte_swap<uint64_t, little>(Working);
625 MD5.update(llvm::makeArrayRef((uint8_t *)&Swapped, sizeof(Swapped)));
626 Working = 0;
627 }
628
629 // Accumulate the current type.
630 ++Count;
631 Working = Working << NumBitsPerType | Type;
632}
633
634uint64_t PGOHash::finalize() {
635 // Use Working as the hash directly if we never used MD5.
636 if (Count <= NumTypesPerWord)
637 // No need to byte swap here, since none of the math was endian-dependent.
638 // This number will be byte-swapped as required on endianness transitions,
639 // so we will see the same value on the other side.
640 return Working;
641
642 // Check for remaining work in Working.
643 if (Working)
644 MD5.update(Working);
645
646 // Finalize the MD5 and return the hash.
647 llvm::MD5::MD5Result Result;
648 MD5.final(Result);
649 using namespace llvm::support;
650 return endian::read<uint64_t, little, unaligned>(Result);
651}
652
Alex Lorenzee024992014-08-04 18:41:51 +0000653void CodeGenPGO::checkGlobalDecl(GlobalDecl GD) {
654 // Make sure we only emit coverage mapping for one constructor/destructor.
655 // Clang emits several functions for the constructor and the destructor of
656 // a class. Every function is instrumented, but we only want to provide
657 // coverage for one of them. Because of that we only emit the coverage mapping
658 // for the base constructor/destructor.
659 if ((isa<CXXConstructorDecl>(GD.getDecl()) &&
Alex Lorenzd4236742014-08-11 18:21:34 +0000660 GD.getCtorType() != Ctor_Base) ||
Alex Lorenzee024992014-08-04 18:41:51 +0000661 (isa<CXXDestructorDecl>(GD.getDecl()) &&
662 GD.getDtorType() != Dtor_Base)) {
663 SkipCoverageMapping = true;
664 }
665}
666
Bob Wilsonda1ebed2014-03-06 04:55:41 +0000667void CodeGenPGO::assignRegionCounters(const Decl *D, llvm::Function *Fn) {
Justin Bogneref512b92014-01-06 22:27:43 +0000668 bool InstrumentRegions = CGM.getCodeGenOpts().ProfileInstrGenerate;
Justin Bogner837a6f62014-04-18 21:52:00 +0000669 llvm::IndexedInstrProfReader *PGOReader = CGM.getPGOReader();
670 if (!InstrumentRegions && !PGOReader)
Justin Bogneref512b92014-01-06 22:27:43 +0000671 return;
Justin Bogner3212b182014-04-25 07:20:05 +0000672 if (D->isImplicit())
Justin Bogneref512b92014-01-06 22:27:43 +0000673 return;
Alex Lorenzee024992014-08-04 18:41:51 +0000674 CGM.ClearUnusedCoverageMapping(D);
Bob Wilsonda1ebed2014-03-06 04:55:41 +0000675 setFuncName(Fn);
Duncan P. N. Exon Smith7c414512014-03-20 22:50:08 +0000676
Justin Bogneref512b92014-01-06 22:27:43 +0000677 mapRegionCounters(D);
Justin Bogner970ac602014-12-08 19:04:51 +0000678 if (CGM.getCodeGenOpts().CoverageMapping)
679 emitCounterRegionMapping(D);
Justin Bogner837a6f62014-04-18 21:52:00 +0000680 if (PGOReader) {
Justin Bogner40b8ba12014-06-26 01:45:07 +0000681 SourceManager &SM = CGM.getContext().getSourceManager();
682 loadRegionCounts(PGOReader, SM.isInMainFile(D->getLocation()));
Bob Wilsonbf854f02014-02-17 19:21:09 +0000683 computeRegionCounts(D);
Justin Bogner837a6f62014-04-18 21:52:00 +0000684 applyFunctionAttributes(PGOReader, Fn);
Bob Wilsonbf854f02014-02-17 19:21:09 +0000685 }
Justin Bogneref512b92014-01-06 22:27:43 +0000686}
687
688void CodeGenPGO::mapRegionCounters(const Decl *D) {
Duncan P. N. Exon Smith1b67cfd2014-03-26 19:26:05 +0000689 RegionCounterMap.reset(new llvm::DenseMap<const Stmt *, unsigned>);
Duncan P. N. Exon Smith3586be72014-03-26 19:26:02 +0000690 MapRegionCounters Walker(*RegionCounterMap);
Justin Bogneref512b92014-01-06 22:27:43 +0000691 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
Bob Wilsond8931422014-04-11 17:16:13 +0000692 Walker.TraverseDecl(const_cast<FunctionDecl *>(FD));
Bob Wilson5ec8fe12014-03-06 06:10:02 +0000693 else if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
Bob Wilsond8931422014-04-11 17:16:13 +0000694 Walker.TraverseDecl(const_cast<ObjCMethodDecl *>(MD));
Bob Wilsonc845c002014-03-06 20:24:27 +0000695 else if (const BlockDecl *BD = dyn_cast_or_null<BlockDecl>(D))
Bob Wilsond8931422014-04-11 17:16:13 +0000696 Walker.TraverseDecl(const_cast<BlockDecl *>(BD));
Justin Bogner81ab90f2014-04-15 00:50:54 +0000697 else if (const CapturedDecl *CD = dyn_cast_or_null<CapturedDecl>(D))
698 Walker.TraverseDecl(const_cast<CapturedDecl *>(CD));
Justin Bogner3212b182014-04-25 07:20:05 +0000699 assert(Walker.NextCounter > 0 && "no entry counter mapped for decl");
Justin Bogneref512b92014-01-06 22:27:43 +0000700 NumRegionCounters = Walker.NextCounter;
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +0000701 FunctionHash = Walker.Hash.finalize();
Justin Bogneref512b92014-01-06 22:27:43 +0000702}
703
Alex Lorenzee024992014-08-04 18:41:51 +0000704void CodeGenPGO::emitCounterRegionMapping(const Decl *D) {
705 if (SkipCoverageMapping)
706 return;
707 // Don't map the functions inside the system headers
708 auto Loc = D->getBody()->getLocStart();
709 if (CGM.getContext().getSourceManager().isInSystemHeader(Loc))
710 return;
711
Justin Bogner970ac602014-12-08 19:04:51 +0000712 std::string CoverageMapping;
Alex Lorenzee024992014-08-04 18:41:51 +0000713 llvm::raw_string_ostream OS(CoverageMapping);
714 CoverageMappingGen MappingGen(*CGM.getCoverageMapping(),
715 CGM.getContext().getSourceManager(),
Justin Bognere5ee6c52014-10-02 16:44:01 +0000716 CGM.getLangOpts(), RegionCounterMap.get());
Alex Lorenzee024992014-08-04 18:41:51 +0000717 MappingGen.emitCounterMapping(D, OS);
718 OS.flush();
Justin Bogner970ac602014-12-08 19:04:51 +0000719
720 if (CoverageMapping.empty())
721 return;
722
723 CGM.getCoverageMapping()->addFunctionMappingRecord(
724 FuncNameVar, FuncName, FunctionHash, CoverageMapping);
Alex Lorenzee024992014-08-04 18:41:51 +0000725}
726
727void
728CodeGenPGO::emitEmptyCounterMapping(const Decl *D, StringRef FuncName,
729 llvm::GlobalValue::LinkageTypes Linkage) {
730 if (SkipCoverageMapping)
731 return;
Alex Lorenzee024992014-08-04 18:41:51 +0000732 // Don't map the functions inside the system headers
733 auto Loc = D->getBody()->getLocStart();
734 if (CGM.getContext().getSourceManager().isInSystemHeader(Loc))
735 return;
736
Justin Bogner970ac602014-12-08 19:04:51 +0000737 std::string CoverageMapping;
Alex Lorenzee024992014-08-04 18:41:51 +0000738 llvm::raw_string_ostream OS(CoverageMapping);
739 CoverageMappingGen MappingGen(*CGM.getCoverageMapping(),
740 CGM.getContext().getSourceManager(),
741 CGM.getLangOpts());
742 MappingGen.emitEmptyMapping(D, OS);
743 OS.flush();
Justin Bogner970ac602014-12-08 19:04:51 +0000744
745 if (CoverageMapping.empty())
746 return;
747
Justin Bogner00270df2015-01-22 02:17:23 +0000748 setFuncName(FuncName, Linkage);
Justin Bogner970ac602014-12-08 19:04:51 +0000749 CGM.getCoverageMapping()->addFunctionMappingRecord(
750 FuncNameVar, FuncName, FunctionHash, CoverageMapping);
Alex Lorenzee024992014-08-04 18:41:51 +0000751}
752
Bob Wilsonbf854f02014-02-17 19:21:09 +0000753void CodeGenPGO::computeRegionCounts(const Decl *D) {
Duncan P. N. Exon Smith1b67cfd2014-03-26 19:26:05 +0000754 StmtCountMap.reset(new llvm::DenseMap<const Stmt *, uint64_t>);
Duncan P. N. Exon Smith3586be72014-03-26 19:26:02 +0000755 ComputeRegionCounts Walker(*StmtCountMap, *this);
Bob Wilsonbf854f02014-02-17 19:21:09 +0000756 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
757 Walker.VisitFunctionDecl(FD);
Bob Wilson5ec8fe12014-03-06 06:10:02 +0000758 else if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
759 Walker.VisitObjCMethodDecl(MD);
Bob Wilsonc845c002014-03-06 20:24:27 +0000760 else if (const BlockDecl *BD = dyn_cast_or_null<BlockDecl>(D))
761 Walker.VisitBlockDecl(BD);
Justin Bogner81ab90f2014-04-15 00:50:54 +0000762 else if (const CapturedDecl *CD = dyn_cast_or_null<CapturedDecl>(D))
763 Walker.VisitCapturedDecl(const_cast<CapturedDecl *>(CD));
Bob Wilsonbf854f02014-02-17 19:21:09 +0000764}
765
Justin Bogner837a6f62014-04-18 21:52:00 +0000766void
767CodeGenPGO::applyFunctionAttributes(llvm::IndexedInstrProfReader *PGOReader,
768 llvm::Function *Fn) {
Justin Bogner4c9c45c2014-03-12 18:14:32 +0000769 if (!haveRegionCounts())
770 return;
771
Justin Bogner837a6f62014-04-18 21:52:00 +0000772 uint64_t MaxFunctionCount = PGOReader->getMaximumFunctionCount();
Justin Bogner4c9c45c2014-03-12 18:14:32 +0000773 uint64_t FunctionCount = getRegionCount(0);
774 if (FunctionCount >= (uint64_t)(0.3 * (double)MaxFunctionCount))
775 // Turn on InlineHint attribute for hot functions.
776 // FIXME: 30% is from preliminary tuning on SPEC, it may not be optimal.
777 Fn->addFnAttr(llvm::Attribute::InlineHint);
778 else if (FunctionCount <= (uint64_t)(0.01 * (double)MaxFunctionCount))
779 // Turn on Cold attribute for cold functions.
780 // FIXME: 1% is from preliminary tuning on SPEC, it may not be optimal.
781 Fn->addFnAttr(llvm::Attribute::Cold);
782}
783
Justin Bogneref512b92014-01-06 22:27:43 +0000784void CodeGenPGO::emitCounterIncrement(CGBuilderTy &Builder, unsigned Counter) {
Justin Bogner970ac602014-12-08 19:04:51 +0000785 if (!CGM.getCodeGenOpts().ProfileInstrGenerate || !RegionCounterMap)
Justin Bogneref512b92014-01-06 22:27:43 +0000786 return;
Justin Bogner203f91e2015-01-09 01:46:40 +0000787 if (!Builder.GetInsertPoint())
788 return;
Justin Bogner970ac602014-12-08 19:04:51 +0000789 auto *I8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext());
790 Builder.CreateCall4(CGM.getIntrinsic(llvm::Intrinsic::instrprof_increment),
791 llvm::ConstantExpr::getBitCast(FuncNameVar, I8PtrTy),
792 Builder.getInt64(FunctionHash),
793 Builder.getInt32(NumRegionCounters),
794 Builder.getInt32(Counter));
Justin Bogneref512b92014-01-06 22:27:43 +0000795}
796
Justin Bogner40b8ba12014-06-26 01:45:07 +0000797void CodeGenPGO::loadRegionCounts(llvm::IndexedInstrProfReader *PGOReader,
798 bool IsInMainFile) {
799 CGM.getPGOStats().addVisited(IsInMainFile);
Justin Bogner7f8cf5b2014-12-02 22:38:52 +0000800 RegionCounts.clear();
Justin Bogner970ac602014-12-08 19:04:51 +0000801 if (std::error_code EC =
802 PGOReader->getFunctionCounts(FuncName, FunctionHash, RegionCounts)) {
Justin Bogner9c6818e2014-08-01 22:50:16 +0000803 if (EC == llvm::instrprof_error::unknown_function)
804 CGM.getPGOStats().addMissing(IsInMainFile);
805 else if (EC == llvm::instrprof_error::hash_mismatch)
806 CGM.getPGOStats().addMismatched(IsInMainFile);
807 else if (EC == llvm::instrprof_error::malformed)
808 // TODO: Consider a more specific warning for this case.
809 CGM.getPGOStats().addMismatched(IsInMainFile);
Justin Bogner7f8cf5b2014-12-02 22:38:52 +0000810 RegionCounts.clear();
Justin Bognere2ef2a02014-04-15 21:22:35 +0000811 }
Justin Bogneref512b92014-01-06 22:27:43 +0000812}
813
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000814/// \brief Calculate what to divide by to scale weights.
815///
816/// Given the maximum weight, calculate a divisor that will scale all the
817/// weights to strictly less than UINT32_MAX.
818static uint64_t calculateWeightScale(uint64_t MaxWeight) {
819 return MaxWeight < UINT32_MAX ? 1 : MaxWeight / UINT32_MAX + 1;
820}
821
822/// \brief Scale an individual branch weight (and add 1).
823///
824/// Scale a 64-bit weight down to 32-bits using \c Scale.
825///
826/// According to Laplace's Rule of Succession, it is better to compute the
827/// weight based on the count plus 1, so universally add 1 to the value.
828///
829/// \pre \c Scale was calculated by \a calculateWeightScale() with a weight no
830/// greater than \c Weight.
831static uint32_t scaleBranchWeight(uint64_t Weight, uint64_t Scale) {
832 assert(Scale && "scale by 0?");
833 uint64_t Scaled = Weight / Scale + 1;
834 assert(Scaled <= UINT32_MAX && "overflow 32-bits");
835 return Scaled;
836}
837
Justin Bogneref512b92014-01-06 22:27:43 +0000838llvm::MDNode *CodeGenPGO::createBranchWeights(uint64_t TrueCount,
839 uint64_t FalseCount) {
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000840 // Check for empty weights.
Justin Bogneref512b92014-01-06 22:27:43 +0000841 if (!TrueCount && !FalseCount)
Duncan P. N. Exon Smitha5f804a2014-03-20 18:40:55 +0000842 return nullptr;
Justin Bogneref512b92014-01-06 22:27:43 +0000843
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000844 // Calculate how to scale down to 32-bits.
845 uint64_t Scale = calculateWeightScale(std::max(TrueCount, FalseCount));
846
Justin Bogneref512b92014-01-06 22:27:43 +0000847 llvm::MDBuilder MDHelper(CGM.getLLVMContext());
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000848 return MDHelper.createBranchWeights(scaleBranchWeight(TrueCount, Scale),
849 scaleBranchWeight(FalseCount, Scale));
Justin Bogneref512b92014-01-06 22:27:43 +0000850}
851
Bob Wilson95a27b02014-02-17 19:20:59 +0000852llvm::MDNode *CodeGenPGO::createBranchWeights(ArrayRef<uint64_t> Weights) {
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000853 // We need at least two elements to create meaningful weights.
854 if (Weights.size() < 2)
Duncan P. N. Exon Smitha5f804a2014-03-20 18:40:55 +0000855 return nullptr;
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000856
Justin Bognerf3aefca2014-04-04 02:48:51 +0000857 // Check for empty weights.
858 uint64_t MaxWeight = *std::max_element(Weights.begin(), Weights.end());
859 if (MaxWeight == 0)
860 return nullptr;
861
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000862 // Calculate how to scale down to 32-bits.
Justin Bognerf3aefca2014-04-04 02:48:51 +0000863 uint64_t Scale = calculateWeightScale(MaxWeight);
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000864
Justin Bogneref512b92014-01-06 22:27:43 +0000865 SmallVector<uint32_t, 16> ScaledWeights;
866 ScaledWeights.reserve(Weights.size());
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000867 for (uint64_t W : Weights)
868 ScaledWeights.push_back(scaleBranchWeight(W, Scale));
869
870 llvm::MDBuilder MDHelper(CGM.getLLVMContext());
Justin Bogneref512b92014-01-06 22:27:43 +0000871 return MDHelper.createBranchWeights(ScaledWeights);
872}
Bob Wilsonbf854f02014-02-17 19:21:09 +0000873
874llvm::MDNode *CodeGenPGO::createLoopWeights(const Stmt *Cond,
875 RegionCounter &Cnt) {
876 if (!haveRegionCounts())
Duncan P. N. Exon Smitha5f804a2014-03-20 18:40:55 +0000877 return nullptr;
Bob Wilsonbf854f02014-02-17 19:21:09 +0000878 uint64_t LoopCount = Cnt.getCount();
879 uint64_t CondCount = 0;
880 bool Found = getStmtCount(Cond, CondCount);
881 assert(Found && "missing expected loop condition count");
882 (void)Found;
883 if (CondCount == 0)
Duncan P. N. Exon Smitha5f804a2014-03-20 18:40:55 +0000884 return nullptr;
Bob Wilsonbf854f02014-02-17 19:21:09 +0000885 return createBranchWeights(LoopCount,
886 std::max(CondCount, LoopCount) - LoopCount);
887}