blob: 27e4c7fc091610619c1f55b8976f3d33cb8ea37a [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,
76 Value, "__llvm_profile_name_" + 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
245 /// The map of statements to count values.
246 llvm::DenseMap<const Stmt *, uint64_t> &CountMap;
247
248 /// BreakContinueStack - Keep counts of breaks and continues inside loops.
249 struct BreakContinue {
250 uint64_t BreakCount;
251 uint64_t ContinueCount;
252 BreakContinue() : BreakCount(0), ContinueCount(0) {}
Justin Bogneref512b92014-01-06 22:27:43 +0000253 };
Justin Bognere4ca4412015-02-23 19:27:00 +0000254 SmallVector<BreakContinue, 8> BreakContinueStack;
Bob Wilsonbf854f02014-02-17 19:21:09 +0000255
Justin Bognere4ca4412015-02-23 19:27:00 +0000256 ComputeRegionCounts(llvm::DenseMap<const Stmt *, uint64_t> &CountMap,
257 CodeGenPGO &PGO)
258 : PGO(PGO), RecordNextStmtCount(false), CountMap(CountMap) {}
Bob Wilsonbf854f02014-02-17 19:21:09 +0000259
Justin Bognere4ca4412015-02-23 19:27:00 +0000260 void RecordStmtCount(const Stmt *S) {
261 if (RecordNextStmtCount) {
Duncan P. N. Exon Smith3586be72014-03-26 19:26:02 +0000262 CountMap[S] = PGO.getCurrentRegionCount();
Justin Bognere4ca4412015-02-23 19:27:00 +0000263 RecordNextStmtCount = false;
Bob Wilsonbf854f02014-02-17 19:21:09 +0000264 }
Justin Bognere4ca4412015-02-23 19:27:00 +0000265 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000266
Justin Bognere4ca4412015-02-23 19:27:00 +0000267 void VisitStmt(const Stmt *S) {
268 RecordStmtCount(S);
269 for (Stmt::const_child_range I = S->children(); I; ++I) {
270 if (*I)
271 this->Visit(*I);
Bob Wilsonbf854f02014-02-17 19:21:09 +0000272 }
Justin Bognere4ca4412015-02-23 19:27:00 +0000273 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000274
Justin Bognere4ca4412015-02-23 19:27:00 +0000275 void VisitFunctionDecl(const FunctionDecl *D) {
276 // Counter tracks entry to the function body.
277 RegionCounter Cnt(PGO, D->getBody());
278 Cnt.beginRegion();
279 CountMap[D->getBody()] = PGO.getCurrentRegionCount();
280 Visit(D->getBody());
281 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000282
Justin Bognere4ca4412015-02-23 19:27:00 +0000283 // Skip lambda expressions. We visit these as FunctionDecls when we're
284 // generating them and aren't interested in the body when generating a
285 // parent context.
286 void VisitLambdaExpr(const LambdaExpr *LE) {}
Bob Wilsonbf854f02014-02-17 19:21:09 +0000287
Justin Bognere4ca4412015-02-23 19:27:00 +0000288 void VisitCapturedDecl(const CapturedDecl *D) {
289 // Counter tracks entry to the capture body.
290 RegionCounter Cnt(PGO, D->getBody());
291 Cnt.beginRegion();
292 CountMap[D->getBody()] = PGO.getCurrentRegionCount();
293 Visit(D->getBody());
294 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000295
Justin Bognere4ca4412015-02-23 19:27:00 +0000296 void VisitObjCMethodDecl(const ObjCMethodDecl *D) {
297 // Counter tracks entry to the method body.
298 RegionCounter Cnt(PGO, D->getBody());
299 Cnt.beginRegion();
300 CountMap[D->getBody()] = PGO.getCurrentRegionCount();
301 Visit(D->getBody());
302 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000303
Justin Bognere4ca4412015-02-23 19:27:00 +0000304 void VisitBlockDecl(const BlockDecl *D) {
305 // Counter tracks entry to the block body.
306 RegionCounter Cnt(PGO, D->getBody());
307 Cnt.beginRegion();
308 CountMap[D->getBody()] = PGO.getCurrentRegionCount();
309 Visit(D->getBody());
310 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000311
Justin Bognere4ca4412015-02-23 19:27:00 +0000312 void VisitReturnStmt(const ReturnStmt *S) {
313 RecordStmtCount(S);
314 if (S->getRetValue())
315 Visit(S->getRetValue());
316 PGO.setCurrentRegionUnreachable();
317 RecordNextStmtCount = true;
318 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000319
Justin Bognerf959feb2015-04-28 06:31:55 +0000320 void VisitCXXThrowExpr(const CXXThrowExpr *E) {
321 RecordStmtCount(E);
322 if (E->getSubExpr())
323 Visit(E->getSubExpr());
324 PGO.setCurrentRegionUnreachable();
325 RecordNextStmtCount = true;
326 }
327
Justin Bognere4ca4412015-02-23 19:27:00 +0000328 void VisitGotoStmt(const GotoStmt *S) {
329 RecordStmtCount(S);
330 PGO.setCurrentRegionUnreachable();
331 RecordNextStmtCount = true;
332 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000333
Justin Bognere4ca4412015-02-23 19:27:00 +0000334 void VisitLabelStmt(const LabelStmt *S) {
335 RecordNextStmtCount = false;
336 // Counter tracks the block following the label.
337 RegionCounter Cnt(PGO, S);
338 Cnt.beginRegion();
339 CountMap[S] = PGO.getCurrentRegionCount();
340 Visit(S->getSubStmt());
341 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000342
Justin Bognere4ca4412015-02-23 19:27:00 +0000343 void VisitBreakStmt(const BreakStmt *S) {
344 RecordStmtCount(S);
345 assert(!BreakContinueStack.empty() && "break not in a loop or switch!");
346 BreakContinueStack.back().BreakCount += PGO.getCurrentRegionCount();
347 PGO.setCurrentRegionUnreachable();
348 RecordNextStmtCount = true;
349 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000350
Justin Bognere4ca4412015-02-23 19:27:00 +0000351 void VisitContinueStmt(const ContinueStmt *S) {
352 RecordStmtCount(S);
353 assert(!BreakContinueStack.empty() && "continue stmt not in a loop!");
354 BreakContinueStack.back().ContinueCount += PGO.getCurrentRegionCount();
355 PGO.setCurrentRegionUnreachable();
356 RecordNextStmtCount = true;
357 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000358
Justin Bognere4ca4412015-02-23 19:27:00 +0000359 void VisitWhileStmt(const WhileStmt *S) {
360 RecordStmtCount(S);
361 // Counter tracks the body of the loop.
362 RegionCounter Cnt(PGO, S);
363 BreakContinueStack.push_back(BreakContinue());
364 // Visit the body region first so the break/continue adjustments can be
365 // included when visiting the condition.
366 Cnt.beginRegion();
367 CountMap[S->getBody()] = PGO.getCurrentRegionCount();
368 Visit(S->getBody());
369 Cnt.adjustForControlFlow();
370
371 // ...then go back and propagate counts through the condition. The count
372 // at the start of the condition is the sum of the incoming edges,
373 // the backedge from the end of the loop body, and the edges from
374 // continue statements.
375 BreakContinue BC = BreakContinueStack.pop_back_val();
376 Cnt.setCurrentRegionCount(Cnt.getParentCount() + Cnt.getAdjustedCount() +
377 BC.ContinueCount);
378 CountMap[S->getCond()] = PGO.getCurrentRegionCount();
379 Visit(S->getCond());
380 Cnt.adjustForControlFlow();
381 Cnt.applyAdjustmentsToRegion(BC.BreakCount + BC.ContinueCount);
382 RecordNextStmtCount = true;
383 }
384
385 void VisitDoStmt(const DoStmt *S) {
386 RecordStmtCount(S);
387 // Counter tracks the body of the loop.
388 RegionCounter Cnt(PGO, S);
389 BreakContinueStack.push_back(BreakContinue());
390 Cnt.beginRegion(/*AddIncomingFallThrough=*/true);
391 CountMap[S->getBody()] = PGO.getCurrentRegionCount();
392 Visit(S->getBody());
393 Cnt.adjustForControlFlow();
394
395 BreakContinue BC = BreakContinueStack.pop_back_val();
396 // The count at the start of the condition is equal to the count at the
397 // end of the body. The adjusted count does not include either the
398 // fall-through count coming into the loop or the continue count, so add
399 // both of those separately. This is coincidentally the same equation as
400 // with while loops but for different reasons.
401 Cnt.setCurrentRegionCount(Cnt.getParentCount() + Cnt.getAdjustedCount() +
402 BC.ContinueCount);
403 CountMap[S->getCond()] = PGO.getCurrentRegionCount();
404 Visit(S->getCond());
405 Cnt.adjustForControlFlow();
406 Cnt.applyAdjustmentsToRegion(BC.BreakCount + BC.ContinueCount);
407 RecordNextStmtCount = true;
408 }
409
410 void VisitForStmt(const ForStmt *S) {
411 RecordStmtCount(S);
412 if (S->getInit())
413 Visit(S->getInit());
414 // Counter tracks the body of the loop.
415 RegionCounter Cnt(PGO, S);
416 BreakContinueStack.push_back(BreakContinue());
417 // Visit the body region first. (This is basically the same as a while
418 // loop; see further comments in VisitWhileStmt.)
419 Cnt.beginRegion();
420 CountMap[S->getBody()] = PGO.getCurrentRegionCount();
421 Visit(S->getBody());
422 Cnt.adjustForControlFlow();
423
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()) {
Bob Wilsonbf854f02014-02-17 19:21:09 +0000427 Cnt.setCurrentRegionCount(PGO.getCurrentRegionCount() +
428 BreakContinueStack.back().ContinueCount);
Duncan P. N. Exon Smith3586be72014-03-26 19:26:02 +0000429 CountMap[S->getInc()] = PGO.getCurrentRegionCount();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000430 Visit(S->getInc());
431 Cnt.adjustForControlFlow();
Justin Bognere4ca4412015-02-23 19:27:00 +0000432 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000433
Justin Bognere4ca4412015-02-23 19:27:00 +0000434 BreakContinue BC = BreakContinueStack.pop_back_val();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000435
Justin Bognere4ca4412015-02-23 19:27:00 +0000436 // ...then go back and propagate counts through the condition.
437 if (S->getCond()) {
438 Cnt.setCurrentRegionCount(Cnt.getParentCount() + Cnt.getAdjustedCount() +
Bob Wilsonbf854f02014-02-17 19:21:09 +0000439 BC.ContinueCount);
Duncan P. N. Exon Smith3586be72014-03-26 19:26:02 +0000440 CountMap[S->getCond()] = PGO.getCurrentRegionCount();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000441 Visit(S->getCond());
442 Cnt.adjustForControlFlow();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000443 }
Justin Bognere4ca4412015-02-23 19:27:00 +0000444 Cnt.applyAdjustmentsToRegion(BC.BreakCount + BC.ContinueCount);
445 RecordNextStmtCount = true;
446 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000447
Justin Bognere4ca4412015-02-23 19:27:00 +0000448 void VisitCXXForRangeStmt(const CXXForRangeStmt *S) {
449 RecordStmtCount(S);
450 Visit(S->getRangeStmt());
451 Visit(S->getBeginEndStmt());
452 // Counter tracks the body of the loop.
453 RegionCounter Cnt(PGO, S);
454 BreakContinueStack.push_back(BreakContinue());
455 // Visit the body region first. (This is basically the same as a while
456 // loop; see further comments in VisitWhileStmt.)
457 Cnt.beginRegion();
458 CountMap[S->getLoopVarStmt()] = PGO.getCurrentRegionCount();
459 Visit(S->getLoopVarStmt());
460 Visit(S->getBody());
461 Cnt.adjustForControlFlow();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000462
Justin Bognere4ca4412015-02-23 19:27:00 +0000463 // The increment is essentially part of the body but it needs to include
464 // the count for all the continue statements.
465 Cnt.setCurrentRegionCount(PGO.getCurrentRegionCount() +
466 BreakContinueStack.back().ContinueCount);
467 CountMap[S->getInc()] = PGO.getCurrentRegionCount();
468 Visit(S->getInc());
469 Cnt.adjustForControlFlow();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000470
Justin Bognere4ca4412015-02-23 19:27:00 +0000471 BreakContinue BC = BreakContinueStack.pop_back_val();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000472
Justin Bognere4ca4412015-02-23 19:27:00 +0000473 // ...then go back and propagate counts through the condition.
474 Cnt.setCurrentRegionCount(Cnt.getParentCount() + Cnt.getAdjustedCount() +
475 BC.ContinueCount);
476 CountMap[S->getCond()] = PGO.getCurrentRegionCount();
477 Visit(S->getCond());
478 Cnt.adjustForControlFlow();
479 Cnt.applyAdjustmentsToRegion(BC.BreakCount + BC.ContinueCount);
480 RecordNextStmtCount = true;
481 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000482
Justin Bognere4ca4412015-02-23 19:27:00 +0000483 void VisitObjCForCollectionStmt(const ObjCForCollectionStmt *S) {
484 RecordStmtCount(S);
485 Visit(S->getElement());
486 // Counter tracks the body of the loop.
487 RegionCounter Cnt(PGO, S);
488 BreakContinueStack.push_back(BreakContinue());
489 Cnt.beginRegion();
490 CountMap[S->getBody()] = PGO.getCurrentRegionCount();
491 Visit(S->getBody());
492 BreakContinue BC = BreakContinueStack.pop_back_val();
493 Cnt.adjustForControlFlow();
494 Cnt.applyAdjustmentsToRegion(BC.BreakCount + BC.ContinueCount);
495 RecordNextStmtCount = true;
496 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000497
Justin Bognere4ca4412015-02-23 19:27:00 +0000498 void VisitSwitchStmt(const SwitchStmt *S) {
499 RecordStmtCount(S);
500 Visit(S->getCond());
501 PGO.setCurrentRegionUnreachable();
502 BreakContinueStack.push_back(BreakContinue());
503 Visit(S->getBody());
504 // If the switch is inside a loop, add the continue counts.
505 BreakContinue BC = BreakContinueStack.pop_back_val();
506 if (!BreakContinueStack.empty())
507 BreakContinueStack.back().ContinueCount += BC.ContinueCount;
508 // Counter tracks the exit block of the switch.
509 RegionCounter ExitCnt(PGO, S);
510 ExitCnt.beginRegion();
511 RecordNextStmtCount = true;
512 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000513
Justin Bognere4ca4412015-02-23 19:27:00 +0000514 void VisitCaseStmt(const CaseStmt *S) {
515 RecordNextStmtCount = false;
516 // Counter for this particular case. This counts only jumps from the
517 // switch header and does not include fallthrough from the case before
518 // this one.
519 RegionCounter Cnt(PGO, S);
520 Cnt.beginRegion(/*AddIncomingFallThrough=*/true);
521 CountMap[S] = Cnt.getCount();
522 RecordNextStmtCount = true;
523 Visit(S->getSubStmt());
524 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000525
Justin Bognere4ca4412015-02-23 19:27:00 +0000526 void VisitDefaultStmt(const DefaultStmt *S) {
527 RecordNextStmtCount = false;
528 // Counter for this default case. This does not include fallthrough from
529 // the previous case.
530 RegionCounter Cnt(PGO, S);
531 Cnt.beginRegion(/*AddIncomingFallThrough=*/true);
532 CountMap[S] = Cnt.getCount();
533 RecordNextStmtCount = true;
534 Visit(S->getSubStmt());
535 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000536
Justin Bognere4ca4412015-02-23 19:27:00 +0000537 void VisitIfStmt(const IfStmt *S) {
538 RecordStmtCount(S);
539 // Counter tracks the "then" part of an if statement. The count for
540 // the "else" part, if it exists, will be calculated from this counter.
541 RegionCounter Cnt(PGO, S);
542 Visit(S->getCond());
Bob Wilsonbf854f02014-02-17 19:21:09 +0000543
Justin Bognere4ca4412015-02-23 19:27:00 +0000544 Cnt.beginRegion();
545 CountMap[S->getThen()] = PGO.getCurrentRegionCount();
546 Visit(S->getThen());
547 Cnt.adjustForControlFlow();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000548
Justin Bognere4ca4412015-02-23 19:27:00 +0000549 if (S->getElse()) {
Bob Wilsonbf854f02014-02-17 19:21:09 +0000550 Cnt.beginElseRegion();
Justin Bognere4ca4412015-02-23 19:27:00 +0000551 CountMap[S->getElse()] = PGO.getCurrentRegionCount();
552 Visit(S->getElse());
Bob Wilsonbf854f02014-02-17 19:21:09 +0000553 Cnt.adjustForControlFlow();
Bob Wilsonbf854f02014-02-17 19:21:09 +0000554 }
Justin Bognere4ca4412015-02-23 19:27:00 +0000555 Cnt.applyAdjustmentsToRegion(0);
556 RecordNextStmtCount = true;
557 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000558
Justin Bognere4ca4412015-02-23 19:27:00 +0000559 void VisitCXXTryStmt(const CXXTryStmt *S) {
560 RecordStmtCount(S);
561 Visit(S->getTryBlock());
562 for (unsigned I = 0, E = S->getNumHandlers(); I < E; ++I)
563 Visit(S->getHandler(I));
564 // Counter tracks the continuation block of the try statement.
565 RegionCounter Cnt(PGO, S);
566 Cnt.beginRegion();
567 RecordNextStmtCount = true;
568 }
Bob Wilsonbf854f02014-02-17 19:21:09 +0000569
Justin Bognere4ca4412015-02-23 19:27:00 +0000570 void VisitCXXCatchStmt(const CXXCatchStmt *S) {
571 RecordNextStmtCount = false;
572 // Counter tracks the catch statement's handler block.
573 RegionCounter Cnt(PGO, S);
574 Cnt.beginRegion();
575 CountMap[S] = PGO.getCurrentRegionCount();
576 Visit(S->getHandlerBlock());
577 }
578
579 void VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) {
580 RecordStmtCount(E);
581 // Counter tracks the "true" part of a conditional operator. The
582 // count in the "false" part will be calculated from this counter.
583 RegionCounter Cnt(PGO, E);
584 Visit(E->getCond());
585
586 Cnt.beginRegion();
587 CountMap[E->getTrueExpr()] = PGO.getCurrentRegionCount();
588 Visit(E->getTrueExpr());
589 Cnt.adjustForControlFlow();
590
591 Cnt.beginElseRegion();
592 CountMap[E->getFalseExpr()] = PGO.getCurrentRegionCount();
593 Visit(E->getFalseExpr());
594 Cnt.adjustForControlFlow();
595
596 Cnt.applyAdjustmentsToRegion(0);
597 RecordNextStmtCount = true;
598 }
599
600 void VisitBinLAnd(const BinaryOperator *E) {
601 RecordStmtCount(E);
602 // Counter tracks the right hand side of a logical and operator.
603 RegionCounter Cnt(PGO, E);
604 Visit(E->getLHS());
605 Cnt.beginRegion();
606 CountMap[E->getRHS()] = PGO.getCurrentRegionCount();
607 Visit(E->getRHS());
608 Cnt.adjustForControlFlow();
609 Cnt.applyAdjustmentsToRegion(0);
610 RecordNextStmtCount = true;
611 }
612
613 void VisitBinLOr(const BinaryOperator *E) {
614 RecordStmtCount(E);
615 // Counter tracks the right hand side of a logical or operator.
616 RegionCounter Cnt(PGO, E);
617 Visit(E->getLHS());
618 Cnt.beginRegion();
619 CountMap[E->getRHS()] = PGO.getCurrentRegionCount();
620 Visit(E->getRHS());
621 Cnt.adjustForControlFlow();
622 Cnt.applyAdjustmentsToRegion(0);
623 RecordNextStmtCount = true;
624 }
625};
Justin Bogneref512b92014-01-06 22:27:43 +0000626}
627
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +0000628void PGOHash::combine(HashType Type) {
629 // Check that we never combine 0 and only have six bits.
630 assert(Type && "Hash is invalid: unexpected type 0");
631 assert(unsigned(Type) < TooBig && "Hash is invalid: too many types");
632
633 // Pass through MD5 if enough work has built up.
634 if (Count && Count % NumTypesPerWord == 0) {
635 using namespace llvm::support;
636 uint64_t Swapped = endian::byte_swap<uint64_t, little>(Working);
637 MD5.update(llvm::makeArrayRef((uint8_t *)&Swapped, sizeof(Swapped)));
638 Working = 0;
639 }
640
641 // Accumulate the current type.
642 ++Count;
643 Working = Working << NumBitsPerType | Type;
644}
645
646uint64_t PGOHash::finalize() {
647 // Use Working as the hash directly if we never used MD5.
648 if (Count <= NumTypesPerWord)
649 // No need to byte swap here, since none of the math was endian-dependent.
650 // This number will be byte-swapped as required on endianness transitions,
651 // so we will see the same value on the other side.
652 return Working;
653
654 // Check for remaining work in Working.
655 if (Working)
656 MD5.update(Working);
657
658 // Finalize the MD5 and return the hash.
659 llvm::MD5::MD5Result Result;
660 MD5.final(Result);
661 using namespace llvm::support;
662 return endian::read<uint64_t, little, unaligned>(Result);
663}
664
Alex Lorenzee024992014-08-04 18:41:51 +0000665void CodeGenPGO::checkGlobalDecl(GlobalDecl GD) {
666 // Make sure we only emit coverage mapping for one constructor/destructor.
667 // Clang emits several functions for the constructor and the destructor of
668 // a class. Every function is instrumented, but we only want to provide
669 // coverage for one of them. Because of that we only emit the coverage mapping
670 // for the base constructor/destructor.
671 if ((isa<CXXConstructorDecl>(GD.getDecl()) &&
Alex Lorenzd4236742014-08-11 18:21:34 +0000672 GD.getCtorType() != Ctor_Base) ||
Alex Lorenzee024992014-08-04 18:41:51 +0000673 (isa<CXXDestructorDecl>(GD.getDecl()) &&
674 GD.getDtorType() != Dtor_Base)) {
675 SkipCoverageMapping = true;
676 }
677}
678
Bob Wilsonda1ebed2014-03-06 04:55:41 +0000679void CodeGenPGO::assignRegionCounters(const Decl *D, llvm::Function *Fn) {
Justin Bogneref512b92014-01-06 22:27:43 +0000680 bool InstrumentRegions = CGM.getCodeGenOpts().ProfileInstrGenerate;
Justin Bogner837a6f62014-04-18 21:52:00 +0000681 llvm::IndexedInstrProfReader *PGOReader = CGM.getPGOReader();
682 if (!InstrumentRegions && !PGOReader)
Justin Bogneref512b92014-01-06 22:27:43 +0000683 return;
Justin Bogner3212b182014-04-25 07:20:05 +0000684 if (D->isImplicit())
Justin Bogneref512b92014-01-06 22:27:43 +0000685 return;
Alex Lorenzee024992014-08-04 18:41:51 +0000686 CGM.ClearUnusedCoverageMapping(D);
Bob Wilsonda1ebed2014-03-06 04:55:41 +0000687 setFuncName(Fn);
Duncan P. N. Exon Smith7c414512014-03-20 22:50:08 +0000688
Justin Bogneref512b92014-01-06 22:27:43 +0000689 mapRegionCounters(D);
Justin Bogner970ac602014-12-08 19:04:51 +0000690 if (CGM.getCodeGenOpts().CoverageMapping)
691 emitCounterRegionMapping(D);
Justin Bogner837a6f62014-04-18 21:52:00 +0000692 if (PGOReader) {
Justin Bogner40b8ba12014-06-26 01:45:07 +0000693 SourceManager &SM = CGM.getContext().getSourceManager();
694 loadRegionCounts(PGOReader, SM.isInMainFile(D->getLocation()));
Bob Wilsonbf854f02014-02-17 19:21:09 +0000695 computeRegionCounts(D);
Justin Bogner837a6f62014-04-18 21:52:00 +0000696 applyFunctionAttributes(PGOReader, Fn);
Bob Wilsonbf854f02014-02-17 19:21:09 +0000697 }
Justin Bogneref512b92014-01-06 22:27:43 +0000698}
699
700void CodeGenPGO::mapRegionCounters(const Decl *D) {
Duncan P. N. Exon Smith1b67cfd2014-03-26 19:26:05 +0000701 RegionCounterMap.reset(new llvm::DenseMap<const Stmt *, unsigned>);
Duncan P. N. Exon Smith3586be72014-03-26 19:26:02 +0000702 MapRegionCounters Walker(*RegionCounterMap);
Justin Bogneref512b92014-01-06 22:27:43 +0000703 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
Bob Wilsond8931422014-04-11 17:16:13 +0000704 Walker.TraverseDecl(const_cast<FunctionDecl *>(FD));
Bob Wilson5ec8fe12014-03-06 06:10:02 +0000705 else if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
Bob Wilsond8931422014-04-11 17:16:13 +0000706 Walker.TraverseDecl(const_cast<ObjCMethodDecl *>(MD));
Bob Wilsonc845c002014-03-06 20:24:27 +0000707 else if (const BlockDecl *BD = dyn_cast_or_null<BlockDecl>(D))
Bob Wilsond8931422014-04-11 17:16:13 +0000708 Walker.TraverseDecl(const_cast<BlockDecl *>(BD));
Justin Bogner81ab90f2014-04-15 00:50:54 +0000709 else if (const CapturedDecl *CD = dyn_cast_or_null<CapturedDecl>(D))
710 Walker.TraverseDecl(const_cast<CapturedDecl *>(CD));
Justin Bogner3212b182014-04-25 07:20:05 +0000711 assert(Walker.NextCounter > 0 && "no entry counter mapped for decl");
Justin Bogneref512b92014-01-06 22:27:43 +0000712 NumRegionCounters = Walker.NextCounter;
Duncan P. N. Exon Smith4bc77312014-04-16 16:03:27 +0000713 FunctionHash = Walker.Hash.finalize();
Justin Bogneref512b92014-01-06 22:27:43 +0000714}
715
Alex Lorenzee024992014-08-04 18:41:51 +0000716void CodeGenPGO::emitCounterRegionMapping(const Decl *D) {
717 if (SkipCoverageMapping)
718 return;
719 // Don't map the functions inside the system headers
720 auto Loc = D->getBody()->getLocStart();
721 if (CGM.getContext().getSourceManager().isInSystemHeader(Loc))
722 return;
723
Justin Bogner970ac602014-12-08 19:04:51 +0000724 std::string CoverageMapping;
Alex Lorenzee024992014-08-04 18:41:51 +0000725 llvm::raw_string_ostream OS(CoverageMapping);
726 CoverageMappingGen MappingGen(*CGM.getCoverageMapping(),
727 CGM.getContext().getSourceManager(),
Justin Bognere5ee6c52014-10-02 16:44:01 +0000728 CGM.getLangOpts(), RegionCounterMap.get());
Alex Lorenzee024992014-08-04 18:41:51 +0000729 MappingGen.emitCounterMapping(D, OS);
730 OS.flush();
Justin Bogner970ac602014-12-08 19:04:51 +0000731
732 if (CoverageMapping.empty())
733 return;
734
735 CGM.getCoverageMapping()->addFunctionMappingRecord(
736 FuncNameVar, FuncName, FunctionHash, CoverageMapping);
Alex Lorenzee024992014-08-04 18:41:51 +0000737}
738
739void
Justin Bogner60d852b2015-04-23 00:31:16 +0000740CodeGenPGO::emitEmptyCounterMapping(const Decl *D, StringRef Name,
Alex Lorenzee024992014-08-04 18:41:51 +0000741 llvm::GlobalValue::LinkageTypes Linkage) {
742 if (SkipCoverageMapping)
743 return;
Alex Lorenzee024992014-08-04 18:41:51 +0000744 // Don't map the functions inside the system headers
745 auto Loc = D->getBody()->getLocStart();
746 if (CGM.getContext().getSourceManager().isInSystemHeader(Loc))
747 return;
748
Justin Bogner970ac602014-12-08 19:04:51 +0000749 std::string CoverageMapping;
Alex Lorenzee024992014-08-04 18:41:51 +0000750 llvm::raw_string_ostream OS(CoverageMapping);
751 CoverageMappingGen MappingGen(*CGM.getCoverageMapping(),
752 CGM.getContext().getSourceManager(),
753 CGM.getLangOpts());
754 MappingGen.emitEmptyMapping(D, OS);
755 OS.flush();
Justin Bogner970ac602014-12-08 19:04:51 +0000756
757 if (CoverageMapping.empty())
758 return;
759
Justin Bogner60d852b2015-04-23 00:31:16 +0000760 setFuncName(Name, Linkage);
Justin Bogner970ac602014-12-08 19:04:51 +0000761 CGM.getCoverageMapping()->addFunctionMappingRecord(
762 FuncNameVar, FuncName, FunctionHash, CoverageMapping);
Alex Lorenzee024992014-08-04 18:41:51 +0000763}
764
Bob Wilsonbf854f02014-02-17 19:21:09 +0000765void CodeGenPGO::computeRegionCounts(const Decl *D) {
Duncan P. N. Exon Smith1b67cfd2014-03-26 19:26:05 +0000766 StmtCountMap.reset(new llvm::DenseMap<const Stmt *, uint64_t>);
Duncan P. N. Exon Smith3586be72014-03-26 19:26:02 +0000767 ComputeRegionCounts Walker(*StmtCountMap, *this);
Bob Wilsonbf854f02014-02-17 19:21:09 +0000768 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
769 Walker.VisitFunctionDecl(FD);
Bob Wilson5ec8fe12014-03-06 06:10:02 +0000770 else if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
771 Walker.VisitObjCMethodDecl(MD);
Bob Wilsonc845c002014-03-06 20:24:27 +0000772 else if (const BlockDecl *BD = dyn_cast_or_null<BlockDecl>(D))
773 Walker.VisitBlockDecl(BD);
Justin Bogner81ab90f2014-04-15 00:50:54 +0000774 else if (const CapturedDecl *CD = dyn_cast_or_null<CapturedDecl>(D))
775 Walker.VisitCapturedDecl(const_cast<CapturedDecl *>(CD));
Bob Wilsonbf854f02014-02-17 19:21:09 +0000776}
777
Justin Bogner837a6f62014-04-18 21:52:00 +0000778void
779CodeGenPGO::applyFunctionAttributes(llvm::IndexedInstrProfReader *PGOReader,
780 llvm::Function *Fn) {
Justin Bogner4c9c45c2014-03-12 18:14:32 +0000781 if (!haveRegionCounts())
782 return;
783
Justin Bogner837a6f62014-04-18 21:52:00 +0000784 uint64_t MaxFunctionCount = PGOReader->getMaximumFunctionCount();
Justin Bogner4c9c45c2014-03-12 18:14:32 +0000785 uint64_t FunctionCount = getRegionCount(0);
786 if (FunctionCount >= (uint64_t)(0.3 * (double)MaxFunctionCount))
787 // Turn on InlineHint attribute for hot functions.
788 // FIXME: 30% is from preliminary tuning on SPEC, it may not be optimal.
789 Fn->addFnAttr(llvm::Attribute::InlineHint);
790 else if (FunctionCount <= (uint64_t)(0.01 * (double)MaxFunctionCount))
791 // Turn on Cold attribute for cold functions.
792 // FIXME: 1% is from preliminary tuning on SPEC, it may not be optimal.
793 Fn->addFnAttr(llvm::Attribute::Cold);
794}
795
Justin Bogner66242d62015-04-23 23:06:47 +0000796void CodeGenPGO::emitCounterIncrement(CGBuilderTy &Builder, const Stmt *S) {
Justin Bogner970ac602014-12-08 19:04:51 +0000797 if (!CGM.getCodeGenOpts().ProfileInstrGenerate || !RegionCounterMap)
Justin Bogneref512b92014-01-06 22:27:43 +0000798 return;
Justin Bogner203f91e2015-01-09 01:46:40 +0000799 if (!Builder.GetInsertPoint())
800 return;
Justin Bogner66242d62015-04-23 23:06:47 +0000801
802 unsigned Counter = (*RegionCounterMap)[S];
Justin Bogner970ac602014-12-08 19:04:51 +0000803 auto *I8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext());
804 Builder.CreateCall4(CGM.getIntrinsic(llvm::Intrinsic::instrprof_increment),
805 llvm::ConstantExpr::getBitCast(FuncNameVar, I8PtrTy),
806 Builder.getInt64(FunctionHash),
807 Builder.getInt32(NumRegionCounters),
808 Builder.getInt32(Counter));
Justin Bogneref512b92014-01-06 22:27:43 +0000809}
810
Justin Bogner40b8ba12014-06-26 01:45:07 +0000811void CodeGenPGO::loadRegionCounts(llvm::IndexedInstrProfReader *PGOReader,
812 bool IsInMainFile) {
813 CGM.getPGOStats().addVisited(IsInMainFile);
Justin Bogner7f8cf5b2014-12-02 22:38:52 +0000814 RegionCounts.clear();
Justin Bogner970ac602014-12-08 19:04:51 +0000815 if (std::error_code EC =
816 PGOReader->getFunctionCounts(FuncName, FunctionHash, RegionCounts)) {
Justin Bogner9c6818e2014-08-01 22:50:16 +0000817 if (EC == llvm::instrprof_error::unknown_function)
818 CGM.getPGOStats().addMissing(IsInMainFile);
819 else if (EC == llvm::instrprof_error::hash_mismatch)
820 CGM.getPGOStats().addMismatched(IsInMainFile);
821 else if (EC == llvm::instrprof_error::malformed)
822 // TODO: Consider a more specific warning for this case.
823 CGM.getPGOStats().addMismatched(IsInMainFile);
Justin Bogner7f8cf5b2014-12-02 22:38:52 +0000824 RegionCounts.clear();
Justin Bognere2ef2a02014-04-15 21:22:35 +0000825 }
Justin Bogneref512b92014-01-06 22:27:43 +0000826}
827
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000828/// \brief Calculate what to divide by to scale weights.
829///
830/// Given the maximum weight, calculate a divisor that will scale all the
831/// weights to strictly less than UINT32_MAX.
832static uint64_t calculateWeightScale(uint64_t MaxWeight) {
833 return MaxWeight < UINT32_MAX ? 1 : MaxWeight / UINT32_MAX + 1;
834}
835
836/// \brief Scale an individual branch weight (and add 1).
837///
838/// Scale a 64-bit weight down to 32-bits using \c Scale.
839///
840/// According to Laplace's Rule of Succession, it is better to compute the
841/// weight based on the count plus 1, so universally add 1 to the value.
842///
843/// \pre \c Scale was calculated by \a calculateWeightScale() with a weight no
844/// greater than \c Weight.
845static uint32_t scaleBranchWeight(uint64_t Weight, uint64_t Scale) {
846 assert(Scale && "scale by 0?");
847 uint64_t Scaled = Weight / Scale + 1;
848 assert(Scaled <= UINT32_MAX && "overflow 32-bits");
849 return Scaled;
850}
851
Justin Bogneref512b92014-01-06 22:27:43 +0000852llvm::MDNode *CodeGenPGO::createBranchWeights(uint64_t TrueCount,
853 uint64_t FalseCount) {
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000854 // Check for empty weights.
Justin Bogneref512b92014-01-06 22:27:43 +0000855 if (!TrueCount && !FalseCount)
Duncan P. N. Exon Smitha5f804a2014-03-20 18:40:55 +0000856 return nullptr;
Justin Bogneref512b92014-01-06 22:27:43 +0000857
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000858 // Calculate how to scale down to 32-bits.
859 uint64_t Scale = calculateWeightScale(std::max(TrueCount, FalseCount));
860
Justin Bogneref512b92014-01-06 22:27:43 +0000861 llvm::MDBuilder MDHelper(CGM.getLLVMContext());
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000862 return MDHelper.createBranchWeights(scaleBranchWeight(TrueCount, Scale),
863 scaleBranchWeight(FalseCount, Scale));
Justin Bogneref512b92014-01-06 22:27:43 +0000864}
865
Bob Wilson95a27b02014-02-17 19:20:59 +0000866llvm::MDNode *CodeGenPGO::createBranchWeights(ArrayRef<uint64_t> Weights) {
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000867 // We need at least two elements to create meaningful weights.
868 if (Weights.size() < 2)
Duncan P. N. Exon Smitha5f804a2014-03-20 18:40:55 +0000869 return nullptr;
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000870
Justin Bognerf3aefca2014-04-04 02:48:51 +0000871 // Check for empty weights.
872 uint64_t MaxWeight = *std::max_element(Weights.begin(), Weights.end());
873 if (MaxWeight == 0)
874 return nullptr;
875
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000876 // Calculate how to scale down to 32-bits.
Justin Bognerf3aefca2014-04-04 02:48:51 +0000877 uint64_t Scale = calculateWeightScale(MaxWeight);
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000878
Justin Bogneref512b92014-01-06 22:27:43 +0000879 SmallVector<uint32_t, 16> ScaledWeights;
880 ScaledWeights.reserve(Weights.size());
Duncan P. N. Exon Smith38402dc2014-03-11 18:18:10 +0000881 for (uint64_t W : Weights)
882 ScaledWeights.push_back(scaleBranchWeight(W, Scale));
883
884 llvm::MDBuilder MDHelper(CGM.getLLVMContext());
Justin Bogneref512b92014-01-06 22:27:43 +0000885 return MDHelper.createBranchWeights(ScaledWeights);
886}
Bob Wilsonbf854f02014-02-17 19:21:09 +0000887
888llvm::MDNode *CodeGenPGO::createLoopWeights(const Stmt *Cond,
Justin Bogner66242d62015-04-23 23:06:47 +0000889 uint64_t LoopCount) {
Bob Wilsonbf854f02014-02-17 19:21:09 +0000890 if (!haveRegionCounts())
Duncan P. N. Exon Smitha5f804a2014-03-20 18:40:55 +0000891 return nullptr;
Justin Bogner1c21c282015-04-13 12:23:19 +0000892 Optional<uint64_t> CondCount = getStmtCount(Cond);
893 assert(CondCount.hasValue() && "missing expected loop condition count");
894 if (*CondCount == 0)
Duncan P. N. Exon Smitha5f804a2014-03-20 18:40:55 +0000895 return nullptr;
Bob Wilsonbf854f02014-02-17 19:21:09 +0000896 return createBranchWeights(LoopCount,
Justin Bogner1c21c282015-04-13 12:23:19 +0000897 std::max(*CondCount, LoopCount) - LoopCount);
Bob Wilsonbf854f02014-02-17 19:21:09 +0000898}