66#define DEBUG_TYPE "instrprof"
75 "debug-info-correlate",
76 cl::desc(
"Use debug info to correlate profiles. (Deprecated, use "
77 "-profile-correlate=debug-info)"),
82 cl::desc(
"Use debug info or binary file to correlate profiles."),
85 "No profile correlation"),
87 "Use debug info to correlate"),
89 "Use binary to correlate")));
95 "hash-based-counter-split",
96 cl::desc(
"Rename counter variable of a comdat function based on cfg hash"),
100 RuntimeCounterRelocation(
"runtime-counter-relocation",
101 cl::desc(
"Enable relocating counters at runtime."),
106 cl::desc(
"Do static counter allocation for value profiler"),
110 "vp-counters-per-site",
111 cl::desc(
"The average number of profile counters allocated "
112 "per value profiling site."),
120 "instrprof-atomic-counter-update-all",
121 cl::desc(
"Make all profile counter updates atomic (for testing only)"),
125 "atomic-counter-update-promoted",
126 cl::desc(
"Do counter update using atomic fetch add "
127 " for promoted counters only"),
131 "atomic-first-counter",
132 cl::desc(
"Use atomic fetch add for first counter in a function (usually "
133 "the entry counter)"),
137 "conditional-counter-update",
138 cl::desc(
"Do conditional counter updates in single byte counters mode)"),
147 cl::desc(
"Do counter register promotion"),
150 "max-counter-promotions-per-loop",
cl::init(20),
151 cl::desc(
"Max number counter promotions per loop to avoid"
152 " increasing register pressure too much"));
156 MaxNumOfPromotions(
"max-counter-promotions",
cl::init(-1),
157 cl::desc(
"Max number of allowed counter promotions"));
160 "speculative-counter-promotion-max-exiting",
cl::init(3),
161 cl::desc(
"The max number of exiting blocks of a loop to allow "
162 " speculative counter promotion"));
165 "speculative-counter-promotion-to-loop",
166 cl::desc(
"When the option is false, if the target block is in a loop, "
167 "the promotion will be disallowed unless the promoted counter "
168 " update can be further/iteratively promoted into an acyclic "
172 "iterative-counter-promotion",
cl::init(
true),
173 cl::desc(
"Allow counter promotion across the whole loop nest."));
176 "skip-ret-exit-block",
cl::init(
true),
177 cl::desc(
"Suppress counter promotion if exit blocks contain ret."));
181 cl::desc(
"Do PGO instrumentation sampling"));
184 "sampled-instr-period",
185 cl::desc(
"Set the profile instrumentation sample period. A sample period "
186 "of 0 is invalid. For each sample period, a fixed number of "
187 "consecutive samples will be recorded. The number is controlled "
188 "by 'sampled-instr-burst-duration' flag. The default sample "
189 "period of 65536 is optimized for generating efficient code that "
190 "leverages unsigned short integer wrapping in overflow, but this "
191 "is disabled under simple sampling (burst duration = 1)."),
195 "sampled-instr-burst-duration",
196 cl::desc(
"Set the profile instrumentation burst duration, which can range "
197 "from 1 to the value of 'sampled-instr-period' (0 is invalid). "
198 "This number of samples will be recorded for each "
199 "'sampled-instr-period' count update. Setting to 1 enables simple "
200 "sampling, in which case it is recommended to set "
201 "'sampled-instr-period' to a prime number."),
204struct SampledInstrumentationConfig {
205 unsigned BurstDuration;
208 bool IsSimpleSampling;
212static SampledInstrumentationConfig getSampledInstrumentationConfig() {
213 SampledInstrumentationConfig config;
214 config.BurstDuration = SampledInstrBurstDuration.getValue();
215 config.Period = SampledInstrPeriod.getValue();
216 if (config.BurstDuration > config.Period)
218 "SampledBurstDuration must be less than or equal to SampledPeriod");
219 if (config.Period == 0 || config.BurstDuration == 0)
221 "SampledPeriod and SampledBurstDuration must be greater than 0");
222 config.IsSimpleSampling = (config.BurstDuration == 1);
225 config.IsFastSampling =
226 (!config.IsSimpleSampling && config.Period == USHRT_MAX + 1);
227 config.UseShort = (config.Period <= USHRT_MAX) || config.IsFastSampling;
231using LoadStorePair = std::pair<Instruction *, Instruction *>;
234 auto *MD = dyn_cast_or_null<ConstantAsMetadata>(
M.getModuleFlag(Flag));
240 return cast<ConstantInt>(MD->getValue())->getZExtValue();
243static bool enablesValueProfiling(
const Module &M) {
245 getIntModuleFlagOrZero(M,
"EnableValueProfiling") != 0;
249static bool profDataReferencedByCode(
const Module &M) {
250 return enablesValueProfiling(M);
253class InstrLowerer final {
258 :
M(
M), Options(Options),
TT(
M.getTargetTriple()), IsCS(IsCS),
259 GetTLI(GetTLI), DataReferencedByCode(profDataReferencedByCode(
M)) {}
272 const bool DataReferencedByCode;
274 struct PerFunctionProfileData {
275 uint32_t NumValueSites[IPVK_Last + 1] = {};
281 PerFunctionProfileData() =
default;
290 std::vector<GlobalValue *> CompilerUsedVars;
291 std::vector<GlobalValue *> UsedVars;
292 std::vector<GlobalVariable *> ReferencedNames;
295 std::vector<GlobalVariable *> ReferencedVTables;
297 size_t NamesSize = 0;
300 std::vector<LoadStorePair> PromotionCandidates;
302 int64_t TotalCountersPromoted = 0;
309 void promoteCounterLoadStores(
Function *
F);
312 bool isRuntimeCounterRelocationEnabled()
const;
315 bool isCounterPromotionEnabled()
const;
318 bool isSamplingEnabled()
const;
401 void emitVTableNames();
407 void emitRegistration();
411 bool emitRuntimeHook();
418 void emitInitialization();
430 PGOCounterPromoterHelper(
437 InsertPts(InsertPts), LoopToCandidates(LoopToCands), LI(LI) {
439 assert(isa<StoreInst>(S));
440 SSA.AddAvailableValue(PH,
Init);
444 for (
unsigned i = 0, e = ExitBlocks.size(); i != e; ++i) {
450 Value *LiveInValue =
SSA.GetValueInMiddleOfBlock(ExitBlock);
451 Value *
Addr = cast<StoreInst>(Store)->getPointerOperand();
454 if (
auto *AddrInst = dyn_cast_or_null<IntToPtrInst>(
Addr)) {
461 auto *OrigBiasInst = dyn_cast<BinaryOperator>(AddrInst->getOperand(0));
462 assert(OrigBiasInst->getOpcode() == Instruction::BinaryOps::Add);
463 Value *BiasInst = Builder.Insert(OrigBiasInst->clone());
464 Addr = Builder.CreateIntToPtr(BiasInst,
467 if (AtomicCounterUpdatePromoted)
472 AtomicOrdering::SequentiallyConsistent);
474 LoadInst *OldVal = Builder.CreateLoad(Ty,
Addr,
"pgocount.promoted");
475 auto *NewVal = Builder.CreateAdd(OldVal, LiveInValue);
476 auto *NewStore = Builder.CreateStore(NewVal,
Addr);
479 if (IterativeCounterPromotion) {
480 auto *TargetLoop = LI.getLoopFor(ExitBlock);
482 LoopToCandidates[TargetLoop].emplace_back(OldVal, NewStore);
499class PGOCounterPromoter {
504 : LoopToCandidates(LoopToCands),
L(CurLoop), LI(LI),
BFI(
BFI) {
511 L.getExitBlocks(LoopExitBlocks);
512 if (!isPromotionPossible(&L, LoopExitBlocks))
515 for (
BasicBlock *ExitBlock : LoopExitBlocks) {
516 if (
BlockSet.insert(ExitBlock).second &&
520 ExitBlocks.push_back(ExitBlock);
526 bool run(int64_t *NumPromoted) {
528 if (ExitBlocks.size() == 0)
536 if (SkipRetExitBlock) {
537 for (
auto *BB : ExitBlocks)
538 if (isa<ReturnInst>(BB->getTerminator()))
542 unsigned MaxProm = getMaxNumOfPromotionsInLoop(&L);
546 unsigned Promoted = 0;
547 for (
auto &Cand : LoopToCandidates[&L]) {
551 Value *InitVal = ConstantInt::get(Cand.first->getType(), 0);
555 auto *BB = Cand.first->getParent();
559 auto PreheaderCount =
BFI->getBlockProfileCount(
L.getLoopPreheader());
562 if (PreheaderCount && (*PreheaderCount * 3) >= (*
InstrCount * 2))
566 PGOCounterPromoterHelper Promoter(Cand.first, Cand.second,
SSA, InitVal,
567 L.getLoopPreheader(), ExitBlocks,
568 InsertPts, LoopToCandidates, LI);
571 if (Promoted >= MaxProm)
575 if (MaxNumOfPromotions != -1 && *NumPromoted >= MaxNumOfPromotions)
579 LLVM_DEBUG(
dbgs() << Promoted <<
" counters promoted for loop (depth="
580 <<
L.getLoopDepth() <<
")\n");
581 return Promoted != 0;
585 bool allowSpeculativeCounterPromotion(
Loop *LP) {
587 L.getExitingBlocks(ExitingBlocks);
589 if (ExitingBlocks.
size() == 1)
591 if (ExitingBlocks.
size() > SpeculativeCounterPromotionMaxExiting)
599 isPromotionPossible(
Loop *LP,
603 return isa<CatchSwitchInst>(
Exit->getTerminator());
618 unsigned getMaxNumOfPromotionsInLoop(
Loop *LP) {
621 if (!isPromotionPossible(LP, LoopExitBlocks))
632 if (ExitingBlocks.
size() == 1)
633 return MaxNumOfPromotionsPerLoop;
635 if (ExitingBlocks.
size() > SpeculativeCounterPromotionMaxExiting)
639 if (SpeculativeCounterPromotionToLoop)
640 return MaxNumOfPromotionsPerLoop;
643 unsigned MaxProm = MaxNumOfPromotionsPerLoop;
644 for (
auto *TargetBlock : LoopExitBlocks) {
645 auto *TargetLoop = LI.
getLoopFor(TargetBlock);
648 unsigned MaxPromForTarget = getMaxNumOfPromotionsInLoop(TargetLoop);
649 unsigned PendingCandsInTarget = LoopToCandidates[TargetLoop].size();
651 std::min(MaxProm, std::max(MaxPromForTarget, PendingCandsInTarget) -
652 PendingCandsInTarget);
665enum class ValueProfilingCallType {
683 InstrLowerer Lowerer(M, Options, GetTLI, IsCS);
684 if (!Lowerer.lower())
735 if (!isSamplingEnabled())
738 SampledInstrumentationConfig config = getSampledInstrumentationConfig();
752 M.getGlobalVariable(INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_SAMPLING_VAR));
753 assert(SamplingVar &&
"SamplingVar not set properly");
757 Value *NewSamplingVarVal;
761 auto *LoadSamplingVar = CondBuilder.CreateLoad(SamplingVarTy, SamplingVar);
762 if (config.IsSimpleSampling) {
766 IncBuilder.CreateAdd(LoadSamplingVar, GetConstant(IncBuilder, 1));
767 SamplingVarIncr = IncBuilder.CreateStore(NewSamplingVarVal, SamplingVar);
770 auto *DurationCond = CondBuilder.CreateICmpULE(
771 LoadSamplingVar, GetConstant(CondBuilder, config.BurstDuration - 1));
772 BranchWeight = MDB.createBranchWeights(
773 config.BurstDuration, config.Period - config.BurstDuration);
775 DurationCond,
I,
false, BranchWeight);
778 IncBuilder.CreateAdd(LoadSamplingVar, GetConstant(IncBuilder, 1));
779 SamplingVarIncr = IncBuilder.CreateStore(NewSamplingVarVal, SamplingVar);
783 if (config.IsFastSampling)
789 auto *PeriodCond = PeriodCondBuilder.CreateICmpUGE(
790 NewSamplingVarVal, GetConstant(PeriodCondBuilder, config.Period));
791 BranchWeight = MDB.createBranchWeights(1, config.Period - 1);
793 &ElseTerm, BranchWeight);
796 if (config.IsSimpleSampling)
800 ResetBuilder.CreateStore(GetConstant(ResetBuilder, 0), SamplingVar);
804bool InstrLowerer::lowerIntrinsics(
Function *
F) {
805 bool MadeChange =
false;
806 PromotionCandidates.clear();
814 if (
auto *IP = dyn_cast<InstrProfInstBase>(&Instr))
819 for (
auto *Instr : InstrProfInsts) {
821 if (
auto *IPIS = dyn_cast<InstrProfIncrementInstStep>(Instr)) {
822 lowerIncrement(IPIS);
824 }
else if (
auto *IPI = dyn_cast<InstrProfIncrementInst>(Instr)) {
827 }
else if (
auto *IPC = dyn_cast<InstrProfTimestampInst>(Instr)) {
830 }
else if (
auto *IPC = dyn_cast<InstrProfCoverInst>(Instr)) {
833 }
else if (
auto *IPVP = dyn_cast<InstrProfValueProfileInst>(Instr)) {
834 lowerValueProfileInst(IPVP);
836 }
else if (
auto *IPMP = dyn_cast<InstrProfMCDCBitmapParameters>(Instr)) {
837 IPMP->eraseFromParent();
839 }
else if (
auto *IPBU = dyn_cast<InstrProfMCDCTVBitmapUpdate>(Instr)) {
840 lowerMCDCTestVectorBitmapUpdate(IPBU);
848 promoteCounterLoadStores(
F);
852bool InstrLowerer::isRuntimeCounterRelocationEnabled()
const {
854 if (
TT.isOSBinFormatMachO())
857 if (RuntimeCounterRelocation.getNumOccurrences() > 0)
858 return RuntimeCounterRelocation;
861 return TT.isOSFuchsia();
864bool InstrLowerer::isSamplingEnabled()
const {
865 if (SampledInstr.getNumOccurrences() > 0)
870bool InstrLowerer::isCounterPromotionEnabled()
const {
871 if (DoCounterPromotion.getNumOccurrences() > 0)
872 return DoCounterPromotion;
874 return Options.DoCounterPromotion;
877void InstrLowerer::promoteCounterLoadStores(
Function *
F) {
878 if (!isCounterPromotionEnabled())
885 std::unique_ptr<BlockFrequencyInfo>
BFI;
886 if (
Options.UseBFIInPromotion) {
887 std::unique_ptr<BranchProbabilityInfo> BPI;
892 for (
const auto &LoadStore : PromotionCandidates) {
899 LoopPromotionCandidates[ParentLoop].emplace_back(CounterLoad, CounterStore);
907 PGOCounterPromoter Promoter(LoopPromotionCandidates, *
Loop, LI,
BFI.get());
908 Promoter.run(&TotalCountersPromoted);
914 if (TT.isOSFuchsia())
922 auto containsIntrinsic = [&](
int ID) {
924 return !
F->use_empty();
927 return containsIntrinsic(Intrinsic::instrprof_cover) ||
928 containsIntrinsic(Intrinsic::instrprof_increment) ||
929 containsIntrinsic(Intrinsic::instrprof_increment_step) ||
930 containsIntrinsic(Intrinsic::instrprof_timestamp) ||
931 containsIntrinsic(Intrinsic::instrprof_value_profile);
934bool InstrLowerer::lower() {
935 bool MadeChange =
false;
937 if (NeedsRuntimeHook)
938 MadeChange = emitRuntimeHook();
940 if (!IsCS && isSamplingEnabled())
947 if (!ContainsProfiling && !CoverageNamesVar)
956 for (
auto I = BB.
begin(), E = BB.
end();
I != E;
I++) {
957 if (
auto *Ind = dyn_cast<InstrProfValueProfileInst>(
I))
958 computeNumValueSiteCounts(Ind);
960 if (FirstProfInst ==
nullptr &&
961 (isa<InstrProfIncrementInst>(
I) || isa<InstrProfCoverInst>(
I)))
962 FirstProfInst = dyn_cast<InstrProfCntrInstBase>(
I);
964 if (
const auto &Params = dyn_cast<InstrProfMCDCBitmapParameters>(
I))
965 static_cast<void>(getOrCreateRegionBitmaps(Params));
972 if (FirstProfInst !=
nullptr) {
973 static_cast<void>(getOrCreateRegionCounters(FirstProfInst));
980 if (GV.hasMetadata(LLVMContext::MD_type))
981 getOrCreateVTableProfData(&GV);
984 MadeChange |= lowerIntrinsics(&
F);
986 if (CoverageNamesVar) {
987 lowerCoverageData(CoverageNamesVar);
1002 if (!NeedsRuntimeHook && ContainsProfiling)
1007 emitInitialization();
1013 ValueProfilingCallType CallType = ValueProfilingCallType::Default) {
1018 if (
auto AK = TLI.getExtAttrForI32Param(
false))
1019 AL = AL.addParamAttribute(M.getContext(), 2, AK);
1021 assert((CallType == ValueProfilingCallType::Default ||
1022 CallType == ValueProfilingCallType::MemOp) &&
1023 "Must be Default or MemOp");
1024 Type *ParamTypes[] = {
1025#define VALUE_PROF_FUNC_PARAM(ParamType, ParamName, ParamLLVMType) ParamLLVMType
1028 auto *ValueProfilingCallTy =
1030 StringRef FuncName = CallType == ValueProfilingCallType::Default
1033 return M.getOrInsertFunction(FuncName, ValueProfilingCallTy, AL);
1040 auto &
PD = ProfileDataMap[
Name];
1042 std::max(
PD.NumValueSites[ValueKind], (
uint32_t)(Index + 1));
1051 "Value profiling is not yet supported with lightweight instrumentation");
1053 auto It = ProfileDataMap.find(
Name);
1054 assert(It != ProfileDataMap.end() && It->second.DataVar &&
1055 "value profiling detected in function with no counter incerement");
1061 Index += It->second.NumValueSites[Kind];
1065 llvm::InstrProfValueKind::IPVK_MemOPSize);
1089 if (
auto AK = TLI->getExtAttrForI32Param(
false))
1090 Call->addParamAttr(2, AK);
1112 if (
TT.supportsCOMDAT())
1113 Bias->
setComdat(
M.getOrInsertComdat(VarName));
1119 auto *
Counters = getOrCreateRegionCounters(
I);
1122 if (isa<InstrProfTimestampInst>(
I))
1128 if (!isRuntimeCounterRelocationEnabled())
1132 Function *Fn =
I->getParent()->getParent();
1133 LoadInst *&BiasLI = FunctionToProfileBiasMap[Fn];
1137 BiasLI = EntryBuilder.CreateLoad(Int64Ty, Bias,
"profc_bias");
1139 BiasLI->
setMetadata(LLVMContext::MD_invariant_load,
1147 auto *Bitmaps = getOrCreateRegionBitmaps(
I);
1148 if (!isRuntimeCounterRelocationEnabled())
1156 auto *BiasLI = EntryBuilder.CreateLoad(Int64Ty, Bias,
"profbm_bias");
1158 BiasLI->
setMetadata(LLVMContext::MD_invariant_load,
1163 return Builder.
CreatePtrAdd(Bitmaps, BiasLI,
"profbm_addr");
1167 auto *
Addr = getCounterAddress(CoverInstruction);
1169 if (ConditionalCounterUpdate) {
1171 auto &Ctx = CoverInstruction->
getParent()->getContext();
1185void InstrLowerer::lowerTimestamp(
1188 "timestamp probes are always the first probe for a function");
1189 auto &Ctx =
M.getContext();
1190 auto *TimestampAddr = getCounterAddress(TimestampInstruction);
1194 auto Callee =
M.getOrInsertFunction(
1195 INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_SET_TIMESTAMP), CalleeTy);
1201 auto *
Addr = getCounterAddress(Inc);
1204 if (
Options.Atomic || AtomicCounterUpdateAll ||
1213 if (isCounterPromotionEnabled())
1214 PromotionCandidates.emplace_back(cast<Instruction>(Load), Store);
1219void InstrLowerer::lowerCoverageData(
GlobalVariable *CoverageNamesVar) {
1224 Value *
V =
NC->stripPointerCasts();
1225 assert(isa<GlobalVariable>(V) &&
"Missing reference to function name");
1229 ReferencedNames.push_back(
Name);
1230 if (isa<ConstantExpr>(
NC))
1231 NC->dropAllReferences();
1236void InstrLowerer::lowerMCDCTestVectorBitmapUpdate(
1238 auto &Ctx =
M.getContext();
1243 auto *BitmapAddr = getBitmapAddress(Update);
1248 Builder.
CreateLoad(Int32Ty, MCDCCondBitmapAddr,
"mcdc.temp"),
1253 auto *BitmapByteOffset = Builder.
CreateLShr(Temp, 0x3);
1257 auto *BitmapByteAddr =
1271 auto *Bitmap = Builder.
CreateLoad(Int8Ty, BitmapByteAddr,
"mcdc.bits");
1273 if (
Options.Atomic || AtomicCounterUpdateAll) {
1312 return (Prefix +
Name).str();
1317 if (
Name.ends_with((
Twine(
".") +
Twine(FuncHash)).toStringRef(HashPostfix)))
1318 return (Prefix +
Name).str();
1319 return (Prefix +
Name +
"." +
Twine(FuncHash)).str();
1327 if (!profDataReferencedByCode(*
F->getParent()))
1331 bool HasAvailableExternallyLinkage =
F->hasAvailableExternallyLinkage();
1332 if (!
F->hasLinkOnceLinkage() && !
F->hasLocalLinkage() &&
1333 !HasAvailableExternallyLinkage)
1339 if (HasAvailableExternallyLinkage &&
1340 F->hasFnAttribute(Attribute::AlwaysInline))
1346 if (
F->hasLocalLinkage() &&
F->hasComdat())
1356 return F->hasAddressTaken() ||
F->hasLinkOnceLinkage();
1403 Fn->
getName() +
".local", Fn);
1428 if (TT.isOSBinFormatELF() || TT.isOSBinFormatCOFF() ||
1429 TT.isOSBinFormatMachO() || TT.isOSBinFormatXCOFF() ||
1430 TT.isOSBinFormatWasm())
1443 bool UseComdat = (NeedComdat ||
TT.isOSBinFormatELF());
1458 StringRef GroupName =
TT.isOSBinFormatCOFF() && DataReferencedByCode
1461 Comdat *
C =
M.getOrInsertComdat(GroupName);
1481 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 if (ReferencedNames.empty())
1945 std::string CompressedNameStr;
1951 auto &Ctx =
M.getContext();
1958 NamesSize = CompressedNameStr.size();
1960 NamesVar->setSection(
1967 NamesVar->setAlignment(
Align(1));
1970 UsedVars.push_back(NamesVar);
1972 for (
auto *NamePtr : ReferencedNames)
1976void InstrLowerer::emitVTableNames() {
1981 std::string CompressedVTableNames;
1987 auto &Ctx =
M.getContext();
1989 Ctx,
StringRef(CompressedVTableNames),
false );
1998 UsedVars.push_back(VTableNamesVar);
2001void InstrLowerer::emitRegistration() {
2014 RegisterF->addFnAttr(Attribute::NoRedZone);
2017 auto *RuntimeRegisterF =
2023 if (!isa<Function>(
Data))
2025 IRB.CreateCall(RuntimeRegisterF,
2026 IRB.CreatePointerBitCastOrAddrSpaceCast(
Data, VoidPtrTy));
2028 if (
Data != NamesVar && !isa<Function>(
Data))
2029 IRB.CreateCall(RuntimeRegisterF,
2030 IRB.CreatePointerBitCastOrAddrSpaceCast(
Data, VoidPtrTy));
2033 Type *ParamTypes[] = {VoidPtrTy, Int64Ty};
2034 auto *NamesRegisterTy =
2036 auto *NamesRegisterF =
2039 IRB.CreateCall(NamesRegisterF, {IRB.CreatePointerBitCastOrAddrSpaceCast(
2040 NamesVar, VoidPtrTy),
2041 IRB.getInt64(NamesSize)});
2044 IRB.CreateRetVoid();
2047bool InstrLowerer::emitRuntimeHook() {
2050 if (
TT.isOSLinux() ||
TT.isOSAIX())
2067 if (
TT.isOSBinFormatELF() && !
TT.isPS()) {
2069 CompilerUsedVars.push_back(Var);
2075 User->addFnAttr(Attribute::NoInline);
2077 User->addFnAttr(Attribute::NoRedZone);
2079 if (
TT.supportsCOMDAT())
2083 auto *
Load = IRB.CreateLoad(Int32Ty, Var);
2084 IRB.CreateRet(Load);
2087 CompilerUsedVars.push_back(
User);
2092void InstrLowerer::emitUses() {
2102 if (
TT.isOSBinFormatELF() ||
TT.isOSBinFormatMachO() ||
2103 (
TT.isOSBinFormatCOFF() && !DataReferencedByCode))
2114void InstrLowerer::emitInitialization() {
2131 F->addFnAttr(Attribute::NoInline);
2133 F->addFnAttr(Attribute::NoRedZone);
2137 IRB.CreateCall(RegisterF, {});
2138 IRB.CreateRetVoid();
2146 const StringRef VarName(INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_SAMPLING_VAR));
2149 if (getSampledInstrumentationConfig().UseShort) {
2159 SamplingVar->setThreadLocal(
true);
2160 Triple TT(M.getTargetTriple());
2161 if (TT.supportsCOMDAT()) {
2163 SamplingVar->setComdat(M.getOrInsertComdat(VarName));
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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
std::unordered_set< BasicBlock * > BlockSet
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 LLVM_ABI 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.
LLVM_ABI 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.
LLVM_ABI 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 LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true)
This method constructs a CDS and initializes it with a text string.
static LLVM_ABI Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getPtrToInt(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 LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
This is an important base class in LLVM.
static LLVM_ABI 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 LLVM_ABI Constant * getAllOnesValue(Type *Ty)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI 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 LLVM_ABI 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 LLVM_ABI 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.
LLVM_ABI void setComdat(Comdat *C)
LLVM_ABI void setSection(StringRef S)
Change the section for this global.
bool hasLinkOnceLinkage() const
VisibilityTypes getVisibility() const
LLVM_ABI 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.
LLVM_ABI void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalVariable.
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)
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="")
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="", bool IsDisjoint=false)
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.
LLVM_ABI ConstantInt * getIndex() const
LLVM_ABI ConstantInt * getNumCounters() const
static LLVM_ABI const char * FunctionNameAttributeName
static LLVM_ABI const char * CFGHashAttributeName
static LLVM_ABI const char * NumCountersAttributeName
This represents the llvm.instrprof.cover intrinsic.
This represents the llvm.instrprof.increment intrinsic.
LLVM_ABI Value * getStep() const
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
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
LLVM_ABI void moveBefore(InstListType::iterator InsertPos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
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.
LLVM_ABI MDNode * createUnlikelyBranchWeights()
Return metadata containing two branch weights, with significant bias towards false destination.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
A Module instance is used to store all the information related to an LLVM module.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
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.
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 LLVM_ABI 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 LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
static LLVM_ABI IntegerType * getInt16Ty(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.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
const ParentTy * getParent() const
self_iterator getIterator()
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.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
LLVM_ABI Function * getDeclarationIfExists(const Module *M, ID id)
Look up the Function declaration of the intrinsic id in the Module M and return it if it exists.
@ 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.
LLVM_ABI cl::opt< bool > DebugInfoCorrelate
StringRef getInstrProfRuntimeHookVarName()
Return the name of the hook variable defined in profile runtime library.
LLVM_ABI void createProfileSamplingVar(Module &M)
StringRef getInstrProfBitmapVarPrefix()
Return the name prefix of profile bitmap variables.
LLVM_ABI cl::opt< bool > DoInstrProfNameCompression
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...
LLVM_ABI std::string getInstrProfSectionName(InstrProfSectKind IPSK, Triple::ObjectFormatType OF, bool AddSegmentInfo=true)
Return the name of the profile section corresponding to IPSK.
LLVM_ABI bool needsComdatForCounter(const GlobalObject &GV, const Module &M)
Check if we can use Comdat for profile variables.
LLVM_ABI 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 ...
LLVM_ABI Error collectPGOFuncNameStrings(ArrayRef< GlobalVariable * > NameVars, std::string &Result, bool doCompression=true)
Produce Result string with the same format described above.
LLVM_ABI 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.
LLVM_ABI 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.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
LLVM_ABI 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.
LLVM_ABI void appendToCompilerUsed(Module &M, ArrayRef< GlobalValue * > Values)
Adds global values to the llvm.compiler.used list.
LLVM_ABI Error collectVTableStrings(ArrayRef< GlobalVariable * > VTables, std::string &Result, bool doCompression)
LLVM_ABI void setGlobalVariableLargeSection(const Triple &TargetTriple, GlobalVariable &GV)
LLVM_ABI bool canRenameComdatFunc(const Function &F, bool CheckAddressTaken=false)
Check if we can safely rename this Comdat function.
LLVM_ABI void createProfileFileNameVar(Module &M, StringRef InstrProfileOutput)
LLVM_ABI 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.
LLVM_ABI 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.
llvm::cl::opt< llvm::InstrProfCorrelator::ProfCorrelatorKind > ProfileCorrelate
StringRef getInstrProfRegFuncName()
Return the name of the runtime interface that registers per-function control data for one instrumente...
const char * toString(DWARFSectionKind Kind)
LLVM_ABI 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 ...
LLVM_ABI 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...
LLVM_ABI bool isGPUProfTarget(const Module &M)
Determines whether module targets a GPU eligable for PGO instrumentation.
LLVM_ABI 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.