Lines Matching +full:- +full:- +full:pgo
1 //===--- CodeGenPGO.cpp - PGO Instrumentation for LLVM CodeGen --*- C++ -*-===//
8 //===----------------------------------------------------------------------===//
10 // Instrumentation-based profile-guided optimization
12 //===----------------------------------------------------------------------===//
26 "enable-value-profiling", llvm::cl::ZeroOrMore,
37 PGOReader ? PGOReader->getVersion() : llvm::IndexedInstrProf::Version); in setFuncName()
45 setFuncName(Fn->getName(), Fn->getLinkage()); in setFuncName()
51 /// \brief Stable hasher for PGO region counters.
56 /// profiles -- i.e., don't do it.
112 /// A RecursiveASTVisitor that fills a map of statements to PGO counters.
131 switch (D->getKind()) { in VisitDecl()
142 CounterMap[D->getBody()] = NextCounter++; in VisitDecl()
158 switch (S->getStmtClass()) { in getHashType()
191 if (BO->getOpcode() == BO_LAnd) in getHashType()
193 if (BO->getOpcode() == BO_LOr) in getHashType()
205 /// PGO state.
206 CodeGenPGO &PGO; member
218 /// BreakContinueStack - Keep counts of breaks and continues inside loops.
227 CodeGenPGO &PGO) in ComputeRegionCounts()
228 : PGO(PGO), RecordNextStmtCount(false), CountMap(CountMap) {} in ComputeRegionCounts()
245 for (const Stmt *Child : S->children()) in VisitStmt()
247 this->Visit(Child); in VisitStmt()
252 uint64_t BodyCount = setCount(PGO.getRegionCount(D->getBody())); in VisitFunctionDecl()
253 CountMap[D->getBody()] = BodyCount; in VisitFunctionDecl()
254 Visit(D->getBody()); in VisitFunctionDecl()
264 uint64_t BodyCount = setCount(PGO.getRegionCount(D->getBody())); in VisitCapturedDecl()
265 CountMap[D->getBody()] = BodyCount; in VisitCapturedDecl()
266 Visit(D->getBody()); in VisitCapturedDecl()
271 uint64_t BodyCount = setCount(PGO.getRegionCount(D->getBody())); in VisitObjCMethodDecl()
272 CountMap[D->getBody()] = BodyCount; in VisitObjCMethodDecl()
273 Visit(D->getBody()); in VisitObjCMethodDecl()
278 uint64_t BodyCount = setCount(PGO.getRegionCount(D->getBody())); in VisitBlockDecl()
279 CountMap[D->getBody()] = BodyCount; in VisitBlockDecl()
280 Visit(D->getBody()); in VisitBlockDecl()
285 if (S->getRetValue()) in VisitReturnStmt()
286 Visit(S->getRetValue()); in VisitReturnStmt()
293 if (E->getSubExpr()) in VisitCXXThrowExpr()
294 Visit(E->getSubExpr()); in VisitCXXThrowExpr()
308 uint64_t BlockCount = setCount(PGO.getRegionCount(S)); in VisitLabelStmt()
310 Visit(S->getSubStmt()); in VisitLabelStmt()
336 uint64_t BodyCount = setCount(PGO.getRegionCount(S)); in VisitWhileStmt()
337 CountMap[S->getBody()] = CurrentCount; in VisitWhileStmt()
338 Visit(S->getBody()); in VisitWhileStmt()
348 CountMap[S->getCond()] = CondCount; in VisitWhileStmt()
349 Visit(S->getCond()); in VisitWhileStmt()
350 setCount(BC.BreakCount + CondCount - BodyCount); in VisitWhileStmt()
356 uint64_t LoopCount = PGO.getRegionCount(S); in VisitDoStmt()
361 CountMap[S->getBody()] = BodyCount; in VisitDoStmt()
362 Visit(S->getBody()); in VisitDoStmt()
369 CountMap[S->getCond()] = CondCount; in VisitDoStmt()
370 Visit(S->getCond()); in VisitDoStmt()
371 setCount(BC.BreakCount + CondCount - LoopCount); in VisitDoStmt()
377 if (S->getInit()) in VisitForStmt()
378 Visit(S->getInit()); in VisitForStmt()
385 uint64_t BodyCount = setCount(PGO.getRegionCount(S)); in VisitForStmt()
386 CountMap[S->getBody()] = BodyCount; in VisitForStmt()
387 Visit(S->getBody()); in VisitForStmt()
393 if (S->getInc()) { in VisitForStmt()
395 CountMap[S->getInc()] = IncCount; in VisitForStmt()
396 Visit(S->getInc()); in VisitForStmt()
402 if (S->getCond()) { in VisitForStmt()
403 CountMap[S->getCond()] = CondCount; in VisitForStmt()
404 Visit(S->getCond()); in VisitForStmt()
406 setCount(BC.BreakCount + CondCount - BodyCount); in VisitForStmt()
412 Visit(S->getLoopVarStmt()); in VisitCXXForRangeStmt()
413 Visit(S->getRangeStmt()); in VisitCXXForRangeStmt()
414 Visit(S->getBeginStmt()); in VisitCXXForRangeStmt()
415 Visit(S->getEndStmt()); in VisitCXXForRangeStmt()
421 uint64_t BodyCount = setCount(PGO.getRegionCount(S)); in VisitCXXForRangeStmt()
422 CountMap[S->getBody()] = BodyCount; in VisitCXXForRangeStmt()
423 Visit(S->getBody()); in VisitCXXForRangeStmt()
430 CountMap[S->getInc()] = IncCount; in VisitCXXForRangeStmt()
431 Visit(S->getInc()); in VisitCXXForRangeStmt()
436 CountMap[S->getCond()] = CondCount; in VisitCXXForRangeStmt()
437 Visit(S->getCond()); in VisitCXXForRangeStmt()
438 setCount(BC.BreakCount + CondCount - BodyCount); in VisitCXXForRangeStmt()
444 Visit(S->getElement()); in VisitObjCForCollectionStmt()
448 uint64_t BodyCount = setCount(PGO.getRegionCount(S)); in VisitObjCForCollectionStmt()
449 CountMap[S->getBody()] = BodyCount; in VisitObjCForCollectionStmt()
450 Visit(S->getBody()); in VisitObjCForCollectionStmt()
454 setCount(BC.BreakCount + ParentCount + BackedgeCount + BC.ContinueCount - in VisitObjCForCollectionStmt()
461 Visit(S->getCond()); in VisitSwitchStmt()
464 Visit(S->getBody()); in VisitSwitchStmt()
470 setCount(PGO.getRegionCount(S)); in VisitSwitchStmt()
479 uint64_t CaseCount = PGO.getRegionCount(S); in VisitSwitchCase()
485 Visit(S->getSubStmt()); in VisitSwitchCase()
491 Visit(S->getCond()); in VisitIfStmt()
495 uint64_t ThenCount = setCount(PGO.getRegionCount(S)); in VisitIfStmt()
496 CountMap[S->getThen()] = ThenCount; in VisitIfStmt()
497 Visit(S->getThen()); in VisitIfStmt()
500 uint64_t ElseCount = ParentCount - ThenCount; in VisitIfStmt()
501 if (S->getElse()) { in VisitIfStmt()
503 CountMap[S->getElse()] = ElseCount; in VisitIfStmt()
504 Visit(S->getElse()); in VisitIfStmt()
514 Visit(S->getTryBlock()); in VisitCXXTryStmt()
515 for (unsigned I = 0, E = S->getNumHandlers(); I < E; ++I) in VisitCXXTryStmt()
516 Visit(S->getHandler(I)); in VisitCXXTryStmt()
518 setCount(PGO.getRegionCount(S)); in VisitCXXTryStmt()
525 uint64_t CatchCount = setCount(PGO.getRegionCount(S)); in VisitCXXCatchStmt()
527 Visit(S->getHandlerBlock()); in VisitCXXCatchStmt()
533 Visit(E->getCond()); in VisitAbstractConditionalOperator()
537 uint64_t TrueCount = setCount(PGO.getRegionCount(E)); in VisitAbstractConditionalOperator()
538 CountMap[E->getTrueExpr()] = TrueCount; in VisitAbstractConditionalOperator()
539 Visit(E->getTrueExpr()); in VisitAbstractConditionalOperator()
542 uint64_t FalseCount = setCount(ParentCount - TrueCount); in VisitAbstractConditionalOperator()
543 CountMap[E->getFalseExpr()] = FalseCount; in VisitAbstractConditionalOperator()
544 Visit(E->getFalseExpr()); in VisitAbstractConditionalOperator()
554 Visit(E->getLHS()); in VisitBinLAnd()
556 uint64_t RHSCount = setCount(PGO.getRegionCount(E)); in VisitBinLAnd()
557 CountMap[E->getRHS()] = RHSCount; in VisitBinLAnd()
558 Visit(E->getRHS()); in VisitBinLAnd()
559 setCount(ParentCount + RHSCount - CurrentCount); in VisitBinLAnd()
566 Visit(E->getLHS()); in VisitBinLOr()
568 uint64_t RHSCount = setCount(PGO.getRegionCount(E)); in VisitBinLOr()
569 CountMap[E->getRHS()] = RHSCount; in VisitBinLOr()
570 Visit(E->getRHS()); in VisitBinLOr()
571 setCount(ParentCount + RHSCount - CurrentCount); in VisitBinLOr()
598 // No need to byte swap here, since none of the math was endian-dependent. in finalize()
599 // This number will be byte-swapped as required on endianness transitions, in finalize()
620 if (D->isImplicit()) in assignRegionCounters()
640 loadRegionCounts(PGOReader, SM.isInMainFile(D->getLocation())); in assignRegionCounters()
668 auto Loc = D->getBody()->getLocStart(); in skipRegionMappingForDecl()
687 CGM.getCoverageMapping()->addFunctionMappingRecord( in emitCounterRegionMapping()
709 CGM.getCoverageMapping()->addFunctionMappingRecord( in emitEmptyCounterMapping()
733 Fn->setEntryCount(FunctionCount); in applyFunctionAttributes()
751 // This method either inserts a call to the profile run-time during
752 // instrumentation or puts profile data into metadata for PGO use.
790 if (NumValueSites[ValueKind] >= ProfRecord->getNumValueSites(ValueKind)) in valueProfile()
806 PGOReader->getInstrProfRecord(FuncName, FunctionHash); in loadRegionCounts()
820 RegionCounts = ProfRecord->Counts; in loadRegionCounts()
833 /// Scale a 64-bit weight down to 32-bits using \c Scale.
843 assert(Scaled <= UINT32_MAX && "overflow 32-bits"); in scaleBranchWeight()
853 // Calculate how to scale down to 32-bits. in createProfileWeights()
872 // Calculate how to scale down to 32-bits. in createProfileWeights()
886 if (!PGO.haveRegionCounts()) in createProfileWeightsForLoop()
888 Optional<uint64_t> CondCount = PGO.getStmtCount(Cond); in createProfileWeightsForLoop()
893 std::max(*CondCount, LoopCount) - LoopCount); in createProfileWeightsForLoop()