71#define DEBUG_TYPE "instrprof"
79 cl::desc(
"Use debug info or binary file to correlate profiles."),
82 "No profile correlation"),
84 "Use debug info to correlate"),
86 "Use binary to correlate")));
92 "hash-based-counter-split",
93 cl::desc(
"Rename counter variable of a comdat function based on cfg hash"),
97 RuntimeCounterRelocation(
"runtime-counter-relocation",
98 cl::desc(
"Enable relocating counters at runtime."),
103 cl::desc(
"Do static counter allocation for value profiler"),
107 "vp-counters-per-site",
108 cl::desc(
"The average number of profile counters allocated "
109 "per value profiling site."),
117 "instrprof-atomic-counter-update-all",
118 cl::desc(
"Make all profile counter updates atomic (for testing only)"),
122 "verify-atomic-counter-promoted",
123 cl::desc(
"Check that all profile counter updates were made atomic; no-op "
124 "if atomic updates are not requested (-fprofile-update=atomic)"),
128 "atomic-counter-update-promoted",
129 cl::desc(
"Do counter update using atomic fetch add "
130 " for promoted counters only"),
134 "atomic-first-counter",
135 cl::desc(
"Use atomic fetch add for first counter in a function (usually "
136 "the entry counter)"),
140 "conditional-counter-update",
141 cl::desc(
"Do conditional counter updates in single byte counters mode)"),
150 cl::desc(
"Do counter register promotion"),
153 "max-counter-promotions-per-loop",
cl::init(20),
154 cl::desc(
"Max number counter promotions per loop to avoid"
155 " increasing register pressure too much"));
159 MaxNumOfPromotions(
"max-counter-promotions",
cl::init(-1),
160 cl::desc(
"Max number of allowed counter promotions"));
163 "speculative-counter-promotion-max-exiting",
cl::init(3),
164 cl::desc(
"The max number of exiting blocks of a loop to allow "
165 " speculative counter promotion"));
168 "speculative-counter-promotion-to-loop",
169 cl::desc(
"When the option is false, if the target block is in a loop, "
170 "the promotion will be disallowed unless the promoted counter "
171 " update can be further/iteratively promoted into an acyclic "
175 "iterative-counter-promotion",
cl::init(
true),
176 cl::desc(
"Allow counter promotion across the whole loop nest."));
179 "skip-ret-exit-block",
cl::init(
true),
180 cl::desc(
"Suppress counter promotion if exit blocks contain ret."));
183 cl::desc(
"Do PGO instrumentation sampling"));
186 "sampled-instr-period",
187 cl::desc(
"Set the profile instrumentation sample period. A sample period "
188 "of 0 is invalid. For each sample period, a fixed number of "
189 "consecutive samples will be recorded. The number is controlled "
190 "by 'sampled-instr-burst-duration' flag. The default sample "
191 "period of 65536 is optimized for generating efficient code that "
192 "leverages unsigned short integer wrapping in overflow, but this "
193 "is disabled under simple sampling (burst duration = 1)."),
197 "sampled-instr-burst-duration",
198 cl::desc(
"Set the profile instrumentation burst duration, which can range "
199 "from 1 to the value of 'sampled-instr-period' (0 is invalid). "
200 "This number of samples will be recorded for each "
201 "'sampled-instr-period' count update. Setting to 1 enables simple "
202 "sampling, in which case it is recommended to set "
203 "'sampled-instr-period' to a prime number."),
206struct SampledInstrumentationConfig {
207 unsigned BurstDuration;
210 bool IsSimpleSampling;
214static SampledInstrumentationConfig getSampledInstrumentationConfig() {
215 SampledInstrumentationConfig config;
216 config.BurstDuration = SampledInstrBurstDuration.getValue();
217 config.Period = SampledInstrPeriod.getValue();
218 if (config.BurstDuration > config.Period)
220 "SampledBurstDuration must be less than or equal to SampledPeriod");
221 if (config.Period == 0 || config.BurstDuration == 0)
223 "SampledPeriod and SampledBurstDuration must be greater than 0");
224 config.IsSimpleSampling = (config.BurstDuration == 1);
227 config.IsFastSampling =
228 (!config.IsSimpleSampling && config.Period == USHRT_MAX + 1);
229 config.UseShort = (config.Period <= USHRT_MAX) || config.IsFastSampling;
233using LoadStorePair = std::pair<Instruction *, Instruction *>;
237 assert(Addition && Addition->getOpcode() == Instruction::BinaryOps::Add);
238 auto *Addend = Addition->getOperand(1);
243 Store->eraseFromParent();
244 Addition->eraseFromParent();
245 Load->eraseFromParent();
258static bool enablesValueProfiling(
const Module &M) {
260 getIntModuleFlagOrZero(M,
"EnableValueProfiling") != 0;
264static bool profDataReferencedByCode(
const Module &M) {
265 return enablesValueProfiling(M);
268class InstrLowerer final {
270 InstrLowerer(
Module &M,
const InstrProfOptions &Options,
271 std::function<
const TargetLibraryInfo &(Function &
F)> GetTLI,
273 : M(M), Options(Options), TT(M.getTargetTriple()), IsCS(IsCS),
274 GetTLI(GetTLI), DataReferencedByCode(profDataReferencedByCode(M)) {}
280 const InstrProfOptions Options;
285 std::function<
const TargetLibraryInfo &(
Function &
F)> GetTLI;
287 const bool DataReferencedByCode;
289 struct PerFunctionProfileData {
290 uint32_t NumValueSites[IPVK_Last + 1] = {};
291 GlobalVariable *RegionCounters =
nullptr;
292 GlobalVariable *DataVar =
nullptr;
293 GlobalVariable *RegionBitmaps =
nullptr;
294 uint32_t NumBitmapBytes = 0;
296 PerFunctionProfileData() =
default;
298 DenseMap<GlobalVariable *, PerFunctionProfileData> ProfileDataMap;
301 DenseMap<GlobalVariable *, GlobalVariable *> VTableDataMap;
304 DenseMap<const Function *, LoadInst *> FunctionToProfileBiasMap;
305 std::vector<GlobalValue *> CompilerUsedVars;
306 std::vector<GlobalValue *> UsedVars;
307 std::vector<GlobalVariable *> ReferencedNames;
310 std::vector<GlobalVariable *> ReferencedVTables;
311 GlobalVariable *NamesVar =
nullptr;
312 size_t NamesSize = 0;
314 StructType *ProfileDataTy =
nullptr;
317 std::vector<LoadStorePair> PromotionCandidates;
319 int64_t TotalCountersPromoted = 0;
323 bool lowerIntrinsics(Function *
F);
326 void promoteCounterLoadStores(Function *
F);
329 bool isRuntimeCounterRelocationEnabled()
const;
332 bool isCounterPromotionEnabled()
const;
338 bool isSamplingEnabled()
const;
341 void computeNumValueSiteCounts(InstrProfValueProfileInst *Ins);
344 void lowerValueProfileInst(InstrProfValueProfileInst *Ins);
347 void lowerCover(InstrProfCoverInst *Inc);
351 void lowerTimestamp(InstrProfTimestampInst *TimestampInstruction);
354 void lowerIncrement(InstrProfIncrementInst *Inc);
357 void lowerCoverageData(GlobalVariable *CoverageNamesVar);
361 void lowerMCDCTestVectorBitmapUpdate(InstrProfMCDCTVBitmapUpdate *Ins);
365 GlobalVariable *getOrCreateBiasVar(StringRef VarName);
369 Value *getCounterAddress(InstrProfCntrInstBase *
I);
372 void doSampling(Instruction *
I);
378 GlobalVariable *getOrCreateRegionCounters(InstrProfCntrInstBase *Inc);
381 GlobalVariable *createRegionCounters(InstrProfCntrInstBase *Inc,
387 Value *getBitmapAddress(InstrProfMCDCTVBitmapUpdate *
I);
393 GlobalVariable *getOrCreateRegionBitmaps(InstrProfMCDCBitmapInstBase *Inc);
400 GlobalVariable *createRegionBitmaps(InstrProfMCDCBitmapInstBase *Inc,
405 void maybeSetComdat(GlobalVariable *GV, GlobalObject *GO, StringRef VarName);
408 GlobalVariable *setupProfileSection(InstrProfInstBase *Inc,
412 void createDataVariable(InstrProfCntrInstBase *Inc);
415 void getOrCreateVTableProfData(GlobalVariable *GV);
421 void emitVTableNames();
427 void emitRegistration();
431 bool emitRuntimeHook();
438 void emitInitialization();
441 StructType *getProfileDataTy();
453 PGOCounterPromoterHelper(
454 Instruction *L, Instruction *S, SSAUpdater &
SSA,
Value *Init,
458 LoopInfo &LI,
bool IsAtomic)
459 : LoadAndStorePromoter({
L, S},
SSA), Store(S), ExitBlocks(ExitBlocks),
460 InsertPts(InsertPts), LoopToCandidates(LoopToCands), LI(LI),
464 SSA.AddAvailableValue(PH, Init);
467 void doExtraRewritesBeforeFinalDeletion()
override {
468 for (
unsigned i = 0, e = ExitBlocks.size(); i != e; ++i) {
474 Value *LiveInValue =
SSA.GetValueInMiddleOfBlock(ExitBlock);
486 assert(OrigBiasInst->getOpcode() == Instruction::BinaryOps::Add);
487 Value *BiasInst = Builder.Insert(OrigBiasInst->clone());
488 Addr = Builder.CreateIntToPtr(BiasInst,
492 IterativeCounterPromotion ? LI.getLoopFor(ExitBlock) :
nullptr;
495 if ((IsAtomic && !TargetLoop) || AtomicCounterUpdatePromoted)
497 MaybeAlign(), AtomicOrdering::Monotonic);
499 LoadInst *OldVal = Builder.CreateLoad(Ty, Addr,
"pgocount.promoted");
500 auto *NewVal = Builder.CreateAdd(OldVal, LiveInValue);
501 auto *NewStore = Builder.CreateStore(NewVal, Addr);
505 LoopToCandidates[TargetLoop].emplace_back(OldVal, NewStore);
514 DenseMap<Loop *, SmallVector<LoadStorePair, 8>> &LoopToCandidates;
522class PGOCounterPromoter {
526 Loop &CurLoop, LoopInfo &LI, BlockFrequencyInfo *BFI,
bool IsAtomic)
527 : LoopToCandidates(LoopToCands), L(CurLoop), LI(LI), BFI(BFI),
532 SmallVector<BasicBlock *, 8> LoopExitBlocks;
533 SmallPtrSet<BasicBlock *, 8>
BlockSet;
535 L.getExitBlocks(LoopExitBlocks);
536 if (!isPromotionPossible(&L, LoopExitBlocks))
539 for (BasicBlock *ExitBlock : LoopExitBlocks) {
544 ExitBlocks.push_back(ExitBlock);
550 bool run(int64_t *NumPromoted) {
551 bool RC = promoteCandidates(NumPromoted);
562 for (
auto &Cand : LoopToCandidates[&L])
563 if (Cand.first !=
nullptr && Cand.second !=
nullptr)
564 makeAtomic(Cand.first, Cand.second);
569 bool promoteCandidates(int64_t *NumPromoted) {
571 if (ExitBlocks.size() == 0)
579 if (SkipRetExitBlock) {
580 for (
auto *BB : ExitBlocks)
585 unsigned MaxProm = getMaxNumOfPromotionsInLoop(&L);
589 [[maybe_unused]]
auto *Ptr = LoopToCandidates.getPointerIntoBucketsArray();
590 unsigned Promoted = 0;
591 for (
auto &Cand : LoopToCandidates[&L]) {
593 SSAUpdater
SSA(&NewPHIs);
594 Value *InitVal = ConstantInt::get(Cand.first->getType(), 0);
598 auto *BB = Cand.first->getParent();
599 auto InstrCount = BFI->getBlockProfileCount(BB);
602 auto PreheaderCount = BFI->getBlockProfileCount(L.getLoopPreheader());
605 if (PreheaderCount && (*PreheaderCount * 3) >= (*
InstrCount * 2))
609 PGOCounterPromoterHelper Promoter(
610 Cand.first, Cand.second,
SSA, InitVal, L.getLoopPreheader(),
611 ExitBlocks, InsertPts, LoopToCandidates, LI, IsAtomic);
612 Promoter.run(SmallVector<Instruction *, 2>({Cand.first, Cand.second}));
614 assert(LoopToCandidates.isPointerIntoBucketsArray(Ptr) &&
615 "References into LoopToCandidates might be invalid");
616 Cand = {
nullptr,
nullptr};
619 if (Promoted >= MaxProm)
623 if (MaxNumOfPromotions != -1 && *NumPromoted >= MaxNumOfPromotions)
627 LLVM_DEBUG(
dbgs() << Promoted <<
" counters promoted for loop (depth="
628 << L.getLoopDepth() <<
")\n");
629 return Promoted != 0;
633 bool allowSpeculativeCounterPromotion(Loop *LP) {
634 SmallVector<BasicBlock *, 8> ExitingBlocks;
635 L.getExitingBlocks(ExitingBlocks);
637 if (ExitingBlocks.
size() == 1)
639 if (ExitingBlocks.
size() > SpeculativeCounterPromotionMaxExiting)
647 isPromotionPossible(Loop *LP,
648 const SmallVectorImpl<BasicBlock *> &LoopExitBlocks) {
666 unsigned getMaxNumOfPromotionsInLoop(Loop *LP) {
667 SmallVector<BasicBlock *, 8> LoopExitBlocks;
669 if (!isPromotionPossible(LP, LoopExitBlocks))
672 SmallVector<BasicBlock *, 8> ExitingBlocks;
680 if (ExitingBlocks.
size() == 1)
681 return MaxNumOfPromotionsPerLoop;
683 if (ExitingBlocks.
size() > SpeculativeCounterPromotionMaxExiting)
687 if (SpeculativeCounterPromotionToLoop)
688 return MaxNumOfPromotionsPerLoop;
691 unsigned MaxProm = MaxNumOfPromotionsPerLoop;
692 for (
auto *TargetBlock : LoopExitBlocks) {
693 auto *TargetLoop = LI.getLoopFor(TargetBlock);
696 unsigned MaxPromForTarget = getMaxNumOfPromotionsInLoop(TargetLoop);
697 unsigned PendingCandsInTarget = LoopToCandidates[TargetLoop].size();
699 std::min(MaxProm, std::max(MaxPromForTarget, PendingCandsInTarget) -
700 PendingCandsInTarget);
705 DenseMap<Loop *, SmallVector<LoadStorePair, 8>> &LoopToCandidates;
706 SmallVector<BasicBlock *, 8> ExitBlocks;
707 SmallVector<Instruction *, 8> InsertPts;
710 BlockFrequencyInfo *BFI;
714enum class ValueProfilingCallType {
732 InstrLowerer Lowerer(M, Options, GetTLI, IsCS);
733 if (!Lowerer.lower())
784 if (!isSamplingEnabled())
787 SampledInstrumentationConfig config = getSampledInstrumentationConfig();
790 return Builder.getInt16(
C);
792 return Builder.getInt32(
C);
802 assert(SamplingVar &&
"SamplingVar not set properly");
806 Value *NewSamplingVarVal;
810 auto *LoadSamplingVar = CondBuilder.CreateLoad(SamplingVarTy, SamplingVar);
811 if (config.IsSimpleSampling) {
815 IncBuilder.CreateAdd(LoadSamplingVar, GetConstant(IncBuilder, 1));
816 SamplingVarIncr = IncBuilder.CreateStore(NewSamplingVarVal, SamplingVar);
819 auto *DurationCond = CondBuilder.CreateICmpULE(
820 LoadSamplingVar, GetConstant(CondBuilder, config.BurstDuration - 1));
821 BranchWeight = MDB.createBranchWeights(
822 config.BurstDuration, config.Period - config.BurstDuration);
824 DurationCond,
I,
false, BranchWeight);
827 IncBuilder.CreateAdd(LoadSamplingVar, GetConstant(IncBuilder, 1));
828 SamplingVarIncr = IncBuilder.CreateStore(NewSamplingVarVal, SamplingVar);
832 if (config.IsFastSampling)
838 auto *PeriodCond = PeriodCondBuilder.CreateICmpUGE(
839 NewSamplingVarVal, GetConstant(PeriodCondBuilder, config.Period));
840 BranchWeight = MDB.createBranchWeights(1, config.Period - 1);
842 &ElseTerm, BranchWeight);
845 if (config.IsSimpleSampling)
849 ResetBuilder.CreateStore(GetConstant(ResetBuilder, 0), SamplingVar);
853bool InstrLowerer::lowerIntrinsics(
Function *
F) {
854 bool MadeChange =
false;
855 PromotionCandidates.clear();
868 for (
auto *Instr : InstrProfInsts) {
871 lowerIncrement(IPIS);
883 lowerValueProfileInst(IPVP);
886 IPMP->eraseFromParent();
889 lowerMCDCTestVectorBitmapUpdate(IPBU);
897 promoteCounterLoadStores(
F);
901bool InstrLowerer::isRuntimeCounterRelocationEnabled()
const {
903 if (
TT.isOSBinFormatMachO())
906 if (RuntimeCounterRelocation.getNumOccurrences() > 0)
907 return RuntimeCounterRelocation;
910 return TT.isOSFuchsia();
913bool InstrLowerer::isSamplingEnabled()
const {
914 if (SampledInstr.getNumOccurrences() > 0)
919bool InstrLowerer::isCounterPromotionEnabled()
const {
920 if (DoCounterPromotion.getNumOccurrences() > 0)
921 return DoCounterPromotion;
922 return Options.DoCounterPromotion;
925bool InstrLowerer::isAtomic()
const {
926 return Options.Atomic || AtomicCounterUpdateAll;
931 const Value *Addr =
nullptr;
933 Addr = LI->getOperand(0);
935 Addr = LI->getOperand(1);
945void InstrLowerer::promoteCounterLoadStores(
Function *
F) {
946 if (!isCounterPromotionEnabled())
953 std::unique_ptr<BlockFrequencyInfo> BFI;
954 if (
Options.UseBFIInPromotion) {
955 std::unique_ptr<BranchProbabilityInfo> BPI;
960 for (
const auto &LoadStore : PromotionCandidates) {
967 makeAtomic(CounterLoad, CounterStore);
970 LoopPromotionCandidates[ParentLoop].emplace_back(CounterLoad, CounterStore);
978 PGOCounterPromoter Promoter(LoopPromotionCandidates, *
Loop, LI, BFI.get(),
980 Promoter.run(&TotalCountersPromoted);
983 if (
isAtomic() && VerifyAtomicPromotion)
989 if (TT.isOSFuchsia())
997 auto containsIntrinsic = [&](
int ID) {
999 return !
F->use_empty();
1002 return containsIntrinsic(Intrinsic::instrprof_cover) ||
1003 containsIntrinsic(Intrinsic::instrprof_increment) ||
1004 containsIntrinsic(Intrinsic::instrprof_increment_step) ||
1005 containsIntrinsic(Intrinsic::instrprof_timestamp) ||
1006 containsIntrinsic(Intrinsic::instrprof_value_profile);
1009bool InstrLowerer::lower() {
1010 bool MadeChange =
false;
1012 if (NeedsRuntimeHook)
1013 MadeChange = emitRuntimeHook();
1015 if (!IsCS && isSamplingEnabled())
1022 if (!ContainsProfiling && !CoverageNamesVar)
1033 computeNumValueSiteCounts(Ind);
1035 if (FirstProfInst ==
nullptr &&
1040 static_cast<void>(getOrCreateRegionBitmaps(Params));
1047 if (FirstProfInst !=
nullptr) {
1048 static_cast<void>(getOrCreateRegionCounters(FirstProfInst));
1055 if (GV.hasMetadata(LLVMContext::MD_type))
1056 getOrCreateVTableProfData(&GV);
1059 MadeChange |= lowerIntrinsics(&
F);
1061 if (CoverageNamesVar) {
1062 lowerCoverageData(CoverageNamesVar);
1077 if (!NeedsRuntimeHook && ContainsProfiling)
1082 emitInitialization();
1088 ValueProfilingCallType CallType = ValueProfilingCallType::Default) {
1093 if (
auto AK = TLI.getExtAttrForI32Param(
false))
1094 AL = AL.addParamAttribute(M.getContext(), 2, AK);
1096 assert((CallType == ValueProfilingCallType::Default ||
1097 CallType == ValueProfilingCallType::MemOp) &&
1098 "Must be Default or MemOp");
1099 Type *ParamTypes[] = {
1100#define VALUE_PROF_FUNC_PARAM(ParamType, ParamName, ParamLLVMType) ParamLLVMType
1103 auto *ValueProfilingCallTy =
1105 StringRef FuncName = CallType == ValueProfilingCallType::Default
1108 return M.getOrInsertFunction(FuncName, ValueProfilingCallTy, AL);
1115 auto &
PD = ProfileDataMap[
Name];
1117 std::max(
PD.NumValueSites[ValueKind], (uint32_t)(Index + 1));
1126 "Value profiling is not yet supported with lightweight instrumentation");
1128 auto It = ProfileDataMap.find(Name);
1129 assert(It != ProfileDataMap.end() && It->second.DataVar &&
1130 "value profiling detected in function with no counter increment");
1136 Index += It->second.NumValueSites[Kind];
1139 bool IsMemOpSize = (Ind->
getValueKind()->getZExtValue() ==
1140 llvm::InstrProfValueKind::IPVK_MemOPSize);
1164 if (
auto AK = TLI->getExtAttrForI32Param(
false))
1187 if (
TT.supportsCOMDAT())
1188 Bias->
setComdat(
M.getOrInsertComdat(VarName));
1194 auto *
Counters = getOrCreateRegionCounters(
I);
1203 if (!isRuntimeCounterRelocationEnabled())
1208 LoadInst *&BiasLI = FunctionToProfileBiasMap[Fn];
1212 BiasLI = EntryBuilder.CreateLoad(Int64Ty, Bias,
"profc_bias");
1214 BiasLI->
setMetadata(LLVMContext::MD_invariant_load,
1222 auto *Bitmaps = getOrCreateRegionBitmaps(
I);
1223 if (!isRuntimeCounterRelocationEnabled())
1231 auto *BiasLI = EntryBuilder.CreateLoad(Int64Ty, Bias,
"profbm_bias");
1233 BiasLI->
setMetadata(LLVMContext::MD_invariant_load,
1238 return Builder.
CreatePtrAdd(Bitmaps, BiasLI,
"profbm_addr");
1242 auto *Addr = getCounterAddress(CoverInstruction);
1244 if (ConditionalCounterUpdate) {
1246 auto &Ctx = CoverInstruction->
getParent()->getContext();
1260void InstrLowerer::lowerTimestamp(
1263 "timestamp probes are always the first probe for a function");
1264 auto &Ctx =
M.getContext();
1265 auto *TimestampAddr = getCounterAddress(TimestampInstruction);
1269 auto Callee =
M.getOrInsertFunction(
1276 auto *Addr = getCounterAddress(Inc);
1282 {PtrTy, PtrTy, Int64Ty},
false);
1285 RTLIB::impl___llvm_profile_instrument_gpu),
1292 Builder.
CreateCall(Callee, {CastAddr, Uniform, StepI64});
1296 else if ((!isCounterPromotionEnabled() &&
isAtomic()) ||
1305 if (isCounterPromotionEnabled())
1311void InstrLowerer::lowerCoverageData(
GlobalVariable *CoverageNamesVar) {
1316 Value *
V =
NC->stripPointerCasts();
1321 ReferencedNames.push_back(Name);
1323 NC->dropAllReferences();
1328void InstrLowerer::lowerMCDCTestVectorBitmapUpdate(
1330 auto &Ctx =
M.getContext();
1335 auto *BitmapAddr = getBitmapAddress(Update);
1345 auto *BitmapByteOffset = Builder.
CreateLShr(Temp, 0x3);
1349 auto *BitmapByteAddr =
1363 auto *Bitmap = Builder.
CreateLoad(Int8Ty, BitmapByteAddr,
"mcdc.bits");
1404 return (Prefix + Name).str();
1410 return (Prefix + Name).str();
1419 if (!profDataReferencedByCode(*
F->getParent()))
1423 bool HasAvailableExternallyLinkage =
F->hasAvailableExternallyLinkage();
1424 if (!
F->hasLinkOnceLinkage() && !
F->hasLocalLinkage() &&
1425 !HasAvailableExternallyLinkage)
1431 if (HasAvailableExternallyLinkage &&
1432 F->hasFnAttribute(Attribute::AlwaysInline))
1438 if (
F->hasLocalLinkage() &&
F->hasComdat())
1448 return F->hasAddressTaken() ||
F->hasLinkOnceLinkage();
1501 Fn->
getName() +
".local", Fn);
1530 if (TT.isOSBinFormatELF() || TT.isOSBinFormatCOFF() ||
1531 TT.isOSBinFormatMachO() || TT.isOSBinFormatXCOFF() ||
1532 TT.isOSBinFormatWasm())
1545 bool UseComdat = (NeedComdat ||
TT.isOSBinFormatELF());
1560 StringRef GroupName =
TT.isOSBinFormatCOFF() && DataReferencedByCode
1563 Comdat *
C =
M.getOrInsertComdat(GroupName);
1583 if (!profDataReferencedByCode(*GV->
getParent()))
1608void InstrLowerer::getOrCreateVTableProfData(
GlobalVariable *GV) {
1610 "Value profiling is not supported with lightweight instrumentation");
1621 auto It = VTableDataMap.find(GV);
1622 if (It != VTableDataMap.end() && It->second)
1630 if (
TT.isOSBinFormatXCOFF()) {
1636 Type *DataTypes[] = {
1637#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Init) LLVMType,
1639#undef INSTR_PROF_VTABLE_DATA
1646 const std::string PGOVTableName =
getPGOName(*GV);
1652#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Init) Init,
1654#undef INSTR_PROF_VTABLE_DATA
1662 Data->setVisibility(Visibility);
1666 maybeSetComdat(
Data, GV,
Data->getName());
1668 VTableDataMap[GV] =
Data;
1670 ReferencedVTables.push_back(GV);
1674 UsedVars.push_back(
Data);
1697 if (
TT.isOSBinFormatXCOFF()) {
1706 if (IPSK == IPSK_cnts) {
1710 Ptr = createRegionCounters(CntrIncrement, VarName,
Linkage);
1711 }
else if (IPSK == IPSK_bitmap) {
1716 Ptr = createRegionBitmaps(BitmapUpdate, VarName,
Linkage);
1725 Ptr->
setComdat(
M.getOrInsertComdat(VarName));
1729 maybeSetComdat(Ptr, Fn, VarName);
1749 auto &
PD = ProfileDataMap[NamePtr];
1750 if (
PD.RegionBitmaps)
1751 return PD.RegionBitmaps;
1755 auto *BitmapPtr = setupProfileSection(Inc, IPSK_bitmap);
1756 PD.RegionBitmaps = BitmapPtr;
1758 return PD.RegionBitmaps;
1765 auto &Ctx =
M.getContext();
1771 std::vector<Constant *> InitialValues(
NumCounters,
1789 auto &
PD = ProfileDataMap[NamePtr];
1790 if (
PD.RegionCounters)
1791 return PD.RegionCounters;
1795 auto *CounterPtr = setupProfileSection(Inc, IPSK_cnts);
1796 PD.RegionCounters = CounterPtr;
1803 Metadata *FunctionNameAnnotation[] = {
1811 Metadata *NumCountersAnnotation[] = {
1820 auto *DICounter =
DB.createGlobalVariableExpression(
1821 SP, CounterPtr->getName(),
StringRef(),
SP->getFile(),
1822 0,
DB.createUnspecifiedType(
"Profile Data Type"),
1823 CounterPtr->hasLocalLinkage(),
true,
nullptr,
1824 nullptr,
nullptr, 0,
1826 CounterPtr->addDebugInfo(DICounter);
1831 CompilerUsedVars.push_back(
PD.RegionCounters);
1835 createDataVariable(Inc);
1837 return PD.RegionCounters;
1847 auto &
PD = ProfileDataMap[NamePtr];
1864 if (
TT.isOSBinFormatXCOFF()) {
1873 std::string CntsVarName =
1875 std::string DataVarName =
1883 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
1884 NS +=
PD.NumValueSites[Kind];
1885 if (NS > 0 && ValueProfileStaticAlloc &&
1891 ValuesVar->setVisibility(Visibility);
1893 ValuesVar->setSection(
1895 ValuesVar->setAlignment(
Align(8));
1896 maybeSetComdat(ValuesVar, Fn, CntsVarName);
1908 auto *IntPtrTy =
M.getDataLayout().getIntPtrType(
M.getContext());
1911 auto *DataTy = getProfileDataTy();
1915 Constant *Int16ArrayVals[IPVK_Last + 1];
1916 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
1917 Int16ArrayVals[Kind] = ConstantInt::get(Int16Ty,
PD.NumValueSites[Kind]);
1940 !(DataReferencedByCode && NeedComdat && !Renamed) &&
1941 (
TT.isOSBinFormatELF() ||
1942 (!DataReferencedByCode &&
TT.isOSBinFormatCOFF()))) {
1949 if (
TT.isGPU() &&
TT.isOSBinFormatELF() &&
1957 Constant *RelativeBitmapPtr = ConstantInt::get(IntPtrTy, 0);
1962 DataSectionKind = IPSK_covdata;
1964 if (BitmapPtr !=
nullptr)
1966 }
else if (
TT.isNVPTX()) {
1970 DataSectionKind = IPSK_data;
1975 DataSectionKind = IPSK_data;
1976 RelativeCounterPtr =
1979 if (BitmapPtr !=
nullptr)
1986#define INSTR_PROF_DATA(Type, LLVMType, Name, Init) Init,
1991 Data->setVisibility(Visibility);
1996 Data->setComdat(
M.getOrInsertComdat(CntsVarName));
1999 maybeSetComdat(
Data, Fn, CntsVarName);
2005 CompilerUsedVars.push_back(
Data);
2011 ReferencedNames.push_back(NamePtr);
2014void InstrLowerer::emitVNodes() {
2015 if (!ValueProfileStaticAlloc)
2025 for (
auto &PD : ProfileDataMap) {
2026 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
2027 TotalNS +=
PD.second.NumValueSites[Kind];
2033 uint64_t
NumCounters = TotalNS * NumCountersPerValueSite;
2041#define INSTR_PROF_MIN_VAL_COUNTS 10
2045 auto &Ctx =
M.getContext();
2046 Type *VNodeTypes[] = {
2047#define INSTR_PROF_VALUE_NODE(Type, LLVMType, Name, Init) LLVMType,
2057 VNodesVar->setSection(
2059 VNodesVar->setAlignment(
M.getDataLayout().getABITypeAlign(VNodesTy));
2062 UsedVars.push_back(VNodesVar);
2069 std::string Name = (
"__llvm_profile_sections" + CUIDPostfix).str();
2070 if (M.getNamedValue(Name))
2074 unsigned AS = M.getDataLayout().getDefaultGlobalsAddressSpace();
2080 nullptr, Sym,
nullptr,
2089 Constant *Fields[] = {
Extern(
"__start___llvm_prf_names", I8,
false, Hidden),
2090 Extern(
"__stop___llvm_prf_names", I8,
false, Hidden),
2091 Extern(
"__start___llvm_prf_cnts", I8,
false, Hidden),
2092 Extern(
"__stop___llvm_prf_cnts", I8,
false, Hidden),
2093 Extern(
"__start___llvm_prf_data", I8,
false, Hidden),
2094 Extern(
"__stop___llvm_prf_data", I8,
false, Hidden),
2095 Extern(
"__llvm_profile_raw_version",
2100 StructType::get(Ctx, {PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy});
2109void InstrLowerer::emitNameData() {
2110 if (ReferencedNames.empty())
2113 std::string CompressedNameStr;
2119 auto &Ctx =
M.getContext();
2125 std::string GPUCUIDPostfix;
2130 if (
Init->isCString()) {
2131 GPUCUIDPostfix =
Init->getAsCString().str();
2132 NamesVarName += GPUCUIDPostfix;
2136 M, [GV](
Constant *
C) {
return C->stripPointerCasts() == GV; });
2142 NamesVar =
new GlobalVariable(M, NamesVal->getType(),
true, NamesLinkage,
2143 NamesVal, NamesVarName);
2144 NamesVar->setVisibility(NamesVisibility);
2146 NamesSize = CompressedNameStr.size();
2148 std::string NamesSectionName =
2152 NamesVar->setSection(NamesSectionName);
2156 NamesVar->setAlignment(
Align(1));
2159 UsedVars.push_back(NamesVar);
2161 for (
auto *NamePtr : ReferencedNames)
2167 [](
const auto &KV) { return KV.second.DataVar; });
2168 if (!GPUCUIDPostfix.empty() && HasData)
2170 CompilerUsedVars.push_back(GV);
2173void InstrLowerer::emitVTableNames() {
2178 std::string CompressedVTableNames;
2184 auto &Ctx =
M.getContext();
2186 Ctx,
StringRef(CompressedVTableNames),
false );
2195 UsedVars.push_back(VTableNamesVar);
2198void InstrLowerer::emitRegistration() {
2211 RegisterF->addFnAttr(Attribute::NoRedZone);
2214 auto *RuntimeRegisterF =
2222 IRB.CreateCall(RuntimeRegisterF,
2223 IRB.CreatePointerBitCastOrAddrSpaceCast(
Data, VoidPtrTy));
2226 IRB.CreateCall(RuntimeRegisterF,
2227 IRB.CreatePointerBitCastOrAddrSpaceCast(
Data, VoidPtrTy));
2230 Type *ParamTypes[] = {VoidPtrTy, Int64Ty};
2231 auto *NamesRegisterTy =
2233 auto *NamesRegisterF =
2236 IRB.CreateCall(NamesRegisterF, {IRB.CreatePointerBitCastOrAddrSpaceCast(
2237 NamesVar, VoidPtrTy),
2238 IRB.getInt64(NamesSize)});
2241 IRB.CreateRetVoid();
2244bool InstrLowerer::emitRuntimeHook() {
2252 if (
TT.isOSLinux() ||
TT.isOSAIX())
2266 if (
TT.isOSBinFormatELF() && !
TT.isPS()) {
2268 CompilerUsedVars.push_back(Var);
2274 User->addFnAttr(Attribute::NoInline);
2276 User->addFnAttr(Attribute::NoRedZone);
2278 if (
TT.supportsCOMDAT())
2281 User->setEntryCount(0);
2285 IRB.CreateRet(Load);
2288 CompilerUsedVars.push_back(
User);
2293void InstrLowerer::emitUses() {
2303 if (
TT.isOSBinFormatELF() ||
TT.isOSBinFormatMachO() ||
2304 (
TT.isOSBinFormatCOFF() && !DataReferencedByCode))
2315void InstrLowerer::emitInitialization() {
2332 F->addFnAttr(Attribute::NoInline);
2334 F->addFnAttr(Attribute::NoRedZone);
2338 IRB.CreateCall(RegisterF, {});
2339 IRB.CreateRetVoid();
2350 if (getSampledInstrumentationConfig().UseShort) {
2360 SamplingVar->setThreadLocal(
true);
2361 Triple TT(M.getTargetTriple());
2362 if (TT.supportsCOMDAT()) {
2364 SamplingVar->setComdat(M.getOrInsertComdat(VarName));
2373StructType *InstrLowerer::getProfileDataTy() {
2375 return ProfileDataTy;
2377 auto &Ctx =
M.getContext();
2378 auto *IntPtrTy =
M.getDataLayout().getIntPtrType(
M.getContext());
2381 Type *DataTypes[] = {
2382#define INSTR_PROF_DATA(Type, LLVMType, Name, Init) LLVMType,
2386 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 void doAtomicCheck(Function *F)
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
SmallPtrSet< BasicBlock *, 0 > 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.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
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 const Value * stripInBoundsOffsets(function_ref< void(const Value *)> Func=[](const Value *) {}) const
Strip off pointer casts and inbounds GEPs.
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.
constexpr bool isAtomic(const T &...O)
@ 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.
inst_range instructions(Function *F)
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.