64#define DEBUG_TYPE "instrprof"
73 "debug-info-correlate",
74 cl::desc(
"Use debug info to correlate profiles. (Deprecated, use "
75 "-profile-correlate=debug-info)"),
80 cl::desc(
"Use debug info or binary file to correlate profiles."),
83 "No profile correlation"),
85 "Use debug info to correlate"),
87 "Use binary to correlate")));
93 "hash-based-counter-split",
94 cl::desc(
"Rename counter variable of a comdat function based on cfg hash"),
98 RuntimeCounterRelocation(
"runtime-counter-relocation",
99 cl::desc(
"Enable relocating counters at runtime."),
104 cl::desc(
"Do static counter allocation for value profiler"),
108 "vp-counters-per-site",
109 cl::desc(
"The average number of profile counters allocated "
110 "per value profiling site."),
118 "instrprof-atomic-counter-update-all",
119 cl::desc(
"Make all profile counter updates atomic (for testing only)"),
123 "atomic-counter-update-promoted",
124 cl::desc(
"Do counter update using atomic fetch add "
125 " for promoted counters only"),
129 "atomic-first-counter",
130 cl::desc(
"Use atomic fetch add for first counter in a function (usually "
131 "the entry counter)"),
135 "conditional-counter-update",
136 cl::desc(
"Do conditional counter updates in single byte counters mode)"),
145 cl::desc(
"Do counter register promotion"),
148 "max-counter-promotions-per-loop",
cl::init(20),
149 cl::desc(
"Max number counter promotions per loop to avoid"
150 " increasing register pressure too much"));
154 MaxNumOfPromotions(
"max-counter-promotions",
cl::init(-1),
155 cl::desc(
"Max number of allowed counter promotions"));
158 "speculative-counter-promotion-max-exiting",
cl::init(3),
159 cl::desc(
"The max number of exiting blocks of a loop to allow "
160 " speculative counter promotion"));
163 "speculative-counter-promotion-to-loop",
164 cl::desc(
"When the option is false, if the target block is in a loop, "
165 "the promotion will be disallowed unless the promoted counter "
166 " update can be further/iteratively promoted into an acyclic "
170 "iterative-counter-promotion",
cl::init(
true),
171 cl::desc(
"Allow counter promotion across the whole loop nest."));
174 "skip-ret-exit-block",
cl::init(
true),
175 cl::desc(
"Suppress counter promotion if exit blocks contain ret."));
179 cl::desc(
"Do PGO instrumentation sampling"));
182 "sampled-instr-period",
183 cl::desc(
"Set the profile instrumentation sample period. A sample period "
184 "of 0 is invalid. For each sample period, a fixed number of "
185 "consecutive samples will be recorded. The number is controlled "
186 "by 'sampled-instr-burst-duration' flag. The default sample "
187 "period of 65536 is optimized for generating efficient code that "
188 "leverages unsigned short integer wrapping in overflow, but this "
189 "is disabled under simple sampling (burst duration = 1)."),
193 "sampled-instr-burst-duration",
194 cl::desc(
"Set the profile instrumentation burst duration, which can range "
195 "from 1 to the value of 'sampled-instr-period' (0 is invalid). "
196 "This number of samples will be recorded for each "
197 "'sampled-instr-period' count update. Setting to 1 enables simple "
198 "sampling, in which case it is recommended to set "
199 "'sampled-instr-period' to a prime number."),
202struct SampledInstrumentationConfig {
203 unsigned BurstDuration;
206 bool IsSimpleSampling;
210static SampledInstrumentationConfig getSampledInstrumentationConfig() {
211 SampledInstrumentationConfig config;
212 config.BurstDuration = SampledInstrBurstDuration.getValue();
213 config.Period = SampledInstrPeriod.getValue();
214 if (config.BurstDuration > config.Period)
216 "SampledBurstDuration must be less than or equal to SampledPeriod");
217 if (config.Period == 0 || config.BurstDuration == 0)
219 "SampledPeriod and SampledBurstDuration must be greater than 0");
220 config.IsSimpleSampling = (config.BurstDuration == 1);
223 config.IsFastSampling =
224 (!config.IsSimpleSampling && config.Period == USHRT_MAX + 1);
225 config.UseShort = (config.Period <= USHRT_MAX) || config.IsFastSampling;
229using LoadStorePair = std::pair<Instruction *, Instruction *>;
232 auto *MD = dyn_cast_or_null<ConstantAsMetadata>(
M.getModuleFlag(Flag));
238 return cast<ConstantInt>(MD->getValue())->getZExtValue();
241static bool enablesValueProfiling(
const Module &M) {
243 getIntModuleFlagOrZero(M,
"EnableValueProfiling") != 0;
247static bool profDataReferencedByCode(
const Module &M) {
248 return enablesValueProfiling(M);
251class InstrLowerer final {
256 :
M(
M), Options(Options),
TT(
Triple(
M.getTargetTriple())), IsCS(IsCS),
257 GetTLI(GetTLI), DataReferencedByCode(profDataReferencedByCode(
M)) {}
270 const bool DataReferencedByCode;
272 struct PerFunctionProfileData {
273 uint32_t NumValueSites[IPVK_Last + 1] = {};
279 PerFunctionProfileData() =
default;
288 std::vector<GlobalValue *> CompilerUsedVars;
289 std::vector<GlobalValue *> UsedVars;
290 std::vector<GlobalVariable *> ReferencedNames;
293 std::vector<GlobalVariable *> ReferencedVTables;
295 size_t NamesSize = 0;
298 std::vector<LoadStorePair> PromotionCandidates;
300 int64_t TotalCountersPromoted = 0;
307 void promoteCounterLoadStores(
Function *
F);
310 bool isRuntimeCounterRelocationEnabled()
const;
313 bool isCounterPromotionEnabled()
const;
316 bool isSamplingEnabled()
const;
399 void emitVTableNames();
405 void emitRegistration();
409 bool emitRuntimeHook();
416 void emitInitialization();
428 PGOCounterPromoterHelper(
435 InsertPts(InsertPts), LoopToCandidates(LoopToCands), LI(LI) {
437 assert(isa<StoreInst>(S));
438 SSA.AddAvailableValue(PH,
Init);
442 for (
unsigned i = 0, e = ExitBlocks.size(); i != e; ++i) {
448 Value *LiveInValue =
SSA.GetValueInMiddleOfBlock(ExitBlock);
449 Value *
Addr = cast<StoreInst>(Store)->getPointerOperand();
452 if (
auto *AddrInst = dyn_cast_or_null<IntToPtrInst>(
Addr)) {
459 auto *OrigBiasInst = dyn_cast<BinaryOperator>(AddrInst->getOperand(0));
460 assert(OrigBiasInst->getOpcode() == Instruction::BinaryOps::Add);
461 Value *BiasInst = Builder.Insert(OrigBiasInst->clone());
462 Addr = Builder.CreateIntToPtr(BiasInst,
465 if (AtomicCounterUpdatePromoted)
470 AtomicOrdering::SequentiallyConsistent);
472 LoadInst *OldVal = Builder.CreateLoad(Ty,
Addr,
"pgocount.promoted");
473 auto *NewVal = Builder.CreateAdd(OldVal, LiveInValue);
474 auto *NewStore = Builder.CreateStore(NewVal,
Addr);
477 if (IterativeCounterPromotion) {
478 auto *TargetLoop = LI.getLoopFor(ExitBlock);
480 LoopToCandidates[TargetLoop].emplace_back(OldVal, NewStore);
497class PGOCounterPromoter {
502 : LoopToCandidates(LoopToCands),
L(CurLoop), LI(LI),
BFI(
BFI) {
509 L.getExitBlocks(LoopExitBlocks);
510 if (!isPromotionPossible(&L, LoopExitBlocks))
513 for (
BasicBlock *ExitBlock : LoopExitBlocks) {
514 if (BlockSet.
insert(ExitBlock).second &&
518 ExitBlocks.push_back(ExitBlock);
524 bool run(int64_t *NumPromoted) {
526 if (ExitBlocks.size() == 0)
534 if (SkipRetExitBlock) {
535 for (
auto *BB : ExitBlocks)
536 if (isa<ReturnInst>(BB->getTerminator()))
540 unsigned MaxProm = getMaxNumOfPromotionsInLoop(&L);
544 unsigned Promoted = 0;
545 for (
auto &Cand : LoopToCandidates[&L]) {
549 Value *InitVal = ConstantInt::get(Cand.first->getType(), 0);
553 auto *BB = Cand.first->getParent();
557 auto PreheaderCount =
BFI->getBlockProfileCount(
L.getLoopPreheader());
560 if (PreheaderCount && (*PreheaderCount * 3) >= (*
InstrCount * 2))
564 PGOCounterPromoterHelper Promoter(Cand.first, Cand.second,
SSA, InitVal,
565 L.getLoopPreheader(), ExitBlocks,
566 InsertPts, LoopToCandidates, LI);
569 if (Promoted >= MaxProm)
573 if (MaxNumOfPromotions != -1 && *NumPromoted >= MaxNumOfPromotions)
577 LLVM_DEBUG(
dbgs() << Promoted <<
" counters promoted for loop (depth="
578 <<
L.getLoopDepth() <<
")\n");
579 return Promoted != 0;
583 bool allowSpeculativeCounterPromotion(
Loop *LP) {
585 L.getExitingBlocks(ExitingBlocks);
587 if (ExitingBlocks.
size() == 1)
589 if (ExitingBlocks.
size() > SpeculativeCounterPromotionMaxExiting)
597 isPromotionPossible(
Loop *LP,
601 return isa<CatchSwitchInst>(
Exit->getTerminator());
616 unsigned getMaxNumOfPromotionsInLoop(
Loop *LP) {
619 if (!isPromotionPossible(LP, LoopExitBlocks))
630 if (ExitingBlocks.
size() == 1)
631 return MaxNumOfPromotionsPerLoop;
633 if (ExitingBlocks.
size() > SpeculativeCounterPromotionMaxExiting)
637 if (SpeculativeCounterPromotionToLoop)
638 return MaxNumOfPromotionsPerLoop;
641 unsigned MaxProm = MaxNumOfPromotionsPerLoop;
642 for (
auto *TargetBlock : LoopExitBlocks) {
643 auto *TargetLoop = LI.
getLoopFor(TargetBlock);
646 unsigned MaxPromForTarget = getMaxNumOfPromotionsInLoop(TargetLoop);
647 unsigned PendingCandsInTarget = LoopToCandidates[TargetLoop].size();
649 std::min(MaxProm, std::max(MaxPromForTarget, PendingCandsInTarget) -
650 PendingCandsInTarget);
663enum class ValueProfilingCallType {
681 InstrLowerer Lowerer(M, Options, GetTLI, IsCS);
682 if (!Lowerer.lower())
733 if (!isSamplingEnabled())
736 SampledInstrumentationConfig config = getSampledInstrumentationConfig();
750 M.getGlobalVariable(INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_SAMPLING_VAR));
751 assert(SamplingVar &&
"SamplingVar not set properly");
755 Value *NewSamplingVarVal;
759 auto *LoadSamplingVar = CondBuilder.CreateLoad(SamplingVarTy, SamplingVar);
760 if (config.IsSimpleSampling) {
764 IncBuilder.CreateAdd(LoadSamplingVar, GetConstant(IncBuilder, 1));
765 SamplingVarIncr = IncBuilder.CreateStore(NewSamplingVarVal, SamplingVar);
768 auto *DurationCond = CondBuilder.CreateICmpULE(
769 LoadSamplingVar, GetConstant(CondBuilder, config.BurstDuration - 1));
770 BranchWeight = MDB.createBranchWeights(
771 config.BurstDuration, config.Period - config.BurstDuration);
773 DurationCond,
I,
false, BranchWeight);
776 IncBuilder.CreateAdd(LoadSamplingVar, GetConstant(IncBuilder, 1));
777 SamplingVarIncr = IncBuilder.CreateStore(NewSamplingVarVal, SamplingVar);
778 I->moveBefore(ThenTerm);
781 if (config.IsFastSampling)
787 auto *PeriodCond = PeriodCondBuilder.CreateICmpUGE(
788 NewSamplingVarVal, GetConstant(PeriodCondBuilder, config.Period));
789 BranchWeight = MDB.createBranchWeights(1, config.Period - 1);
791 &ElseTerm, BranchWeight);
794 if (config.IsSimpleSampling)
795 I->moveBefore(ThenTerm);
798 ResetBuilder.CreateStore(GetConstant(ResetBuilder, 0), SamplingVar);
802bool InstrLowerer::lowerIntrinsics(
Function *
F) {
803 bool MadeChange =
false;
804 PromotionCandidates.clear();
812 if (
auto *IP = dyn_cast<InstrProfInstBase>(&Instr))
817 for (
auto *Instr : InstrProfInsts) {
819 if (
auto *IPIS = dyn_cast<InstrProfIncrementInstStep>(Instr)) {
820 lowerIncrement(IPIS);
822 }
else if (
auto *IPI = dyn_cast<InstrProfIncrementInst>(Instr)) {
825 }
else if (
auto *IPC = dyn_cast<InstrProfTimestampInst>(Instr)) {
828 }
else if (
auto *IPC = dyn_cast<InstrProfCoverInst>(Instr)) {
831 }
else if (
auto *IPVP = dyn_cast<InstrProfValueProfileInst>(Instr)) {
832 lowerValueProfileInst(IPVP);
834 }
else if (
auto *IPMP = dyn_cast<InstrProfMCDCBitmapParameters>(Instr)) {
835 IPMP->eraseFromParent();
837 }
else if (
auto *IPBU = dyn_cast<InstrProfMCDCTVBitmapUpdate>(Instr)) {
838 lowerMCDCTestVectorBitmapUpdate(IPBU);
846 promoteCounterLoadStores(
F);
850bool InstrLowerer::isRuntimeCounterRelocationEnabled()
const {
852 if (
TT.isOSBinFormatMachO())
855 if (RuntimeCounterRelocation.getNumOccurrences() > 0)
856 return RuntimeCounterRelocation;
859 return TT.isOSFuchsia();
862bool InstrLowerer::isSamplingEnabled()
const {
863 if (SampledInstr.getNumOccurrences() > 0)
868bool InstrLowerer::isCounterPromotionEnabled()
const {
869 if (DoCounterPromotion.getNumOccurrences() > 0)
870 return DoCounterPromotion;
872 return Options.DoCounterPromotion;
875void InstrLowerer::promoteCounterLoadStores(
Function *
F) {
876 if (!isCounterPromotionEnabled())
883 std::unique_ptr<BlockFrequencyInfo>
BFI;
884 if (
Options.UseBFIInPromotion) {
885 std::unique_ptr<BranchProbabilityInfo> BPI;
890 for (
const auto &LoadStore : PromotionCandidates) {
897 LoopPromotionCandidates[ParentLoop].emplace_back(CounterLoad, CounterStore);
905 PGOCounterPromoter Promoter(LoopPromotionCandidates, *
Loop, LI,
BFI.get());
906 Promoter.run(&TotalCountersPromoted);
912 if (TT.isOSFuchsia())
920 auto containsIntrinsic = [&](
int ID) {
922 return !
F->use_empty();
925 return containsIntrinsic(Intrinsic::instrprof_cover) ||
926 containsIntrinsic(Intrinsic::instrprof_increment) ||
927 containsIntrinsic(Intrinsic::instrprof_increment_step) ||
928 containsIntrinsic(Intrinsic::instrprof_timestamp) ||
929 containsIntrinsic(Intrinsic::instrprof_value_profile);
932bool InstrLowerer::lower() {
933 bool MadeChange =
false;
935 if (NeedsRuntimeHook)
936 MadeChange = emitRuntimeHook();
938 if (!IsCS && isSamplingEnabled())
945 if (!ContainsProfiling && !CoverageNamesVar)
954 for (
auto I = BB.
begin(), E = BB.
end();
I != E;
I++) {
955 if (
auto *Ind = dyn_cast<InstrProfValueProfileInst>(
I))
956 computeNumValueSiteCounts(Ind);
958 if (FirstProfInst ==
nullptr &&
959 (isa<InstrProfIncrementInst>(
I) || isa<InstrProfCoverInst>(
I)))
960 FirstProfInst = dyn_cast<InstrProfCntrInstBase>(
I);
962 if (
const auto &Params = dyn_cast<InstrProfMCDCBitmapParameters>(
I))
963 static_cast<void>(getOrCreateRegionBitmaps(Params));
970 if (FirstProfInst !=
nullptr) {
971 static_cast<void>(getOrCreateRegionCounters(FirstProfInst));
978 if (GV.hasMetadata(LLVMContext::MD_type))
979 getOrCreateVTableProfData(&GV);
982 MadeChange |= lowerIntrinsics(&
F);
984 if (CoverageNamesVar) {
985 lowerCoverageData(CoverageNamesVar);
1000 if (!NeedsRuntimeHook && ContainsProfiling)
1005 emitInitialization();
1011 ValueProfilingCallType CallType = ValueProfilingCallType::Default) {
1016 if (
auto AK = TLI.getExtAttrForI32Param(
false))
1017 AL = AL.addParamAttribute(M.getContext(), 2, AK);
1019 assert((CallType == ValueProfilingCallType::Default ||
1020 CallType == ValueProfilingCallType::MemOp) &&
1021 "Must be Default or MemOp");
1022 Type *ParamTypes[] = {
1023#define VALUE_PROF_FUNC_PARAM(ParamType, ParamName, ParamLLVMType) ParamLLVMType
1026 auto *ValueProfilingCallTy =
1028 StringRef FuncName = CallType == ValueProfilingCallType::Default
1031 return M.getOrInsertFunction(FuncName, ValueProfilingCallTy, AL);
1038 auto &
PD = ProfileDataMap[
Name];
1040 std::max(
PD.NumValueSites[ValueKind], (
uint32_t)(Index + 1));
1049 "Value profiling is not yet supported with lightweight instrumentation");
1051 auto It = ProfileDataMap.find(
Name);
1052 assert(It != ProfileDataMap.end() && It->second.DataVar &&
1053 "value profiling detected in function with no counter incerement");
1059 Index += It->second.NumValueSites[Kind];
1063 llvm::InstrProfValueKind::IPVK_MemOPSize);
1087 if (
auto AK = TLI->getExtAttrForI32Param(
false))
1088 Call->addParamAttr(2, AK);
1110 if (
TT.supportsCOMDAT())
1111 Bias->
setComdat(
M.getOrInsertComdat(VarName));
1117 auto *
Counters = getOrCreateRegionCounters(
I);
1120 if (isa<InstrProfTimestampInst>(
I))
1126 if (!isRuntimeCounterRelocationEnabled())
1130 Function *Fn =
I->getParent()->getParent();
1131 LoadInst *&BiasLI = FunctionToProfileBiasMap[Fn];
1135 BiasLI = EntryBuilder.CreateLoad(Int64Ty, Bias,
"profc_bias");
1137 BiasLI->
setMetadata(LLVMContext::MD_invariant_load,
1145 auto *Bitmaps = getOrCreateRegionBitmaps(
I);
1146 if (!isRuntimeCounterRelocationEnabled())
1154 auto *BiasLI = EntryBuilder.CreateLoad(Int64Ty, Bias,
"profbm_bias");
1156 BiasLI->
setMetadata(LLVMContext::MD_invariant_load,
1161 return Builder.
CreatePtrAdd(Bitmaps, BiasLI,
"profbm_addr");
1165 auto *
Addr = getCounterAddress(CoverInstruction);
1167 if (ConditionalCounterUpdate) {
1169 auto &Ctx = CoverInstruction->
getParent()->getContext();
1183void InstrLowerer::lowerTimestamp(
1186 "timestamp probes are always the first probe for a function");
1187 auto &Ctx =
M.getContext();
1188 auto *TimestampAddr = getCounterAddress(TimestampInstruction);
1192 auto Callee =
M.getOrInsertFunction(
1193 INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_SET_TIMESTAMP), CalleeTy);
1199 auto *
Addr = getCounterAddress(Inc);
1202 if (
Options.Atomic || AtomicCounterUpdateAll ||
1211 if (isCounterPromotionEnabled())
1212 PromotionCandidates.emplace_back(cast<Instruction>(Load), Store);
1217void InstrLowerer::lowerCoverageData(
GlobalVariable *CoverageNamesVar) {
1222 Value *
V =
NC->stripPointerCasts();
1223 assert(isa<GlobalVariable>(V) &&
"Missing reference to function name");
1227 ReferencedNames.push_back(
Name);
1228 if (isa<ConstantExpr>(
NC))
1229 NC->dropAllReferences();
1234void InstrLowerer::lowerMCDCTestVectorBitmapUpdate(
1236 auto &Ctx =
M.getContext();
1241 auto *BitmapAddr = getBitmapAddress(Update);
1246 Builder.
CreateLoad(Int32Ty, MCDCCondBitmapAddr,
"mcdc.temp"),
1251 auto *BitmapByteOffset = Builder.
CreateLShr(Temp, 0x3);
1255 auto *BitmapByteAddr =
1269 auto *Bitmap = Builder.
CreateLoad(Int8Ty, BitmapByteAddr,
"mcdc.bits");
1271 if (
Options.Atomic || AtomicCounterUpdateAll) {
1310 return (Prefix +
Name).str();
1315 if (
Name.ends_with((
Twine(
".") +
Twine(FuncHash)).toStringRef(HashPostfix)))
1316 return (Prefix +
Name).str();
1317 return (Prefix +
Name +
"." +
Twine(FuncHash)).str();
1325 if (!profDataReferencedByCode(*
F->getParent()))
1329 bool HasAvailableExternallyLinkage =
F->hasAvailableExternallyLinkage();
1330 if (!
F->hasLinkOnceLinkage() && !
F->hasLocalLinkage() &&
1331 !HasAvailableExternallyLinkage)
1337 if (HasAvailableExternallyLinkage &&
1338 F->hasFnAttribute(Attribute::AlwaysInline))
1344 if (
F->hasLocalLinkage() &&
F->hasComdat())
1354 return F->hasAddressTaken() ||
F->hasLinkOnceLinkage();
1401 Fn->
getName() +
".local", Fn);
1426 if (TT.isOSBinFormatELF() || TT.isOSBinFormatCOFF() ||
1427 TT.isOSBinFormatMachO() || TT.isOSBinFormatXCOFF() ||
1428 TT.isOSBinFormatWasm())
1441 bool UseComdat = (NeedComdat ||
TT.isOSBinFormatELF());
1456 StringRef GroupName =
TT.isOSBinFormatCOFF() && DataReferencedByCode
1459 Comdat *
C =
M.getOrInsertComdat(GroupName);
1479 if (!profDataReferencedByCode(*GV->
getParent()))
1506void InstrLowerer::getOrCreateVTableProfData(
GlobalVariable *GV) {
1508 "Value profiling is not supported with lightweight instrumentation");
1519 auto It = VTableDataMap.find(GV);
1520 if (It != VTableDataMap.end() && It->second)
1528 if (
TT.isOSBinFormatXCOFF()) {
1534 Type *DataTypes[] = {
1535#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Init) LLVMType,
1537#undef INSTR_PROF_VTABLE_DATA
1544 const std::string PGOVTableName =
getPGOName(*GV);
1551#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Init) Init,
1553#undef INSTR_PROF_VTABLE_DATA
1561 Data->setVisibility(Visibility);
1565 maybeSetComdat(
Data, GV,
Data->getName());
1567 VTableDataMap[GV] =
Data;
1569 ReferencedVTables.push_back(GV);
1573 UsedVars.push_back(
Data);
1597 if (
TT.isOSBinFormatXCOFF()) {
1606 if (IPSK == IPSK_cnts) {
1610 Ptr = createRegionCounters(CntrIncrement, VarName, Linkage);
1611 }
else if (IPSK == IPSK_bitmap) {
1615 dyn_cast<InstrProfMCDCBitmapInstBase>(Inc);
1616 Ptr = createRegionBitmaps(BitmapUpdate, VarName, Linkage);
1621 Ptr->setVisibility(Visibility);
1625 Ptr->setLinkage(Linkage);
1626 maybeSetComdat(
Ptr, Fn, VarName);
1645 auto &
PD = ProfileDataMap[NamePtr];
1646 if (
PD.RegionBitmaps)
1647 return PD.RegionBitmaps;
1651 auto *BitmapPtr = setupProfileSection(Inc, IPSK_bitmap);
1652 PD.RegionBitmaps = BitmapPtr;
1654 return PD.RegionBitmaps;
1661 auto &Ctx =
M.getContext();
1663 if (isa<InstrProfCoverInst>(Inc)) {
1667 std::vector<Constant *> InitialValues(NumCounters,
1685 auto &
PD = ProfileDataMap[NamePtr];
1686 if (
PD.RegionCounters)
1687 return PD.RegionCounters;
1691 auto *CounterPtr = setupProfileSection(Inc, IPSK_cnts);
1692 PD.RegionCounters = CounterPtr;
1700 Metadata *FunctionNameAnnotation[] = {
1708 Metadata *NumCountersAnnotation[] = {
1717 auto *DICounter =
DB.createGlobalVariableExpression(
1718 SP, CounterPtr->getName(),
StringRef(), SP->getFile(),
1719 0,
DB.createUnspecifiedType(
"Profile Data Type"),
1720 CounterPtr->hasLocalLinkage(),
true,
nullptr,
1721 nullptr,
nullptr, 0,
1723 CounterPtr->addDebugInfo(DICounter);
1728 CompilerUsedVars.push_back(
PD.RegionCounters);
1732 createDataVariable(Inc);
1734 return PD.RegionCounters;
1744 auto &
PD = ProfileDataMap[NamePtr];
1761 if (
TT.isOSBinFormatXCOFF()) {
1770 std::string CntsVarName =
1772 std::string DataVarName =
1781 NS +=
PD.NumValueSites[Kind];
1782 if (NS > 0 && ValueProfileStaticAlloc &&
1788 ValuesVar->setVisibility(Visibility);
1790 ValuesVar->setSection(
1792 ValuesVar->setAlignment(
Align(8));
1793 maybeSetComdat(ValuesVar, Fn, CntsVarName);
1799 auto *CounterPtr =
PD.RegionCounters;
1804 auto *IntPtrTy =
M.getDataLayout().getIntPtrType(
M.getContext());
1807 Type *DataTypes[] = {
1808#define INSTR_PROF_DATA(Type, LLVMType, Name, Init) LLVMType,
1815 Constant *Int16ArrayVals[IPVK_Last + 1];
1817 Int16ArrayVals[Kind] = ConstantInt::get(Int16Ty,
PD.NumValueSites[Kind]);
1834 else if (NS == 0 && !(DataReferencedByCode && NeedComdat && !Renamed) &&
1835 (
TT.isOSBinFormatELF() ||
1836 (!DataReferencedByCode &&
TT.isOSBinFormatCOFF()))) {
1841 new GlobalVariable(M, DataTy,
false, Linkage,
nullptr, DataVarName);
1844 Constant *RelativeBitmapPtr = ConstantInt::get(IntPtrTy, 0);
1849 DataSectionKind = IPSK_covdata;
1851 if (BitmapPtr !=
nullptr)
1856 DataSectionKind = IPSK_data;
1857 RelativeCounterPtr =
1860 if (BitmapPtr !=
nullptr)
1867#define INSTR_PROF_DATA(Type, LLVMType, Name, Init) Init,
1872 Data->setVisibility(Visibility);
1875 Data->setAlignment(
Align(INSTR_PROF_DATA_ALIGNMENT));
1876 maybeSetComdat(
Data, Fn, CntsVarName);
1881 CompilerUsedVars.push_back(
Data);
1887 ReferencedNames.push_back(NamePtr);
1890void InstrLowerer::emitVNodes() {
1891 if (!ValueProfileStaticAlloc)
1901 for (
auto &PD : ProfileDataMap) {
1903 TotalNS +=
PD.second.NumValueSites[Kind];
1909 uint64_t NumCounters = TotalNS * NumCountersPerValueSite;
1917#define INSTR_PROF_MIN_VAL_COUNTS 10
1921 auto &Ctx =
M.getContext();
1922 Type *VNodeTypes[] = {
1923#define INSTR_PROF_VALUE_NODE(Type, LLVMType, Name, Init) LLVMType,
1933 VNodesVar->setSection(
1935 VNodesVar->setAlignment(
M.getDataLayout().getABITypeAlign(VNodesTy));
1938 UsedVars.push_back(VNodesVar);
1941void InstrLowerer::emitNameData() {
1942 std::string UncompressedData;
1944 if (ReferencedNames.empty())
1947 std::string CompressedNameStr;
1953 auto &Ctx =
M.getContext();
1966 NamesSize = CompressedNameStr.size();
1968 NamesVar->setSection(
1975 NamesVar->setAlignment(
Align(1));
1978 UsedVars.push_back(NamesVar);
1980 for (
auto *NamePtr : ReferencedNames)
1984void InstrLowerer::emitVTableNames() {
1989 std::string CompressedVTableNames;
1995 auto &Ctx =
M.getContext();
1997 Ctx,
StringRef(CompressedVTableNames),
false );
2006 UsedVars.push_back(VTableNamesVar);
2009void InstrLowerer::emitRegistration() {
2022 RegisterF->addFnAttr(Attribute::NoRedZone);
2025 auto *RuntimeRegisterF =
2031 if (!isa<Function>(
Data))
2033 IRB.CreateCall(RuntimeRegisterF,
2034 IRB.CreatePointerBitCastOrAddrSpaceCast(
Data, VoidPtrTy));
2036 if (
Data != NamesVar && !isa<Function>(
Data))
2037 IRB.CreateCall(RuntimeRegisterF,
2038 IRB.CreatePointerBitCastOrAddrSpaceCast(
Data, VoidPtrTy));
2041 Type *ParamTypes[] = {VoidPtrTy, Int64Ty};
2042 auto *NamesRegisterTy =
2044 auto *NamesRegisterF =
2047 IRB.CreateCall(NamesRegisterF, {IRB.CreatePointerBitCastOrAddrSpaceCast(
2048 NamesVar, VoidPtrTy),
2049 IRB.getInt64(NamesSize)});
2052 IRB.CreateRetVoid();
2055bool InstrLowerer::emitRuntimeHook() {
2058 if (
TT.isOSLinux() ||
TT.isOSAIX())
2075 if (
TT.isOSBinFormatELF() && !
TT.isPS()) {
2077 CompilerUsedVars.push_back(Var);
2083 User->addFnAttr(Attribute::NoInline);
2085 User->addFnAttr(Attribute::NoRedZone);
2087 if (
TT.supportsCOMDAT())
2091 auto *
Load = IRB.CreateLoad(Int32Ty, Var);
2092 IRB.CreateRet(Load);
2095 CompilerUsedVars.push_back(
User);
2100void InstrLowerer::emitUses() {
2110 if (
TT.isOSBinFormatELF() ||
TT.isOSBinFormatMachO() ||
2111 (
TT.isOSBinFormatCOFF() && !DataReferencedByCode))
2122void InstrLowerer::emitInitialization() {
2139 F->addFnAttr(Attribute::NoInline);
2141 F->addFnAttr(Attribute::NoRedZone);
2145 IRB.CreateCall(RegisterF, {});
2146 IRB.CreateRetVoid();
2154 const StringRef VarName(INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_SAMPLING_VAR));
2157 if (getSampledInstrumentationConfig().UseShort) {
2167 SamplingVar->setThreadLocal(
true);
2168 Triple TT(M.getTargetTriple());
2169 if (TT.supportsCOMDAT()) {
2171 SamplingVar->setComdat(M.getOrInsertComdat(VarName));
This file contains the simple types necessary to represent the attributes associated with functions a...
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static unsigned InstrCount
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
static bool shouldRecordVTableAddr(GlobalVariable *GV)
static bool shouldRecordFunctionAddr(Function *F)
static bool needsRuntimeHookUnconditionally(const Triple &TT)
static bool containsProfilingIntrinsics(Module &M)
Check if the module contains uses of any profiling intrinsics.
static std::string getVarName(InstrProfInstBase *Inc, StringRef Prefix, bool &Renamed)
Get the name of a profiling variable for a particular function.
#define INSTR_PROF_MIN_VAL_COUNTS
static Constant * getFuncAddrForProfData(Function *Fn)
static bool shouldUsePublicSymbol(Function *Fn)
static FunctionCallee getOrInsertValueProfilingCall(Module &M, const TargetLibraryInfo &TLI, ValueProfilingCallType CallType=ValueProfilingCallType::Default)
static Constant * getVTableAddrForProfData(GlobalVariable *GV)
static bool needsRuntimeRegistrationOfSectionRange(const Triple &TT)
This file provides the interface for LLVM's PGO Instrumentation lowering pass.
This file provides the interface for IR based instrumentation passes ( (profile-gen,...
FunctionAnalysisManager FAM
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallVector class.
Class for arbitrary precision integers.
A container for analyses that lazily runs them and caches their results.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Annotations lets you mark points and ranges inside source code, for tests:
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
static ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
const Instruction & front() const
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
const Function * getParent() const
Return the enclosing method, or null if none.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Analysis providing branch probability information.
void getOperandBundlesAsDefs(SmallVectorImpl< OperandBundleDef > &Defs) const
Return the list of operand bundles attached to this instruction as a vector of OperandBundleDefs.
This class represents a function call, abstracting a target machine's calling convention.
@ NoDeduplicate
No deduplication is performed.
ConstantArray - Constant Array Declarations.
static Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true)
This method constructs a CDS and initializes it with a text string.
static Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
static Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static Constant * getPtrToInt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
static ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static Constant * get(StructType *T, ArrayRef< Constant * > V)
This is an important base class in LLVM.
static Constant * getIntegerValue(Type *Ty, const APInt &V)
Return the value for an integer or pointer constant, or a vector thereof, with the given scalar value...
static Constant * getAllOnesValue(Type *Ty)
static Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
bool isZeroValue() const
Return true if the value is negative zero or null value.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Lightweight error class with error context and mandatory checking.
A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...
static FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
const BasicBlock & getEntryBlock() const
DISubprogram * getSubprogram() const
Get the attached subprogram.
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
static GlobalAlias * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Aliasee, Module *Parent)
If a parent module is specified, the alias is automatically inserted into the end of the specified mo...
bool hasMetadata() const
Return true if this value has any metadata attached to it.
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalObject.
void setComdat(Comdat *C)
void setSection(StringRef S)
Change the section for this global.
bool hasLinkOnceLinkage() const
VisibilityTypes getVisibility() const
bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
LinkageTypes getLinkage() const
bool hasLocalLinkage() const
bool hasPrivateLinkage() const
void setLinkage(LinkageTypes LT)
bool isDeclarationForLinker() const
Module * getParent()
Get the module that this global value is contained inside of...
VisibilityTypes
An enumeration for the kinds of visibility of global values.
@ DefaultVisibility
The GV is visible.
@ HiddenVisibility
The GV is hidden.
@ ProtectedVisibility
The GV is protected.
void setVisibility(VisibilityTypes V)
bool hasAvailableExternallyLinkage() const
LinkageTypes
An enumeration for the kinds of linkage for global values.
@ PrivateLinkage
Like Internal, but omit from symbol table.
@ InternalLinkage
Rename collisions when linking (static functions).
@ ExternalLinkage
Externally visible function.
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
Type * getValueType() const
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
Value * CreateIntToPtr(Value *V, Type *DestTy, const Twine &Name="")
Value * CreateLShr(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
ConstantInt * getInt8(uint8_t C)
Get a constant 8-bit value.
Value * CreatePtrAdd(Value *Ptr, Value *Offset, const Twine &Name="", GEPNoWrapFlags NW=GEPNoWrapFlags::none())
Value * CreateICmpNE(Value *LHS, Value *RHS, const Twine &Name="")
ConstantInt * getInt32(uint32_t C)
Get a constant 32-bit value.
LoadInst * CreateLoad(Type *Ty, Value *Ptr, const char *Name)
Provided to resolve 'CreateLoad(Ty, Ptr, "...")' correctly, instead of converting the string to 'bool...
Value * CreateShl(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateConstInBoundsGEP2_32(Type *Ty, Value *Ptr, unsigned Idx0, unsigned Idx1, const Twine &Name="")
StoreInst * CreateStore(Value *Val, Value *Ptr, bool isVolatile=false)
Value * CreateAdd(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Value * CreatePtrToInt(Value *V, Type *DestTy, const Twine &Name="")
Value * CreateIsNotNull(Value *Arg, const Twine &Name="")
Return a boolean value testing if Arg != 0.
CallInst * CreateCall(FunctionType *FTy, Value *Callee, ArrayRef< Value * > Args={}, const Twine &Name="", MDNode *FPMathTag=nullptr)
AtomicRMWInst * CreateAtomicRMW(AtomicRMWInst::BinOp Op, Value *Ptr, Value *Val, MaybeAlign Align, AtomicOrdering Ordering, SyncScope::ID SSID=SyncScope::System)
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="", bool IsNUW=false, bool IsNSW=false)
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="")
ConstantInt * getInt16(uint16_t C)
Get a constant 16-bit value.
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Value * CreateInBoundsPtrAdd(Value *Ptr, Value *Offset, const Twine &Name="")
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
An analysis over an "outer" IR unit that provides access to an analysis manager over an "inner" IR un...
A base class for all instrprof counter intrinsics.
ConstantInt * getIndex() const
ConstantInt * getNumCounters() const
static const char * FunctionNameAttributeName
static const char * CFGHashAttributeName
static const char * NumCountersAttributeName
This represents the llvm.instrprof.cover intrinsic.
This represents the llvm.instrprof.increment intrinsic.
A base class for all instrprof intrinsics.
GlobalVariable * getName() const
ConstantInt * getHash() const
A base class for instrprof mcdc intrinsics that require global bitmap bytes.
auto getNumBitmapBytes() const
This represents the llvm.instrprof.mcdc.tvbitmap.update intrinsic.
Value * getMCDCCondBitmapAddr() const
ConstantInt * getBitmapIndex() const
This represents the llvm.instrprof.timestamp intrinsic.
This represents the llvm.instrprof.value.profile intrinsic.
ConstantInt * getIndex() const
Value * getTargetValue() const
ConstantInt * getValueKind() const
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
const Function * getFunction() const
Return the function this instruction belongs to.
void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
void moveBefore(Instruction *MovePos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
Class to represent integer types.
This is an important class for using LLVM in a threaded context.
An instruction for reading from memory.
void getExitBlocks(SmallVectorImpl< BlockT * > &ExitBlocks) const
Return all of the successor blocks of this loop.
void getExitingBlocks(SmallVectorImpl< BlockT * > &ExitingBlocks) const
Return all blocks inside the loop that have successors outside of the loop.
BlockT * getLoopPreheader() const
If there is a preheader for this loop, return it.
bool hasDedicatedExits() const
Return true if no exit block for the loop has a predecessor that is outside the loop.
SmallVector< LoopT *, 4 > getLoopsInPreorder() const
Return all of the loops in the function in preorder across the loop nests, with siblings in forward p...
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
Represents a single loop in the control flow graph.
MDNode * createUnlikelyBranchWeights()
Return metadata containing two branch weights, with significant bias towards false destination.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static MDString * get(LLVMContext &Context, StringRef Str)
A Module instance is used to store all the information related to an LLVM module.
static PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Helper class for SSA formation on a set of values defined in multiple blocks.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr size_t size() const
size - Get the string size.
static StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
static Type * getVoidTy(LLVMContext &C)
static IntegerType * getInt16Ty(LLVMContext &C)
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
static IntegerType * getInt8Ty(LLVMContext &C)
static IntegerType * getInt32Ty(LLVMContext &C)
static IntegerType * getInt64Ty(LLVMContext &C)
Value * getOperand(unsigned i) const
unsigned getNumOperands() const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVMContext & getContext() const
All values hold a context through their type.
StringRef getName() const
Return a constant reference to the value's name.
const ParentTy * getParent() const
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
@ C
The default llvm calling convention, compatible with C.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Function * getDeclarationIfExists(Module *M, ID id, ArrayRef< Type * > Tys, FunctionType *FT=nullptr)
This version supports overloaded intrinsics.
@ PD
PD - Prefix code for packed double precision vector floating point operations performed in the SSE re...
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
Linkage
Describes symbol linkage. This can be used to resolve definition clashes.
This is an optimization pass for GlobalISel generic memory operations.
StringRef getInstrProfNameVarPrefix()
Return the name prefix of variables containing instrumented function names.
StringRef getInstrProfRuntimeHookVarName()
Return the name of the hook variable defined in profile runtime library.
void createProfileSamplingVar(Module &M)
StringRef getInstrProfBitmapVarPrefix()
Return the name prefix of profile bitmap variables.
cl::opt< bool > DoInstrProfNameCompression
cl::opt< InstrProfCorrelator::ProfCorrelatorKind > ProfileCorrelate("profile-correlate", cl::desc("Use debug info or binary file to correlate profiles."), cl::init(InstrProfCorrelator::NONE), cl::values(clEnumValN(InstrProfCorrelator::NONE, "", "No profile correlation"), clEnumValN(InstrProfCorrelator::DEBUG_INFO, "debug-info", "Use debug info to correlate"), clEnumValN(InstrProfCorrelator::BINARY, "binary", "Use binary to correlate")))
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
StringRef getInstrProfVTableNamesVarName()
StringRef getInstrProfDataVarPrefix()
Return the name prefix of variables containing per-function control data.
StringRef getCoverageUnusedNamesVarName()
Return the name of the internal variable recording the array of PGO name vars referenced by the cover...
std::string getInstrProfSectionName(InstrProfSectKind IPSK, Triple::ObjectFormatType OF, bool AddSegmentInfo=true)
Return the name of the profile section corresponding to IPSK.
cl::opt< bool > DebugInfoCorrelate
bool needsComdatForCounter(const GlobalObject &GV, const Module &M)
Check if we can use Comdat for profile variables.
std::string getPGOName(const GlobalVariable &V, bool InLTO=false)
StringRef getInstrProfInitFuncName()
Return the name of the runtime initialization method that is generated by the compiler.
StringRef getInstrProfValuesVarPrefix()
Return the name prefix of value profile variables.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
StringRef getInstrProfCounterBiasVarName()
auto reverse(ContainerTy &&C)
StringRef getInstrProfRuntimeHookVarUseFuncName()
Return the name of the compiler generated function that references the runtime hook variable.
StringRef getInstrProfRegFuncsName()
Return the name of function that registers all the per-function control data at program startup time ...
Error collectPGOFuncNameStrings(ArrayRef< GlobalVariable * > NameVars, std::string &Result, bool doCompression=true)
Produce Result string with the same format described above.
void SplitBlockAndInsertIfThenElse(Value *Cond, BasicBlock::iterator SplitBefore, Instruction **ThenTerm, Instruction **ElseTerm, MDNode *BranchWeights=nullptr, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr)
SplitBlockAndInsertIfThenElse is similar to SplitBlockAndInsertIfThen, but also creates the ElseBlock...
StringRef getInstrProfCountersVarPrefix()
Return the name prefix of profile counter variables.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
StringRef getPGOFuncNameVarInitializer(GlobalVariable *NameVar)
Return the initializer in string of the PGO name var NameVar.
StringRef getInstrProfBitmapBiasVarName()
StringRef getInstrProfValueProfMemOpFuncName()
Return the name profile runtime entry point to do memop size value profiling.
StringRef getInstrProfNamesRegFuncName()
Return the name of the runtime interface that registers the PGO name strings.
void appendToCompilerUsed(Module &M, ArrayRef< GlobalValue * > Values)
Adds global values to the llvm.compiler.used list.
Error collectVTableStrings(ArrayRef< GlobalVariable * > VTables, std::string &Result, bool doCompression)
void setGlobalVariableLargeSection(const Triple &TargetTriple, GlobalVariable &GV)
bool canRenameComdatFunc(const Function &F, bool CheckAddressTaken=false)
Check if we can safely rename this Comdat function.
void createProfileFileNameVar(Module &M, StringRef InstrProfileOutput)
void appendToGlobalCtors(Module &M, Function *F, int Priority, Constant *Data=nullptr)
Append F to the list of global ctors of module M with the given Priority.
bool isPresplitCoroSuspendExitEdge(const BasicBlock &Src, const BasicBlock &Dest)
auto predecessors(const MachineBasicBlock *BB)
StringRef getInstrProfValueProfFuncName()
Return the name profile runtime entry point to do value profiling for a given site.
StringRef getInstrProfRegFuncName()
Return the name of the runtime interface that registers per-function control data for one instrumente...
const char * toString(DWARFSectionKind Kind)
Instruction * SplitBlockAndInsertIfThen(Value *Cond, BasicBlock::iterator SplitBefore, bool Unreachable, MDNode *BranchWeights=nullptr, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, BasicBlock *ThenBlock=nullptr)
Split the containing block at the specified instruction - everything before SplitBefore stays in the ...
void appendToUsed(Module &M, ArrayRef< GlobalValue * > Values)
Adds global values to the llvm.used list.
StringRef getInstrProfNamesVarName()
Return the name of the variable holding the strings (possibly compressed) of all function's PGO names...
bool isGPUProfTarget(const Module &M)
Determines whether module targets a GPU eligable for PGO instrumentation.
bool isIRPGOFlagSet(const Module *M)
Check if INSTR_PROF_RAW_VERSION_VAR is defined.
StringRef getInstrProfVNodesVarName()
Return the name of value profile node array variables:
cl::opt< bool > EnableVTableValueProfiling("enable-vtable-value-profiling", cl::init(false), cl::desc("If true, the virtual table address will be instrumented to know " "the types of a C++ pointer. The information is used in indirect " "call promotion to do selective vtable-based comparison."))
StringRef getInstrProfVTableVarPrefix()
Return the name prefix of variables containing virtual table profile data.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Options for the frontend instrumentation based profiling pass.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.