70#define DEBUG_TYPE "instrprof"
78 cl::desc(
"Use debug info or binary file to correlate profiles."),
81 "No profile correlation"),
83 "Use debug info to correlate"),
85 "Use binary to correlate")));
91 "hash-based-counter-split",
92 cl::desc(
"Rename counter variable of a comdat function based on cfg hash"),
96 RuntimeCounterRelocation(
"runtime-counter-relocation",
97 cl::desc(
"Enable relocating counters at runtime."),
102 cl::desc(
"Do static counter allocation for value profiler"),
106 "vp-counters-per-site",
107 cl::desc(
"The average number of profile counters allocated "
108 "per value profiling site."),
116 "instrprof-atomic-counter-update-all",
117 cl::desc(
"Make all profile counter updates atomic (for testing only)"),
121 "atomic-counter-update-promoted",
122 cl::desc(
"Do counter update using atomic fetch add "
123 " for promoted counters only"),
127 "atomic-first-counter",
128 cl::desc(
"Use atomic fetch add for first counter in a function (usually "
129 "the entry counter)"),
133 "conditional-counter-update",
134 cl::desc(
"Do conditional counter updates in single byte counters mode)"),
143 cl::desc(
"Do counter register promotion"),
146 "max-counter-promotions-per-loop",
cl::init(20),
147 cl::desc(
"Max number counter promotions per loop to avoid"
148 " increasing register pressure too much"));
152 MaxNumOfPromotions(
"max-counter-promotions",
cl::init(-1),
153 cl::desc(
"Max number of allowed counter promotions"));
156 "speculative-counter-promotion-max-exiting",
cl::init(3),
157 cl::desc(
"The max number of exiting blocks of a loop to allow "
158 " speculative counter promotion"));
161 "speculative-counter-promotion-to-loop",
162 cl::desc(
"When the option is false, if the target block is in a loop, "
163 "the promotion will be disallowed unless the promoted counter "
164 " update can be further/iteratively promoted into an acyclic "
168 "iterative-counter-promotion",
cl::init(
true),
169 cl::desc(
"Allow counter promotion across the whole loop nest."));
172 "skip-ret-exit-block",
cl::init(
true),
173 cl::desc(
"Suppress counter promotion if exit blocks contain ret."));
176 cl::desc(
"Do PGO instrumentation sampling"));
179 "sampled-instr-period",
180 cl::desc(
"Set the profile instrumentation sample period. A sample period "
181 "of 0 is invalid. For each sample period, a fixed number of "
182 "consecutive samples will be recorded. The number is controlled "
183 "by 'sampled-instr-burst-duration' flag. The default sample "
184 "period of 65536 is optimized for generating efficient code that "
185 "leverages unsigned short integer wrapping in overflow, but this "
186 "is disabled under simple sampling (burst duration = 1)."),
190 "sampled-instr-burst-duration",
191 cl::desc(
"Set the profile instrumentation burst duration, which can range "
192 "from 1 to the value of 'sampled-instr-period' (0 is invalid). "
193 "This number of samples will be recorded for each "
194 "'sampled-instr-period' count update. Setting to 1 enables simple "
195 "sampling, in which case it is recommended to set "
196 "'sampled-instr-period' to a prime number."),
199struct SampledInstrumentationConfig {
200 unsigned BurstDuration;
203 bool IsSimpleSampling;
207static SampledInstrumentationConfig getSampledInstrumentationConfig() {
208 SampledInstrumentationConfig config;
209 config.BurstDuration = SampledInstrBurstDuration.getValue();
210 config.Period = SampledInstrPeriod.getValue();
211 if (config.BurstDuration > config.Period)
213 "SampledBurstDuration must be less than or equal to SampledPeriod");
214 if (config.Period == 0 || config.BurstDuration == 0)
216 "SampledPeriod and SampledBurstDuration must be greater than 0");
217 config.IsSimpleSampling = (config.BurstDuration == 1);
220 config.IsFastSampling =
221 (!config.IsSimpleSampling && config.Period == USHRT_MAX + 1);
222 config.UseShort = (config.Period <= USHRT_MAX) || config.IsFastSampling;
226using LoadStorePair = std::pair<Instruction *, Instruction *>;
238static bool enablesValueProfiling(
const Module &M) {
240 getIntModuleFlagOrZero(M,
"EnableValueProfiling") != 0;
244static bool profDataReferencedByCode(
const Module &M) {
245 return enablesValueProfiling(M);
248class InstrLowerer final {
250 InstrLowerer(
Module &M,
const InstrProfOptions &Options,
251 std::function<
const TargetLibraryInfo &(Function &
F)> GetTLI,
253 : M(M), Options(Options), TT(M.getTargetTriple()), IsCS(IsCS),
254 GetTLI(GetTLI), DataReferencedByCode(profDataReferencedByCode(M)) {}
260 const InstrProfOptions Options;
265 std::function<
const TargetLibraryInfo &(
Function &
F)> GetTLI;
267 const bool DataReferencedByCode;
269 struct PerFunctionProfileData {
270 uint32_t NumValueSites[IPVK_Last + 1] = {};
271 GlobalVariable *RegionCounters =
nullptr;
272 GlobalVariable *DataVar =
nullptr;
273 GlobalVariable *RegionBitmaps =
nullptr;
274 uint32_t NumBitmapBytes = 0;
276 PerFunctionProfileData() =
default;
278 DenseMap<GlobalVariable *, PerFunctionProfileData> ProfileDataMap;
281 DenseMap<GlobalVariable *, GlobalVariable *> VTableDataMap;
284 DenseMap<const Function *, LoadInst *> FunctionToProfileBiasMap;
285 std::vector<GlobalValue *> CompilerUsedVars;
286 std::vector<GlobalValue *> UsedVars;
287 std::vector<GlobalVariable *> ReferencedNames;
290 std::vector<GlobalVariable *> ReferencedVTables;
291 GlobalVariable *NamesVar =
nullptr;
292 size_t NamesSize = 0;
294 StructType *ProfileDataTy =
nullptr;
297 std::vector<LoadStorePair> PromotionCandidates;
299 int64_t TotalCountersPromoted = 0;
303 bool lowerIntrinsics(Function *
F);
306 void promoteCounterLoadStores(Function *
F);
309 bool isRuntimeCounterRelocationEnabled()
const;
312 bool isCounterPromotionEnabled()
const;
315 bool isSamplingEnabled()
const;
318 void computeNumValueSiteCounts(InstrProfValueProfileInst *Ins);
321 void lowerValueProfileInst(InstrProfValueProfileInst *Ins);
324 void lowerCover(InstrProfCoverInst *Inc);
328 void lowerTimestamp(InstrProfTimestampInst *TimestampInstruction);
331 void lowerIncrement(InstrProfIncrementInst *Inc);
334 void lowerCoverageData(GlobalVariable *CoverageNamesVar);
338 void lowerMCDCTestVectorBitmapUpdate(InstrProfMCDCTVBitmapUpdate *Ins);
342 GlobalVariable *getOrCreateBiasVar(StringRef VarName);
346 Value *getCounterAddress(InstrProfCntrInstBase *
I);
349 void doSampling(Instruction *
I);
355 GlobalVariable *getOrCreateRegionCounters(InstrProfCntrInstBase *Inc);
358 GlobalVariable *createRegionCounters(InstrProfCntrInstBase *Inc,
364 Value *getBitmapAddress(InstrProfMCDCTVBitmapUpdate *
I);
370 GlobalVariable *getOrCreateRegionBitmaps(InstrProfMCDCBitmapInstBase *Inc);
377 GlobalVariable *createRegionBitmaps(InstrProfMCDCBitmapInstBase *Inc,
382 void maybeSetComdat(GlobalVariable *GV, GlobalObject *GO, StringRef VarName);
385 GlobalVariable *setupProfileSection(InstrProfInstBase *Inc,
389 void createDataVariable(InstrProfCntrInstBase *Inc);
392 void getOrCreateVTableProfData(GlobalVariable *GV);
398 void emitVTableNames();
404 void emitRegistration();
408 bool emitRuntimeHook();
415 void emitInitialization();
418 StructType *getProfileDataTy();
430 PGOCounterPromoterHelper(
431 Instruction *L, Instruction *S, SSAUpdater &
SSA,
Value *Init,
436 : LoadAndStorePromoter({
L, S},
SSA), Store(S), ExitBlocks(ExitBlocks),
437 InsertPts(InsertPts), LoopToCandidates(LoopToCands), LI(LI) {
440 SSA.AddAvailableValue(PH, Init);
443 void doExtraRewritesBeforeFinalDeletion()
override {
444 for (
unsigned i = 0, e = ExitBlocks.size(); i != e; ++i) {
450 Value *LiveInValue =
SSA.GetValueInMiddleOfBlock(ExitBlock);
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);
492 DenseMap<Loop *, SmallVector<LoadStorePair, 8>> &LoopToCandidates;
499class PGOCounterPromoter {
503 Loop &CurLoop, LoopInfo &LI, BlockFrequencyInfo *BFI)
504 : LoopToCandidates(LoopToCands), L(CurLoop), LI(LI), BFI(BFI) {
508 SmallVector<BasicBlock *, 8> LoopExitBlocks;
509 SmallPtrSet<BasicBlock *, 8>
BlockSet;
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)
542 unsigned MaxProm = getMaxNumOfPromotionsInLoop(&L);
546 unsigned Promoted = 0;
547 for (
auto &Cand : LoopToCandidates[&L]) {
550 SSAUpdater
SSA(&NewPHIs);
551 Value *InitVal = ConstantInt::get(Cand.first->getType(), 0);
555 auto *BB = Cand.first->getParent();
556 auto InstrCount = BFI->getBlockProfileCount(BB);
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);
569 Promoter.run(SmallVector<Instruction *, 2>({Cand.first, Cand.second}));
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) {
586 SmallVector<BasicBlock *, 8> ExitingBlocks;
587 L.getExitingBlocks(ExitingBlocks);
589 if (ExitingBlocks.
size() == 1)
591 if (ExitingBlocks.
size() > SpeculativeCounterPromotionMaxExiting)
599 isPromotionPossible(Loop *LP,
600 const SmallVectorImpl<BasicBlock *> &LoopExitBlocks) {
618 unsigned getMaxNumOfPromotionsInLoop(Loop *LP) {
619 SmallVector<BasicBlock *, 8> LoopExitBlocks;
621 if (!isPromotionPossible(LP, LoopExitBlocks))
624 SmallVector<BasicBlock *, 8> ExitingBlocks;
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);
657 DenseMap<Loop *, SmallVector<LoadStorePair, 8>> &LoopToCandidates;
658 SmallVector<BasicBlock *, 8> ExitBlocks;
659 SmallVector<Instruction *, 8> InsertPts;
662 BlockFrequencyInfo *BFI;
665enum class ValueProfilingCallType {
683 InstrLowerer Lowerer(M, Options, GetTLI, IsCS);
684 if (!Lowerer.lower())
735 if (!isSamplingEnabled())
738 SampledInstrumentationConfig config = getSampledInstrumentationConfig();
741 return Builder.getInt16(
C);
743 return Builder.getInt32(
C);
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();
819 for (
auto *Instr : InstrProfInsts) {
822 lowerIncrement(IPIS);
834 lowerValueProfileInst(IPVP);
837 IPMP->eraseFromParent();
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)
958 computeNumValueSiteCounts(Ind);
960 if (FirstProfInst ==
nullptr &&
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 increment");
1061 Index += It->second.NumValueSites[Kind];
1064 bool IsMemOpSize = (Ind->
getValueKind()->getZExtValue() ==
1065 llvm::InstrProfValueKind::IPVK_MemOPSize);
1089 if (
auto AK = TLI->getExtAttrForI32Param(
false))
1112 if (
TT.supportsCOMDAT())
1113 Bias->
setComdat(
M.getOrInsertComdat(VarName));
1119 auto *
Counters = getOrCreateRegionCounters(
I);
1128 if (!isRuntimeCounterRelocationEnabled())
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(
1201 auto *Addr = getCounterAddress(Inc);
1207 {PtrTy, PtrTy, Int64Ty},
false);
1210 RTLIB::impl___llvm_profile_instrument_gpu),
1217 Builder.
CreateCall(Callee, {CastAddr, Uniform, StepI64});
1218 }
else if (
Options.Atomic || AtomicCounterUpdateAll ||
1227 if (isCounterPromotionEnabled())
1233void InstrLowerer::lowerCoverageData(
GlobalVariable *CoverageNamesVar) {
1238 Value *
V =
NC->stripPointerCasts();
1243 ReferencedNames.push_back(Name);
1245 NC->dropAllReferences();
1250void InstrLowerer::lowerMCDCTestVectorBitmapUpdate(
1252 auto &Ctx =
M.getContext();
1257 auto *BitmapAddr = getBitmapAddress(Update);
1267 auto *BitmapByteOffset = Builder.
CreateLShr(Temp, 0x3);
1271 auto *BitmapByteAddr =
1285 auto *Bitmap = Builder.
CreateLoad(Int8Ty, BitmapByteAddr,
"mcdc.bits");
1287 if (
Options.Atomic || AtomicCounterUpdateAll) {
1326 return (Prefix + Name).str();
1332 return (Prefix + Name).str();
1341 if (!profDataReferencedByCode(*
F->getParent()))
1345 bool HasAvailableExternallyLinkage =
F->hasAvailableExternallyLinkage();
1346 if (!
F->hasLinkOnceLinkage() && !
F->hasLocalLinkage() &&
1347 !HasAvailableExternallyLinkage)
1353 if (HasAvailableExternallyLinkage &&
1354 F->hasFnAttribute(Attribute::AlwaysInline))
1360 if (
F->hasLocalLinkage() &&
F->hasComdat())
1370 return F->hasAddressTaken() ||
F->hasLinkOnceLinkage();
1423 Fn->
getName() +
".local", Fn);
1452 if (TT.isOSBinFormatELF() || TT.isOSBinFormatCOFF() ||
1453 TT.isOSBinFormatMachO() || TT.isOSBinFormatXCOFF() ||
1454 TT.isOSBinFormatWasm())
1467 bool UseComdat = (NeedComdat ||
TT.isOSBinFormatELF());
1482 StringRef GroupName =
TT.isOSBinFormatCOFF() && DataReferencedByCode
1485 Comdat *
C =
M.getOrInsertComdat(GroupName);
1505 if (!profDataReferencedByCode(*GV->
getParent()))
1530void InstrLowerer::getOrCreateVTableProfData(
GlobalVariable *GV) {
1532 "Value profiling is not supported with lightweight instrumentation");
1543 auto It = VTableDataMap.find(GV);
1544 if (It != VTableDataMap.end() && It->second)
1552 if (
TT.isOSBinFormatXCOFF()) {
1558 Type *DataTypes[] = {
1559#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Init) LLVMType,
1561#undef INSTR_PROF_VTABLE_DATA
1568 const std::string PGOVTableName =
getPGOName(*GV);
1574#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Init) Init,
1576#undef INSTR_PROF_VTABLE_DATA
1584 Data->setVisibility(Visibility);
1588 maybeSetComdat(
Data, GV,
Data->getName());
1590 VTableDataMap[GV] =
Data;
1592 ReferencedVTables.push_back(GV);
1596 UsedVars.push_back(
Data);
1619 if (
TT.isOSBinFormatXCOFF()) {
1628 if (IPSK == IPSK_cnts) {
1632 Ptr = createRegionCounters(CntrIncrement, VarName,
Linkage);
1633 }
else if (IPSK == IPSK_bitmap) {
1638 Ptr = createRegionBitmaps(BitmapUpdate, VarName,
Linkage);
1647 Ptr->
setComdat(
M.getOrInsertComdat(VarName));
1651 maybeSetComdat(Ptr, Fn, VarName);
1671 auto &
PD = ProfileDataMap[NamePtr];
1672 if (
PD.RegionBitmaps)
1673 return PD.RegionBitmaps;
1677 auto *BitmapPtr = setupProfileSection(Inc, IPSK_bitmap);
1678 PD.RegionBitmaps = BitmapPtr;
1680 return PD.RegionBitmaps;
1687 auto &Ctx =
M.getContext();
1693 std::vector<Constant *> InitialValues(
NumCounters,
1711 auto &
PD = ProfileDataMap[NamePtr];
1712 if (
PD.RegionCounters)
1713 return PD.RegionCounters;
1717 auto *CounterPtr = setupProfileSection(Inc, IPSK_cnts);
1718 PD.RegionCounters = CounterPtr;
1725 Metadata *FunctionNameAnnotation[] = {
1733 Metadata *NumCountersAnnotation[] = {
1742 auto *DICounter =
DB.createGlobalVariableExpression(
1743 SP, CounterPtr->getName(),
StringRef(),
SP->getFile(),
1744 0,
DB.createUnspecifiedType(
"Profile Data Type"),
1745 CounterPtr->hasLocalLinkage(),
true,
nullptr,
1746 nullptr,
nullptr, 0,
1748 CounterPtr->addDebugInfo(DICounter);
1753 CompilerUsedVars.push_back(
PD.RegionCounters);
1757 createDataVariable(Inc);
1759 return PD.RegionCounters;
1769 auto &
PD = ProfileDataMap[NamePtr];
1786 if (
TT.isOSBinFormatXCOFF()) {
1795 std::string CntsVarName =
1797 std::string DataVarName =
1805 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
1806 NS +=
PD.NumValueSites[Kind];
1807 if (NS > 0 && ValueProfileStaticAlloc &&
1813 ValuesVar->setVisibility(Visibility);
1815 ValuesVar->setSection(
1817 ValuesVar->setAlignment(
Align(8));
1818 maybeSetComdat(ValuesVar, Fn, CntsVarName);
1830 auto *IntPtrTy =
M.getDataLayout().getIntPtrType(
M.getContext());
1833 auto *DataTy = getProfileDataTy();
1837 Constant *Int16ArrayVals[IPVK_Last + 1];
1838 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
1839 Int16ArrayVals[Kind] = ConstantInt::get(Int16Ty,
PD.NumValueSites[Kind]);
1862 !(DataReferencedByCode && NeedComdat && !Renamed) &&
1863 (
TT.isOSBinFormatELF() ||
1864 (!DataReferencedByCode &&
TT.isOSBinFormatCOFF()))) {
1871 if (
TT.isGPU() &&
TT.isOSBinFormatELF() &&
1879 Constant *RelativeBitmapPtr = ConstantInt::get(IntPtrTy, 0);
1884 DataSectionKind = IPSK_covdata;
1886 if (BitmapPtr !=
nullptr)
1888 }
else if (
TT.isNVPTX()) {
1892 DataSectionKind = IPSK_data;
1897 DataSectionKind = IPSK_data;
1898 RelativeCounterPtr =
1901 if (BitmapPtr !=
nullptr)
1908#define INSTR_PROF_DATA(Type, LLVMType, Name, Init) Init,
1913 Data->setVisibility(Visibility);
1918 Data->setComdat(
M.getOrInsertComdat(CntsVarName));
1921 maybeSetComdat(
Data, Fn, CntsVarName);
1927 CompilerUsedVars.push_back(
Data);
1933 ReferencedNames.push_back(NamePtr);
1936void InstrLowerer::emitVNodes() {
1937 if (!ValueProfileStaticAlloc)
1947 for (
auto &PD : ProfileDataMap) {
1948 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
1949 TotalNS +=
PD.second.NumValueSites[Kind];
1955 uint64_t
NumCounters = TotalNS * NumCountersPerValueSite;
1963#define INSTR_PROF_MIN_VAL_COUNTS 10
1967 auto &Ctx =
M.getContext();
1968 Type *VNodeTypes[] = {
1969#define INSTR_PROF_VALUE_NODE(Type, LLVMType, Name, Init) LLVMType,
1979 VNodesVar->setSection(
1981 VNodesVar->setAlignment(
M.getDataLayout().getABITypeAlign(VNodesTy));
1984 UsedVars.push_back(VNodesVar);
1991 std::string Name = (
"__llvm_profile_sections" + CUIDPostfix).str();
1992 if (M.getNamedValue(Name))
1996 unsigned AS = M.getDataLayout().getDefaultGlobalsAddressSpace();
2002 nullptr, Sym,
nullptr,
2011 Constant *Fields[] = {
Extern(
"__start___llvm_prf_names", I8,
false, Hidden),
2012 Extern(
"__stop___llvm_prf_names", I8,
false, Hidden),
2013 Extern(
"__start___llvm_prf_cnts", I8,
false, Hidden),
2014 Extern(
"__stop___llvm_prf_cnts", I8,
false, Hidden),
2015 Extern(
"__start___llvm_prf_data", I8,
false, Hidden),
2016 Extern(
"__stop___llvm_prf_data", I8,
false, Hidden),
2017 Extern(
"__llvm_profile_raw_version",
2022 StructType::get(Ctx, {PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy});
2031void InstrLowerer::emitNameData() {
2032 if (ReferencedNames.empty())
2035 std::string CompressedNameStr;
2041 auto &Ctx =
M.getContext();
2047 std::string GPUCUIDPostfix;
2052 if (
Init->isCString()) {
2053 GPUCUIDPostfix =
Init->getAsCString().str();
2054 NamesVarName += GPUCUIDPostfix;
2058 M, [GV](
Constant *
C) {
return C->stripPointerCasts() == GV; });
2064 NamesVar =
new GlobalVariable(M, NamesVal->getType(),
true, NamesLinkage,
2065 NamesVal, NamesVarName);
2066 NamesVar->setVisibility(NamesVisibility);
2068 NamesSize = CompressedNameStr.size();
2070 std::string NamesSectionName =
2074 NamesVar->setSection(NamesSectionName);
2078 NamesVar->setAlignment(
Align(1));
2081 UsedVars.push_back(NamesVar);
2083 for (
auto *NamePtr : ReferencedNames)
2089 [](
const auto &KV) { return KV.second.DataVar; });
2090 if (!GPUCUIDPostfix.empty() && HasData)
2092 CompilerUsedVars.push_back(GV);
2095void InstrLowerer::emitVTableNames() {
2100 std::string CompressedVTableNames;
2106 auto &Ctx =
M.getContext();
2108 Ctx,
StringRef(CompressedVTableNames),
false );
2117 UsedVars.push_back(VTableNamesVar);
2120void InstrLowerer::emitRegistration() {
2133 RegisterF->addFnAttr(Attribute::NoRedZone);
2136 auto *RuntimeRegisterF =
2144 IRB.CreateCall(RuntimeRegisterF,
2145 IRB.CreatePointerBitCastOrAddrSpaceCast(
Data, VoidPtrTy));
2148 IRB.CreateCall(RuntimeRegisterF,
2149 IRB.CreatePointerBitCastOrAddrSpaceCast(
Data, VoidPtrTy));
2152 Type *ParamTypes[] = {VoidPtrTy, Int64Ty};
2153 auto *NamesRegisterTy =
2155 auto *NamesRegisterF =
2158 IRB.CreateCall(NamesRegisterF, {IRB.CreatePointerBitCastOrAddrSpaceCast(
2159 NamesVar, VoidPtrTy),
2160 IRB.getInt64(NamesSize)});
2163 IRB.CreateRetVoid();
2166bool InstrLowerer::emitRuntimeHook() {
2174 if (
TT.isOSLinux() ||
TT.isOSAIX())
2188 if (
TT.isOSBinFormatELF() && !
TT.isPS()) {
2190 CompilerUsedVars.push_back(Var);
2196 User->addFnAttr(Attribute::NoInline);
2198 User->addFnAttr(Attribute::NoRedZone);
2200 if (
TT.supportsCOMDAT())
2203 User->setEntryCount(0);
2207 IRB.CreateRet(Load);
2210 CompilerUsedVars.push_back(
User);
2215void InstrLowerer::emitUses() {
2225 if (
TT.isOSBinFormatELF() ||
TT.isOSBinFormatMachO() ||
2226 (
TT.isOSBinFormatCOFF() && !DataReferencedByCode))
2237void InstrLowerer::emitInitialization() {
2254 F->addFnAttr(Attribute::NoInline);
2256 F->addFnAttr(Attribute::NoRedZone);
2260 IRB.CreateCall(RegisterF, {});
2261 IRB.CreateRetVoid();
2272 if (getSampledInstrumentationConfig().UseShort) {
2282 SamplingVar->setThreadLocal(
true);
2283 Triple TT(M.getTargetTriple());
2284 if (TT.supportsCOMDAT()) {
2286 SamplingVar->setComdat(M.getOrInsertComdat(VarName));
2295StructType *InstrLowerer::getProfileDataTy() {
2297 return ProfileDataTy;
2299 auto &Ctx =
M.getContext();
2300 auto *IntPtrTy =
M.getDataLayout().getIntPtrType(
M.getContext());
2303 Type *DataTypes[] = {
2304#define INSTR_PROF_DATA(Type, LLVMType, Name, Init) LLVMType,
2308 return ProfileDataTy;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#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.
#define INSTR_PROF_QUOTE(x)
#define INSTR_PROF_DATA_ALIGNMENT
#define INSTR_PROF_PROFILE_SET_TIMESTAMP
#define INSTR_PROF_PROFILE_SAMPLING_VAR
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 GlobalVariable * emitGPUOffloadSectionsStruct(Module &M, StringRef CUIDPostfix)
static bool needsRuntimeRegistrationOfSectionRange(const Triple &TT)
This file provides the interface for LLVM's PGO Instrumentation lowering pass.
Machine Check Debug Module
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.
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:
Class to represent array types.
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 Function * getParent() const
Return the enclosing method, or null if none.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
const Instruction & front() const
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.
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
Adds the attribute to the indicated argument.
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, bool ByteString=false)
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...
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
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.
const Function & getFunction() const
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 GlobalObject 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
static bool isLocalLinkage(LinkageTypes Linkage)
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)
static bool isWeakForLinker(LinkageTypes Linkage)
Whether the definition of this global may be replaced at link time.
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.
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
LLVM_ABI uint64_t getGlobalSize(const DataLayout &DL) const
Get the size of this global variable in bytes.
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 * CreateZExtOrTrunc(Value *V, Type *DestTy, const Twine &Name="")
Create a ZExt or Trunc from the integer value V to DestTy.
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())
IntegerType * getInt64Ty()
Fetch the type representing a 64-bit integer.
Value * CreatePointerBitCastOrAddrSpaceCast(Value *V, Type *DestTy, const Twine &Name="")
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)
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="", bool IsNUW=false, bool IsNSW=false)
PointerType * getPtrTy(unsigned AddrSpace=0)
Fetch the type representing a pointer.
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)
AtomicRMWInst * CreateAtomicRMW(AtomicRMWInst::BinOp Op, Value *Ptr, Value *Val, MaybeAlign Align, AtomicOrdering Ordering, SyncScope::ID SSID=SyncScope::System, bool Elementwise=false)
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
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.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
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
Get the string size.
Class to represent struct types.
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 * getInt64Ty(LLVMContext &C)
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
static LLVM_ABI IntegerType * getInt16Ty(LLVMContext &C)
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
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.
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.
@ BasicBlock
Various leaf nodes.
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)
DXILDebugInfoMap run(Module &M)
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
FunctionAddr NumBitmapBytes
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.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
FunctionAddr VTableAddr uintptr_t uintptr_t Int32Ty
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...
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
FunctionAddr Int16ArrayTy
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.
auto dyn_cast_or_null(const Y &Val)
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)
FunctionAddr VTableAddr Count
LLVM_ABI StringRef getPGOFuncNameVarInitializer(GlobalVariable *NameVar)
Return the initializer in string of the PGO name var NameVar.
StringRef getInstrProfBitmapBiasVarName()
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
StringRef getInstrProfValueProfMemOpFuncName()
Return the name profile runtime entry point to do memop size value profiling.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI void removeFromUsedLists(Module &M, function_ref< bool(Constant *)> ShouldRemove)
Removes global values from the llvm.used and llvm.compiler.used arrays.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
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)
ArrayRef(const T &OneElt) -> ArrayRef< T >
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
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)
StringRef getInstrProfNamesVarPostfixVarName()
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)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
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...
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 ...
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
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:
StringRef toStringRef(bool B)
Construct a string ref from a boolean.
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."))
@ Extern
Replace returns with jump to thunk, don't emit thunk.
StringRef getInstrProfVTableVarPrefix()
Return the name prefix of variables containing virtual table profile data.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
This struct is a compact representation of a valid (non-zero power of two) alignment.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl)
Get the libcall routine name for the specified libcall implementation.