72#define DEBUG_TYPE "instrprof"
80 cl::desc(
"Use debug info or binary file to correlate profiles."),
83 "No profile correlation"),
85 "Use debug info to correlate"),
87 "Use binary to correlate")));
93 "hash-based-counter-split",
94 cl::desc(
"Rename counter variable of a comdat function based on cfg hash"),
98 RuntimeCounterRelocation(
"runtime-counter-relocation",
99 cl::desc(
"Enable relocating counters at runtime."),
104 cl::desc(
"Do static counter allocation for value profiler"),
108 "vp-counters-per-site",
109 cl::desc(
"The average number of profile counters allocated "
110 "per value profiling site."),
118 "instrprof-atomic-counter-update-all",
119 cl::desc(
"Make all profile counter updates atomic (for testing only)"),
123 "verify-atomic-counter-promoted",
124 cl::desc(
"Check that all profile counter updates were made atomic; no-op "
125 "if atomic updates are not requested (-fprofile-update=atomic)"),
129 "atomic-counter-update-promoted",
130 cl::desc(
"Do counter update using atomic fetch add "
131 " for promoted counters only"),
135 "atomic-first-counter",
136 cl::desc(
"Use atomic fetch add for first counter in a function (usually "
137 "the entry counter)"),
141 "conditional-counter-update",
142 cl::desc(
"Do conditional counter updates in single byte counters mode)"),
151 cl::desc(
"Do counter register promotion"),
154 "max-counter-promotions-per-loop",
cl::init(20),
155 cl::desc(
"Max number counter promotions per loop to avoid"
156 " increasing register pressure too much"));
160 MaxNumOfPromotions(
"max-counter-promotions",
cl::init(-1),
161 cl::desc(
"Max number of allowed counter promotions"));
164 "speculative-counter-promotion-max-exiting",
cl::init(3),
165 cl::desc(
"The max number of exiting blocks of a loop to allow "
166 " speculative counter promotion"));
169 "speculative-counter-promotion-to-loop",
170 cl::desc(
"When the option is false, if the target block is in a loop, "
171 "the promotion will be disallowed unless the promoted counter "
172 " update can be further/iteratively promoted into an acyclic "
176 "offload-pgo-sampling",
177 cl::desc(
"Log2 of the sampling period for offload PGO instrumentation. "
178 "Only 1 in every 2^N blocks is instrumented. "
179 "0 = all blocks, 1 = 50%, 2 = 25%, 3 = 12.5% (default). "
180 "Higher values reduce overhead at the cost of sparser profiles."),
184 "iterative-counter-promotion",
cl::init(
true),
185 cl::desc(
"Allow counter promotion across the whole loop nest."));
188 "skip-ret-exit-block",
cl::init(
true),
189 cl::desc(
"Suppress counter promotion if exit blocks contain ret."));
192 cl::desc(
"Do PGO instrumentation sampling"));
195 "sampled-instr-period",
196 cl::desc(
"Set the profile instrumentation sample period. A sample period "
197 "of 0 is invalid. For each sample period, a fixed number of "
198 "consecutive samples will be recorded. The number is controlled "
199 "by 'sampled-instr-burst-duration' flag. The default sample "
200 "period of 65536 is optimized for generating efficient code that "
201 "leverages unsigned short integer wrapping in overflow, but this "
202 "is disabled under simple sampling (burst duration = 1)."),
206 "sampled-instr-burst-duration",
207 cl::desc(
"Set the profile instrumentation burst duration, which can range "
208 "from 1 to the value of 'sampled-instr-period' (0 is invalid). "
209 "This number of samples will be recorded for each "
210 "'sampled-instr-period' count update. Setting to 1 enables simple "
211 "sampling, in which case it is recommended to set "
212 "'sampled-instr-period' to a prime number."),
215struct SampledInstrumentationConfig {
216 unsigned BurstDuration;
219 bool IsSimpleSampling;
223static SampledInstrumentationConfig getSampledInstrumentationConfig() {
224 SampledInstrumentationConfig config;
225 config.BurstDuration = SampledInstrBurstDuration.getValue();
226 config.Period = SampledInstrPeriod.getValue();
227 if (config.BurstDuration > config.Period)
229 "SampledBurstDuration must be less than or equal to SampledPeriod");
230 if (config.Period == 0 || config.BurstDuration == 0)
232 "SampledPeriod and SampledBurstDuration must be greater than 0");
233 config.IsSimpleSampling = (config.BurstDuration == 1);
236 config.IsFastSampling =
237 (!config.IsSimpleSampling && config.Period == USHRT_MAX + 1);
238 config.UseShort = (config.Period <= USHRT_MAX) || config.IsFastSampling;
242using LoadStorePair = std::pair<Instruction *, Instruction *>;
246 assert(Addition && Addition->getOpcode() == Instruction::BinaryOps::Add);
247 auto *Addend = Addition->getOperand(1);
252 Store->eraseFromParent();
253 Addition->eraseFromParent();
254 Load->eraseFromParent();
267static bool enablesValueProfiling(
const Module &M) {
269 getIntModuleFlagOrZero(M,
"EnableValueProfiling") != 0;
273static bool profDataReferencedByCode(
const Module &M) {
274 return enablesValueProfiling(M);
277class InstrLowerer final {
279 InstrLowerer(
Module &M,
const InstrProfOptions &Options,
280 std::function<
const TargetLibraryInfo &(Function &
F)> GetTLI,
282 : M(M), Options(Options), TT(M.getTargetTriple()), IsCS(IsCS),
283 GetTLI(GetTLI), DataReferencedByCode(profDataReferencedByCode(M)) {}
289 const InstrProfOptions Options;
294 std::function<
const TargetLibraryInfo &(
Function &
F)> GetTLI;
296 const bool DataReferencedByCode;
298 struct PerFunctionProfileData {
299 uint32_t NumValueSites[IPVK_Last + 1] = {};
300 GlobalVariable *RegionCounters =
nullptr;
301 GlobalVariable *UniformCounters =
303 GlobalVariable *DataVar =
nullptr;
304 GlobalVariable *RegionBitmaps =
nullptr;
305 uint32_t NumBitmapBytes = 0;
307 PerFunctionProfileData() =
default;
309 DenseMap<GlobalVariable *, PerFunctionProfileData> ProfileDataMap;
312 DenseMap<GlobalVariable *, GlobalVariable *> VTableDataMap;
315 DenseMap<const Function *, LoadInst *> FunctionToProfileBiasMap;
316 std::vector<GlobalValue *> CompilerUsedVars;
317 std::vector<GlobalValue *> UsedVars;
318 std::vector<GlobalVariable *> ReferencedNames;
321 std::vector<GlobalVariable *> ReferencedVTables;
322 GlobalVariable *NamesVar =
nullptr;
323 size_t NamesSize = 0;
325 StructType *ProfileDataTy =
nullptr;
328 std::vector<LoadStorePair> PromotionCandidates;
330 int64_t TotalCountersPromoted = 0;
335 struct GPUPGOInvariants {
336 Value *Matched =
nullptr;
337 bool WaveSizeStored =
false;
339 DenseMap<Function *, GPUPGOInvariants> GPUInvariantsCache;
342 GPUPGOInvariants &getOrCreateGPUInvariants(Function *
F);
346 bool lowerIntrinsics(Function *
F);
349 void promoteCounterLoadStores(Function *
F);
352 bool isRuntimeCounterRelocationEnabled()
const;
355 bool isCounterPromotionEnabled()
const;
361 bool isSamplingEnabled()
const;
364 void computeNumValueSiteCounts(InstrProfValueProfileInst *Ins);
367 void lowerValueProfileInst(InstrProfValueProfileInst *Ins);
370 void lowerCover(InstrProfCoverInst *Inc);
374 void lowerTimestamp(InstrProfTimestampInst *TimestampInstruction);
377 void lowerIncrement(InstrProfIncrementInst *Inc);
380 void lowerCoverageData(GlobalVariable *CoverageNamesVar);
384 void lowerMCDCTestVectorBitmapUpdate(InstrProfMCDCTVBitmapUpdate *Ins);
388 GlobalVariable *getOrCreateBiasVar(StringRef VarName);
392 Value *getCounterAddress(InstrProfCntrInstBase *
I);
395 void doSampling(Instruction *
I);
401 GlobalVariable *getOrCreateRegionCounters(InstrProfCntrInstBase *Inc);
405 GlobalVariable *getOrCreateUniformCounters(InstrProfCntrInstBase *Inc);
408 GlobalVariable *createRegionCounters(InstrProfCntrInstBase *Inc,
414 Value *getBitmapAddress(InstrProfMCDCTVBitmapUpdate *
I);
420 GlobalVariable *getOrCreateRegionBitmaps(InstrProfMCDCBitmapInstBase *Inc);
427 GlobalVariable *createRegionBitmaps(InstrProfMCDCBitmapInstBase *Inc,
432 void maybeSetComdat(GlobalVariable *GV, GlobalObject *GO, StringRef VarName);
435 GlobalVariable *setupProfileSection(InstrProfInstBase *Inc,
439 void createDataVariable(InstrProfCntrInstBase *Inc);
442 void getOrCreateVTableProfData(GlobalVariable *GV);
448 void emitVTableNames();
454 void emitRegistration();
458 bool emitRuntimeHook();
465 void emitInitialization();
468 StructType *getProfileDataTy();
480 PGOCounterPromoterHelper(
481 Instruction *L, Instruction *S, SSAUpdater &
SSA,
Value *Init,
485 LoopInfo &LI,
bool IsAtomic)
486 : LoadAndStorePromoter({
L, S},
SSA),
Store(S), ExitBlocks(ExitBlocks),
487 InsertPts(InsertPts), LoopToCandidates(LoopToCands), LI(LI),
491 SSA.AddAvailableValue(PH, Init);
494 void doExtraRewritesBeforeFinalDeletion()
override {
495 for (
unsigned i = 0, e = ExitBlocks.size(); i != e; ++i) {
501 Value *LiveInValue =
SSA.GetValueInMiddleOfBlock(ExitBlock);
513 assert(OrigBiasInst->getOpcode() == Instruction::BinaryOps::Add);
514 Value *BiasInst = Builder.Insert(OrigBiasInst->clone());
515 Addr = Builder.CreateIntToPtr(BiasInst,
519 IterativeCounterPromotion ? LI.getLoopFor(ExitBlock) :
nullptr;
522 if ((IsAtomic && !TargetLoop) || AtomicCounterUpdatePromoted)
524 MaybeAlign(), AtomicOrdering::Monotonic);
526 LoadInst *OldVal = Builder.CreateLoad(Ty, Addr,
"pgocount.promoted");
527 auto *NewVal = Builder.CreateAdd(OldVal, LiveInValue);
528 auto *NewStore = Builder.CreateStore(NewVal, Addr);
532 LoopToCandidates[TargetLoop].emplace_back(OldVal, NewStore);
541 DenseMap<Loop *, SmallVector<LoadStorePair, 8>> &LoopToCandidates;
549class PGOCounterPromoter {
553 Loop &CurLoop, LoopInfo &LI, BlockFrequencyInfo *BFI,
bool IsAtomic)
554 : LoopToCandidates(LoopToCands), L(CurLoop), LI(LI), BFI(BFI),
559 SmallVector<BasicBlock *, 8> LoopExitBlocks;
560 SmallPtrSet<BasicBlock *, 8>
BlockSet;
562 L.getExitBlocks(LoopExitBlocks);
563 if (!isPromotionPossible(&L, LoopExitBlocks))
566 for (BasicBlock *ExitBlock : LoopExitBlocks) {
571 ExitBlocks.push_back(ExitBlock);
577 bool run(int64_t *NumPromoted) {
578 bool RC = promoteCandidates(NumPromoted);
589 for (
auto &Cand : LoopToCandidates[&L])
590 if (Cand.first !=
nullptr && Cand.second !=
nullptr)
591 makeAtomic(Cand.first, Cand.second);
596 bool promoteCandidates(int64_t *NumPromoted) {
598 if (ExitBlocks.size() == 0)
606 if (SkipRetExitBlock) {
607 for (
auto *BB : ExitBlocks)
612 unsigned MaxProm = getMaxNumOfPromotionsInLoop(&L);
616 [[maybe_unused]]
auto *Ptr = LoopToCandidates.getPointerIntoBucketsArray();
617 unsigned Promoted = 0;
618 for (
auto &Cand : LoopToCandidates[&L]) {
620 SSAUpdater
SSA(&NewPHIs);
621 Value *InitVal = ConstantInt::get(Cand.first->getType(), 0);
625 auto *BB = Cand.first->getParent();
626 auto InstrCount = BFI->getBlockProfileCount(BB);
629 auto PreheaderCount = BFI->getBlockProfileCount(L.getLoopPreheader());
632 if (PreheaderCount && (*PreheaderCount * 3) >= (*
InstrCount * 2))
636 PGOCounterPromoterHelper Promoter(
637 Cand.first, Cand.second,
SSA, InitVal, L.getLoopPreheader(),
638 ExitBlocks, InsertPts, LoopToCandidates, LI, IsAtomic);
639 Promoter.run(SmallVector<Instruction *, 2>({Cand.first, Cand.second}));
641 assert(LoopToCandidates.isPointerIntoBucketsArray(Ptr) &&
642 "References into LoopToCandidates might be invalid");
643 Cand = {
nullptr,
nullptr};
646 if (Promoted >= MaxProm)
650 if (MaxNumOfPromotions != -1 && *NumPromoted >= MaxNumOfPromotions)
654 LLVM_DEBUG(
dbgs() << Promoted <<
" counters promoted for loop (depth="
655 << L.getLoopDepth() <<
")\n");
656 return Promoted != 0;
660 bool allowSpeculativeCounterPromotion(Loop *LP) {
661 SmallVector<BasicBlock *, 8> ExitingBlocks;
662 L.getExitingBlocks(ExitingBlocks);
664 if (ExitingBlocks.
size() == 1)
666 if (ExitingBlocks.
size() > SpeculativeCounterPromotionMaxExiting)
674 isPromotionPossible(Loop *LP,
675 const SmallVectorImpl<BasicBlock *> &LoopExitBlocks) {
693 unsigned getMaxNumOfPromotionsInLoop(Loop *LP) {
694 SmallVector<BasicBlock *, 8> LoopExitBlocks;
696 if (!isPromotionPossible(LP, LoopExitBlocks))
699 SmallVector<BasicBlock *, 8> ExitingBlocks;
707 if (ExitingBlocks.
size() == 1)
708 return MaxNumOfPromotionsPerLoop;
710 if (ExitingBlocks.
size() > SpeculativeCounterPromotionMaxExiting)
714 if (SpeculativeCounterPromotionToLoop)
715 return MaxNumOfPromotionsPerLoop;
718 unsigned MaxProm = MaxNumOfPromotionsPerLoop;
719 for (
auto *TargetBlock : LoopExitBlocks) {
720 auto *TargetLoop = LI.getLoopFor(TargetBlock);
723 unsigned MaxPromForTarget = getMaxNumOfPromotionsInLoop(TargetLoop);
724 unsigned PendingCandsInTarget = LoopToCandidates[TargetLoop].size();
726 std::min(MaxProm, std::max(MaxPromForTarget, PendingCandsInTarget) -
727 PendingCandsInTarget);
732 DenseMap<Loop *, SmallVector<LoadStorePair, 8>> &LoopToCandidates;
733 SmallVector<BasicBlock *, 8> ExitBlocks;
734 SmallVector<Instruction *, 8> InsertPts;
737 BlockFrequencyInfo *BFI;
741enum class ValueProfilingCallType {
759 InstrLowerer Lowerer(M, Options, GetTLI, IsCS);
760 if (!Lowerer.lower())
811 if (!isSamplingEnabled())
814 SampledInstrumentationConfig config = getSampledInstrumentationConfig();
817 return Builder.getInt16(
C);
819 return Builder.getInt32(
C);
829 assert(SamplingVar &&
"SamplingVar not set properly");
833 Value *NewSamplingVarVal;
837 auto *LoadSamplingVar = CondBuilder.CreateLoad(SamplingVarTy, SamplingVar);
838 if (config.IsSimpleSampling) {
842 IncBuilder.CreateAdd(LoadSamplingVar, GetConstant(IncBuilder, 1));
843 SamplingVarIncr = IncBuilder.CreateStore(NewSamplingVarVal, SamplingVar);
846 auto *DurationCond = CondBuilder.CreateICmpULE(
847 LoadSamplingVar, GetConstant(CondBuilder, config.BurstDuration - 1));
848 BranchWeight = MDB.createBranchWeights(
849 config.BurstDuration, config.Period - config.BurstDuration);
851 DurationCond,
I,
false, BranchWeight);
854 IncBuilder.CreateAdd(LoadSamplingVar, GetConstant(IncBuilder, 1));
855 SamplingVarIncr = IncBuilder.CreateStore(NewSamplingVarVal, SamplingVar);
859 if (config.IsFastSampling)
865 auto *PeriodCond = PeriodCondBuilder.CreateICmpUGE(
866 NewSamplingVarVal, GetConstant(PeriodCondBuilder, config.Period));
867 BranchWeight = MDB.createBranchWeights(1, config.Period - 1);
869 &ElseTerm, BranchWeight);
872 if (config.IsSimpleSampling)
876 ResetBuilder.CreateStore(GetConstant(ResetBuilder, 0), SamplingVar);
880bool InstrLowerer::lowerIntrinsics(
Function *
F) {
881 bool MadeChange =
false;
882 PromotionCandidates.clear();
895 for (
auto *Instr : InstrProfInsts) {
898 lowerIncrement(IPIS);
910 lowerValueProfileInst(IPVP);
913 IPMP->eraseFromParent();
916 lowerMCDCTestVectorBitmapUpdate(IPBU);
924 promoteCounterLoadStores(
F);
928bool InstrLowerer::isRuntimeCounterRelocationEnabled()
const {
930 if (
TT.isOSBinFormatMachO())
933 if (RuntimeCounterRelocation.getNumOccurrences() > 0)
934 return RuntimeCounterRelocation;
937 return TT.isOSFuchsia();
940bool InstrLowerer::isSamplingEnabled()
const {
941 if (SampledInstr.getNumOccurrences() > 0)
946bool InstrLowerer::isCounterPromotionEnabled()
const {
947 if (DoCounterPromotion.getNumOccurrences() > 0)
948 return DoCounterPromotion;
949 return Options.DoCounterPromotion;
952bool InstrLowerer::isAtomic()
const {
953 return Options.Atomic || AtomicCounterUpdateAll;
958 const Value *Addr =
nullptr;
960 Addr = LI->getOperand(0);
962 Addr = LI->getOperand(1);
972void InstrLowerer::promoteCounterLoadStores(
Function *
F) {
973 if (!isCounterPromotionEnabled())
982 std::unique_ptr<BlockFrequencyInfo> BFI;
983 if (
Options.UseBFIInPromotion) {
984 std::unique_ptr<BranchProbabilityInfo> BPI;
989 for (
const auto &LoadStore : PromotionCandidates) {
996 makeAtomic(CounterLoad, CounterStore);
999 LoopPromotionCandidates[ParentLoop].emplace_back(CounterLoad, CounterStore);
1007 PGOCounterPromoter Promoter(LoopPromotionCandidates, *
Loop, LI, BFI.get(),
1009 Promoter.run(&TotalCountersPromoted);
1012 if (
isAtomic() && VerifyAtomicPromotion)
1018 if (TT.isOSFuchsia())
1026 auto containsIntrinsic = [&](
int ID) {
1028 return !
F->use_empty();
1031 return containsIntrinsic(Intrinsic::instrprof_cover) ||
1032 containsIntrinsic(Intrinsic::instrprof_increment) ||
1033 containsIntrinsic(Intrinsic::instrprof_increment_step) ||
1034 containsIntrinsic(Intrinsic::instrprof_timestamp) ||
1035 containsIntrinsic(Intrinsic::instrprof_value_profile);
1038bool InstrLowerer::lower() {
1039 bool MadeChange =
false;
1041 if (NeedsRuntimeHook)
1042 MadeChange = emitRuntimeHook();
1044 if (!IsCS && isSamplingEnabled())
1051 if (!ContainsProfiling && !CoverageNamesVar)
1062 computeNumValueSiteCounts(Ind);
1064 if (FirstProfInst ==
nullptr &&
1069 static_cast<void>(getOrCreateRegionBitmaps(Params));
1076 if (FirstProfInst !=
nullptr) {
1077 static_cast<void>(getOrCreateRegionCounters(FirstProfInst));
1084 if (GV.hasMetadata(LLVMContext::MD_type))
1085 getOrCreateVTableProfData(&GV);
1088 MadeChange |= lowerIntrinsics(&
F);
1090 if (CoverageNamesVar) {
1091 lowerCoverageData(CoverageNamesVar);
1106 if (!NeedsRuntimeHook && ContainsProfiling)
1111 emitInitialization();
1117 ValueProfilingCallType CallType = ValueProfilingCallType::Default) {
1122 if (
auto AK = TLI.getExtAttrForI32Param(
false))
1123 AL = AL.addParamAttribute(M.getContext(), 2, AK);
1125 assert((CallType == ValueProfilingCallType::Default ||
1126 CallType == ValueProfilingCallType::MemOp) &&
1127 "Must be Default or MemOp");
1128 Type *ParamTypes[] = {
1129#define VALUE_PROF_FUNC_PARAM(ParamType, ParamName, ParamLLVMType) ParamLLVMType
1132 auto *ValueProfilingCallTy =
1134 StringRef FuncName = CallType == ValueProfilingCallType::Default
1137 return M.getOrInsertFunction(FuncName, ValueProfilingCallTy, AL);
1144 auto &
PD = ProfileDataMap[
Name];
1146 std::max(
PD.NumValueSites[ValueKind], (uint32_t)(Index + 1));
1155 "Value profiling is not yet supported with lightweight instrumentation");
1157 auto It = ProfileDataMap.find(Name);
1158 assert(It != ProfileDataMap.end() && It->second.DataVar &&
1159 "value profiling detected in function with no counter increment");
1165 Index += It->second.NumValueSites[Kind];
1168 bool IsMemOpSize = (Ind->
getValueKind()->getZExtValue() ==
1169 llvm::InstrProfValueKind::IPVK_MemOPSize);
1193 if (
auto AK = TLI->getExtAttrForI32Param(
false))
1216 if (
TT.supportsCOMDAT())
1217 Bias->
setComdat(
M.getOrInsertComdat(VarName));
1223 auto *
Counters = getOrCreateRegionCounters(
I);
1232 if (!isRuntimeCounterRelocationEnabled())
1237 LoadInst *&BiasLI = FunctionToProfileBiasMap[Fn];
1241 BiasLI = EntryBuilder.CreateLoad(Int64Ty, Bias,
"profc_bias");
1243 BiasLI->
setMetadata(LLVMContext::MD_invariant_load,
1251 auto *Bitmaps = getOrCreateRegionBitmaps(
I);
1252 if (!isRuntimeCounterRelocationEnabled())
1260 auto *BiasLI = EntryBuilder.CreateLoad(Int64Ty, Bias,
"profbm_bias");
1262 BiasLI->
setMetadata(LLVMContext::MD_invariant_load,
1267 return Builder.
CreatePtrAdd(Bitmaps, BiasLI,
"profbm_addr");
1271 auto *Addr = getCounterAddress(CoverInstruction);
1273 if (ConditionalCounterUpdate) {
1275 auto &Ctx = CoverInstruction->
getParent()->getContext();
1289void InstrLowerer::lowerTimestamp(
1292 "timestamp probes are always the first probe for a function");
1293 auto &Ctx =
M.getContext();
1294 auto *TimestampAddr = getCounterAddress(TimestampInstruction);
1298 auto Callee =
M.getOrInsertFunction(
1304InstrLowerer::GPUPGOInvariants &
1305InstrLowerer::getOrCreateGPUInvariants(
Function *
F) {
1306 auto It = GPUInvariantsCache.find(
F);
1307 if (It != GPUInvariantsCache.end())
1317 if (OffloadPGOSampling > 0) {
1320 RTLIB::impl___llvm_profile_sampling_gpu),
1323 IsSampledFn, {ConstantInt::get(Int32Ty, OffloadPGOSampling)},
1325 Matched = Builder.
CreateICmpNE(SampledInt, ConstantInt::get(Int32Ty, 0),
1329 auto &Inv = GPUInvariantsCache[
F];
1330 Inv.Matched = Matched;
1338 auto &Inv = getOrCreateGPUInvariants(
F);
1344 auto *Addr = getCounterAddress(Inc);
1349 if (!Inv.WaveSizeStored) {
1350 Inv.WaveSizeStored =
true;
1352 auto &
PD = ProfileDataMap[NamePtr];
1354 IRBuilder<> EntryBuilder(&*
F->getEntryBlock().getFirstInsertionPt());
1355 Value *WaveSize16 =
nullptr;
1359 if (
TT.isAMDGPU()) {
1365 Value *WaveSize = EntryBuilder.CreateCall(WaveSizeFn);
1366 WaveSize16 = EntryBuilder.CreateTrunc(
1372 Value *WaveSizeAddr = EntryBuilder.CreateStructGEP(
1373 PD.DataVar->getValueType(),
PD.DataVar, 9,
"profd.wavesize");
1374 EntryBuilder.CreateStore(WaveSize16, WaveSizeAddr);
1378 GlobalVariable *UniformCounters = getOrCreateUniformCounters(Inc);
1380 if (UniformCounters) {
1383 UniformCounters->
getValueType(), UniformCounters, UniformIndices,
1393 {PtrTy, PtrTy, Int64Ty},
false);
1396 RTLIB::impl___llvm_profile_instrument_gpu),
1399 if (OffloadPGOSampling > 0) {
1407 HeadBuilder.CreateCondBr(Inv.Matched, ThenBB, ContBB);
1410 ThenBuilder.CreateCall(Callee, {CastAddr, UniformAddrArg, StepI64});
1411 ThenBuilder.CreateBr(ContBB);
1413 Builder.
CreateCall(Callee, {CastAddr, UniformAddrArg, StepI64});
1419 auto *Addr = getCounterAddress(Inc);
1422 if ((!isCounterPromotionEnabled() &&
isAtomic()) ||
1431 if (isCounterPromotionEnabled())
1437void InstrLowerer::lowerCoverageData(
GlobalVariable *CoverageNamesVar) {
1442 Value *
V =
NC->stripPointerCasts();
1447 ReferencedNames.push_back(Name);
1449 NC->dropAllReferences();
1454void InstrLowerer::lowerMCDCTestVectorBitmapUpdate(
1456 auto &Ctx =
M.getContext();
1461 auto *BitmapAddr = getBitmapAddress(Update);
1466 Builder.
CreateLoad(Int32Ty, MCDCCondBitmapAddr,
"mcdc.temp"),
1471 auto *BitmapByteOffset = Builder.
CreateLShr(Temp, 0x3);
1475 auto *BitmapByteAddr =
1489 auto *Bitmap = Builder.
CreateLoad(Int8Ty, BitmapByteAddr,
"mcdc.bits");
1530 return (Prefix + Name).str();
1536 return (Prefix + Name).str();
1545 if (!profDataReferencedByCode(*
F->getParent()))
1549 bool HasAvailableExternallyLinkage =
F->hasAvailableExternallyLinkage();
1550 if (!
F->hasLinkOnceLinkage() && !
F->hasLocalLinkage() &&
1551 !HasAvailableExternallyLinkage)
1557 if (HasAvailableExternallyLinkage &&
1558 F->hasFnAttribute(Attribute::AlwaysInline))
1564 if (
F->hasLocalLinkage() &&
F->hasComdat())
1574 return F->hasAddressTaken() ||
F->hasLinkOnceLinkage();
1627 Fn->
getName() +
".local", Fn);
1656 if (TT.isOSBinFormatELF() || TT.isOSBinFormatCOFF() ||
1657 TT.isOSBinFormatMachO() || TT.isOSBinFormatXCOFF() ||
1658 TT.isOSBinFormatWasm())
1671 bool UseComdat = (NeedComdat ||
TT.isOSBinFormatELF());
1686 StringRef GroupName =
TT.isOSBinFormatCOFF() && DataReferencedByCode
1689 Comdat *
C =
M.getOrInsertComdat(GroupName);
1709 if (!profDataReferencedByCode(*GV->
getParent()))
1734void InstrLowerer::getOrCreateVTableProfData(
GlobalVariable *GV) {
1736 "Value profiling is not supported with lightweight instrumentation");
1747 auto It = VTableDataMap.find(GV);
1748 if (It != VTableDataMap.end() && It->second)
1756 if (
TT.isOSBinFormatXCOFF()) {
1762 Type *DataTypes[] = {
1763#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Init) LLVMType,
1765#undef INSTR_PROF_VTABLE_DATA
1772 const std::string PGOVTableName =
getPGOName(*GV);
1778#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Init) Init,
1780#undef INSTR_PROF_VTABLE_DATA
1788 Data->setVisibility(Visibility);
1792 maybeSetComdat(
Data, GV,
Data->getName());
1794 VTableDataMap[GV] =
Data;
1796 ReferencedVTables.push_back(GV);
1800 UsedVars.push_back(
Data);
1823 if (
TT.isOSBinFormatXCOFF()) {
1832 if (IPSK == IPSK_cnts) {
1836 Ptr = createRegionCounters(CntrIncrement, VarName,
Linkage);
1837 }
else if (IPSK == IPSK_bitmap) {
1842 Ptr = createRegionBitmaps(BitmapUpdate, VarName,
Linkage);
1851 Ptr->
setComdat(
M.getOrInsertComdat(VarName));
1855 maybeSetComdat(Ptr, Fn, VarName);
1875 auto &
PD = ProfileDataMap[NamePtr];
1876 if (
PD.RegionBitmaps)
1877 return PD.RegionBitmaps;
1881 auto *BitmapPtr = setupProfileSection(Inc, IPSK_bitmap);
1882 PD.RegionBitmaps = BitmapPtr;
1885 if (
PD.NumBitmapBytes &&
1891 Metadata *FunctionNameAnnotation[] = {
1895 Metadata *NumBitmapBitsAnnotation[] = {
1903 auto *DICounter =
DB.createGlobalVariableExpression(
1904 SP, BitmapPtr->getName(),
StringRef(),
SP->getFile(),
1905 0,
DB.createUnspecifiedType(
"Profile Bitmap Type"),
1906 BitmapPtr->hasLocalLinkage(),
true,
nullptr,
1907 nullptr,
nullptr, 0,
1909 BitmapPtr->addDebugInfo(DICounter);
1910 DB.finalizeSubprogram(SP);
1915 CompilerUsedVars.push_back(
PD.RegionBitmaps);
1918 return PD.RegionBitmaps;
1925 auto &Ctx =
M.getContext();
1931 std::vector<Constant *> InitialValues(NumCounters,
1949 auto &
PD = ProfileDataMap[NamePtr];
1950 if (
PD.RegionCounters)
1951 return PD.RegionCounters;
1955 auto *CounterPtr = setupProfileSection(Inc, IPSK_cnts);
1956 PD.RegionCounters = CounterPtr;
1963 Metadata *FunctionNameAnnotation[] = {
1971 Metadata *NumCountersAnnotation[] = {
1980 auto *DICounter =
DB.createGlobalVariableExpression(
1981 SP, CounterPtr->getName(),
StringRef(),
SP->getFile(),
1982 0,
DB.createUnspecifiedType(
"Profile Data Type"),
1983 CounterPtr->hasLocalLinkage(),
true,
nullptr,
1984 nullptr,
nullptr, 0,
1986 CounterPtr->addDebugInfo(DICounter);
1987 DB.finalizeSubprogram(SP);
1992 CompilerUsedVars.push_back(
PD.RegionCounters);
1997 getOrCreateUniformCounters(Inc);
2000 createDataVariable(Inc);
2002 return PD.RegionCounters;
2012 auto &
PD = ProfileDataMap[NamePtr];
2013 if (
PD.UniformCounters)
2014 return PD.UniformCounters;
2016 assert(
PD.RegionCounters &&
"region counters must be created first");
2036 PD.UniformCounters = GV;
2037 CompilerUsedVars.push_back(GV);
2039 return PD.UniformCounters;
2049 auto &
PD = ProfileDataMap[NamePtr];
2066 if (
TT.isOSBinFormatXCOFF()) {
2075 std::string CntsVarName =
2077 std::string DataVarName =
2085 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
2086 NS +=
PD.NumValueSites[Kind];
2087 if (NS > 0 && ValueProfileStaticAlloc &&
2093 ValuesVar->setVisibility(Visibility);
2095 ValuesVar->setSection(
2097 ValuesVar->setAlignment(
Align(8));
2098 maybeSetComdat(ValuesVar, Fn, CntsVarName);
2111 auto *
IntPtrTy =
M.getDataLayout().getIntPtrType(
M.getContext());
2114 auto *DataTy = getProfileDataTy();
2118 Constant *Int16ArrayVals[IPVK_Last + 1];
2119 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
2120 Int16ArrayVals[Kind] = ConstantInt::get(Int16Ty,
PD.NumValueSites[Kind]);
2122 uint16_t OffloadDeviceWaveSizeVal = 0;
2145 !(DataReferencedByCode && NeedComdat && !Renamed) &&
2146 (
TT.isOSBinFormatELF() ||
2147 (!DataReferencedByCode &&
TT.isOSBinFormatCOFF()))) {
2154 if (
TT.isGPU() &&
TT.isOSBinFormatELF() &&
2168 DataSectionKind = IPSK_covdata;
2170 if (BitmapPtr !=
nullptr)
2173 RelativeUniformCounterPtr =
2175 }
else if (
TT.isNVPTX()) {
2179 DataSectionKind = IPSK_data;
2184 DataSectionKind = IPSK_data;
2185 RelativeCounterPtr =
2188 if (BitmapPtr !=
nullptr)
2199#define INSTR_PROF_DATA(Type, LLVMType, Name, Init) Init,
2204 Data->setVisibility(Visibility);
2209 Data->setComdat(
M.getOrInsertComdat(CntsVarName));
2212 maybeSetComdat(
Data, Fn, CntsVarName);
2218 CompilerUsedVars.push_back(
Data);
2224 ReferencedNames.push_back(NamePtr);
2227void InstrLowerer::emitVNodes() {
2228 if (!ValueProfileStaticAlloc)
2238 for (
auto &PD : ProfileDataMap) {
2239 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
2240 TotalNS +=
PD.second.NumValueSites[Kind];
2246 uint64_t NumCounters = TotalNS * NumCountersPerValueSite;
2254#define INSTR_PROF_MIN_VAL_COUNTS 10
2258 auto &Ctx =
M.getContext();
2259 Type *VNodeTypes[] = {
2260#define INSTR_PROF_VALUE_NODE(Type, LLVMType, Name, Init) LLVMType,
2270 VNodesVar->setSection(
2272 VNodesVar->setAlignment(
M.getDataLayout().getABITypeAlign(VNodesTy));
2275 UsedVars.push_back(VNodesVar);
2283 std::string Name = (
"__llvm_profile_sections" + CUIDPostfix).str();
2284 if (M.getNamedValue(Name))
2288 unsigned AS = M.getDataLayout().getDefaultGlobalsAddressSpace();
2294 nullptr, Sym,
nullptr,
2303 Constant *Fields[] = {
Extern(
"__start___llvm_prf_names", I8,
false, Hidden),
2304 Extern(
"__stop___llvm_prf_names", I8,
false, Hidden),
2305 Extern(
"__start___llvm_prf_cnts", I8,
false, Hidden),
2306 Extern(
"__stop___llvm_prf_cnts", I8,
false, Hidden),
2307 Extern(
"__start___llvm_prf_data", I8,
false, Hidden),
2308 Extern(
"__stop___llvm_prf_data", I8,
false, Hidden),
2309 Extern(
"__start___llvm_prf_ucnts", I8,
false, Hidden),
2310 Extern(
"__stop___llvm_prf_ucnts", I8,
false, Hidden),
2311 Extern(
"__llvm_profile_raw_version",
2316 Ctx, {PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy});
2325void InstrLowerer::emitNameData() {
2326 if (ReferencedNames.empty())
2329 std::string CompressedNameStr;
2335 auto &Ctx =
M.getContext();
2341 std::string GPUCUIDPostfix;
2346 if (
Init->isCString()) {
2347 GPUCUIDPostfix =
Init->getAsCString().str();
2348 NamesVarName += GPUCUIDPostfix;
2352 M, [GV](
Constant *
C) {
return C->stripPointerCasts() == GV; });
2358 NamesVar =
new GlobalVariable(M, NamesVal->getType(),
true, NamesLinkage,
2359 NamesVal, NamesVarName);
2360 NamesVar->setVisibility(NamesVisibility);
2362 NamesSize = CompressedNameStr.size();
2364 std::string NamesSectionName =
2368 NamesVar->setSection(NamesSectionName);
2372 NamesVar->setAlignment(
Align(1));
2375 UsedVars.push_back(NamesVar);
2377 for (
auto *NamePtr : ReferencedNames)
2383 [](
const auto &KV) { return KV.second.DataVar; });
2384 if (!GPUCUIDPostfix.empty() && HasData)
2386 CompilerUsedVars.push_back(GV);
2389void InstrLowerer::emitVTableNames() {
2394 std::string CompressedVTableNames;
2400 auto &Ctx =
M.getContext();
2402 Ctx,
StringRef(CompressedVTableNames),
false );
2411 UsedVars.push_back(VTableNamesVar);
2414void InstrLowerer::emitRegistration() {
2427 RegisterF->addFnAttr(Attribute::NoRedZone);
2430 auto *RuntimeRegisterF =
2438 IRB.CreateCall(RuntimeRegisterF,
2439 IRB.CreatePointerBitCastOrAddrSpaceCast(
Data, VoidPtrTy));
2442 IRB.CreateCall(RuntimeRegisterF,
2443 IRB.CreatePointerBitCastOrAddrSpaceCast(
Data, VoidPtrTy));
2446 Type *ParamTypes[] = {VoidPtrTy, Int64Ty};
2447 auto *NamesRegisterTy =
2449 auto *NamesRegisterF =
2452 IRB.CreateCall(NamesRegisterF, {IRB.CreatePointerBitCastOrAddrSpaceCast(
2453 NamesVar, VoidPtrTy),
2454 IRB.getInt64(NamesSize)});
2457 IRB.CreateRetVoid();
2460bool InstrLowerer::emitRuntimeHook() {
2468 if (
TT.isOSLinux() ||
TT.isOSAIX())
2482 if (
TT.isOSBinFormatELF() && !
TT.isPS()) {
2484 CompilerUsedVars.push_back(Var);
2490 User->addFnAttr(Attribute::NoInline);
2492 User->addFnAttr(Attribute::NoRedZone);
2494 if (
TT.supportsCOMDAT())
2497 User->setEntryCount(0);
2500 auto *
Load = IRB.CreateLoad(Int32Ty, Var);
2501 IRB.CreateRet(
Load);
2504 CompilerUsedVars.push_back(
User);
2509void InstrLowerer::emitUses() {
2519 if (
TT.isOSBinFormatELF() ||
TT.isOSBinFormatMachO() ||
2520 (
TT.isOSBinFormatCOFF() && !DataReferencedByCode))
2531void InstrLowerer::emitInitialization() {
2548 F->addFnAttr(Attribute::NoInline);
2550 F->addFnAttr(Attribute::NoRedZone);
2554 IRB.CreateCall(RegisterF, {});
2555 IRB.CreateRetVoid();
2566 if (getSampledInstrumentationConfig().UseShort) {
2576 SamplingVar->setThreadLocal(
true);
2577 Triple TT(M.getTargetTriple());
2578 if (TT.supportsCOMDAT()) {
2580 SamplingVar->setComdat(M.getOrInsertComdat(VarName));
2589StructType *InstrLowerer::getProfileDataTy() {
2591 return ProfileDataTy;
2593 auto &Ctx =
M.getContext();
2594 auto *
IntPtrTy =
M.getDataLayout().getIntPtrType(
M.getContext());
2597 Type *DataTypes[] = {
2598#define INSTR_PROF_DATA(Type, LLVMType, Name, Init) LLVMType,
2602 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...
This file declares the LLVM IR specialization of the GenericCycle templates.
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...
LLVM_ABI BasicBlock * splitBasicBlock(iterator I, const Twine &BBName="")
Split the basic block into two basic blocks at the specified instruction.
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
InstListType::iterator iterator
Instruction iterators...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
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)
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
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.
void compute(FunctionT &F)
Compute the cycle info for a 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.
Type * getValueType() const
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())
BasicBlock * GetInsertBlock() const
Value * CreateInBoundsGEP(Type *Ty, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &Name="")
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)
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
static LLVM_ABI const char * NumBitmapBitsAttributeName
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.
ConstantInt * getNumBitmapBits() const
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.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
LLVM_ABI ID lookupIntrinsicID(StringRef Name)
This does the actual lookup of an intrinsic ID which matches the given function name.
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.
StringRef getInstrProfNameVarPrefix()
Return the name prefix of variables containing instrumented function names.
RelativeUniformCounterPtr ValuesPtrExpr NumBitmapBytes
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.
LLVM_ABI void createProfileSamplingVar(Module &M)
@ Load
The value being inserted comes from a load (InsertElement only).
@ Store
The extracted value is stored (ExtractElement only).
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.
StringRef getInstrProfVTableNamesVarName()
StringRef getInstrProfDataVarPrefix()
Return the name prefix of variables containing per-function control data.
RelativeUniformCounterPtr ValuesPtrExpr Int16ArrayTy
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.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
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)
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.
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)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
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.