70#define DEBUG_TYPE "instrprof"
78 cl::desc(
"Use debug info or binary file to correlate profiles."),
81 "No profile correlation"),
83 "Use debug info to correlate"),
85 "Use binary to correlate")));
91 "hash-based-counter-split",
92 cl::desc(
"Rename counter variable of a comdat function based on cfg hash"),
96 RuntimeCounterRelocation(
"runtime-counter-relocation",
97 cl::desc(
"Enable relocating counters at runtime."),
102 cl::desc(
"Do static counter allocation for value profiler"),
106 "vp-counters-per-site",
107 cl::desc(
"The average number of profile counters allocated "
108 "per value profiling site."),
116 "instrprof-atomic-counter-update-all",
117 cl::desc(
"Make all profile counter updates atomic (for testing only)"),
121 "verify-atomic-counter-promoted",
122 cl::desc(
"Check that all profile counter updates were made atomic; no-op "
123 "if atomic updates are not requested (-fprofile-update=atomic)"),
127 "atomic-counter-update-promoted",
128 cl::desc(
"Do counter update using atomic fetch add "
129 " for promoted counters only"),
133 "atomic-first-counter",
134 cl::desc(
"Use atomic fetch add for first counter in a function (usually "
135 "the entry counter)"),
139 "conditional-counter-update",
140 cl::desc(
"Do conditional counter updates in single byte counters mode)"),
149 cl::desc(
"Do counter register promotion"),
152 "max-counter-promotions-per-loop",
cl::init(20),
153 cl::desc(
"Max number counter promotions per loop to avoid"
154 " increasing register pressure too much"));
158 MaxNumOfPromotions(
"max-counter-promotions",
cl::init(-1),
159 cl::desc(
"Max number of allowed counter promotions"));
162 "speculative-counter-promotion-max-exiting",
cl::init(3),
163 cl::desc(
"The max number of exiting blocks of a loop to allow "
164 " speculative counter promotion"));
167 "speculative-counter-promotion-to-loop",
168 cl::desc(
"When the option is false, if the target block is in a loop, "
169 "the promotion will be disallowed unless the promoted counter "
170 " update can be further/iteratively promoted into an acyclic "
174 "offload-pgo-sampling",
175 cl::desc(
"Log2 of the sampling period for offload PGO instrumentation. "
176 "Only 1 in every 2^N blocks is instrumented. "
177 "0 = all blocks, 1 = 50%, 2 = 25%, 3 = 12.5% (default). "
178 "Higher values reduce overhead at the cost of sparser profiles."),
182 "iterative-counter-promotion",
cl::init(
true),
183 cl::desc(
"Allow counter promotion across the whole loop nest."));
186 "skip-ret-exit-block",
cl::init(
true),
187 cl::desc(
"Suppress counter promotion if exit blocks contain ret."));
190 cl::desc(
"Do PGO instrumentation sampling"));
193 "sampled-instr-period",
194 cl::desc(
"Set the profile instrumentation sample period. A sample period "
195 "of 0 is invalid. For each sample period, a fixed number of "
196 "consecutive samples will be recorded. The number is controlled "
197 "by 'sampled-instr-burst-duration' flag. The default sample "
198 "period of 65536 is optimized for generating efficient code that "
199 "leverages unsigned short integer wrapping in overflow, but this "
200 "is disabled under simple sampling (burst duration = 1)."),
204 "sampled-instr-burst-duration",
205 cl::desc(
"Set the profile instrumentation burst duration, which can range "
206 "from 1 to the value of 'sampled-instr-period' (0 is invalid). "
207 "This number of samples will be recorded for each "
208 "'sampled-instr-period' count update. Setting to 1 enables simple "
209 "sampling, in which case it is recommended to set "
210 "'sampled-instr-period' to a prime number."),
213struct SampledInstrumentationConfig {
214 unsigned BurstDuration;
217 bool IsSimpleSampling;
221static SampledInstrumentationConfig getSampledInstrumentationConfig() {
222 SampledInstrumentationConfig config;
223 config.BurstDuration = SampledInstrBurstDuration.getValue();
224 config.Period = SampledInstrPeriod.getValue();
225 if (config.BurstDuration > config.Period)
227 "SampledBurstDuration must be less than or equal to SampledPeriod");
228 if (config.Period == 0 || config.BurstDuration == 0)
230 "SampledPeriod and SampledBurstDuration must be greater than 0");
231 config.IsSimpleSampling = (config.BurstDuration == 1);
234 config.IsFastSampling =
235 (!config.IsSimpleSampling && config.Period == USHRT_MAX + 1);
236 config.UseShort = (config.Period <= USHRT_MAX) || config.IsFastSampling;
240using LoadStorePair = std::pair<Instruction *, Instruction *>;
244 assert(Addition && Addition->getOpcode() == Instruction::BinaryOps::Add);
245 auto *Addend = Addition->getOperand(1);
250 Store->eraseFromParent();
251 Addition->eraseFromParent();
252 Load->eraseFromParent();
265static bool enablesValueProfiling(
const Module &M) {
267 getIntModuleFlagOrZero(M,
"EnableValueProfiling") != 0;
271static bool profDataReferencedByCode(
const Module &M) {
272 return enablesValueProfiling(M);
275class InstrLowerer final {
277 InstrLowerer(
Module &M,
const InstrProfOptions &Options,
278 std::function<
const TargetLibraryInfo &(
Function &
F)> GetTLI,
280 : M(M), Options(Options), TT(M.getTargetTriple()), IsCS(IsCS),
281 GetTLI(GetTLI), DataReferencedByCode(profDataReferencedByCode(M)) {}
287 const InstrProfOptions Options;
292 std::function<
const TargetLibraryInfo &(
Function &
F)> GetTLI;
294 const bool DataReferencedByCode;
296 struct PerFunctionProfileData {
297 uint32_t NumValueSites[IPVK_Last + 1] = {};
298 GlobalVariable *RegionCounters =
nullptr;
299 GlobalVariable *UniformCounters =
301 GlobalVariable *DataVar =
nullptr;
302 GlobalVariable *RegionBitmaps =
nullptr;
303 uint32_t NumBitmapBytes = 0;
305 PerFunctionProfileData() =
default;
307 DenseMap<GlobalVariable *, PerFunctionProfileData> ProfileDataMap;
310 DenseMap<GlobalVariable *, GlobalVariable *> VTableDataMap;
313 DenseMap<const Function *, LoadInst *> FunctionToProfileBiasMap;
314 std::vector<GlobalValue *> CompilerUsedVars;
315 std::vector<GlobalValue *> UsedVars;
316 std::vector<GlobalVariable *> ReferencedNames;
319 std::vector<GlobalVariable *> ReferencedVTables;
320 GlobalVariable *NamesVar =
nullptr;
321 size_t NamesSize = 0;
323 StructType *ProfileDataTy =
nullptr;
326 std::vector<LoadStorePair> PromotionCandidates;
328 int64_t TotalCountersPromoted = 0;
333 struct GPUPGOInvariants {
334 Value *Matched =
nullptr;
335 bool WaveSizeStored =
false;
337 DenseMap<Function *, GPUPGOInvariants> GPUInvariantsCache;
340 GPUPGOInvariants &getOrCreateGPUInvariants(
Function *
F);
347 void promoteCounterLoadStores(
Function *
F);
350 bool isRuntimeCounterRelocationEnabled()
const;
353 bool isCounterPromotionEnabled()
const;
359 bool isSamplingEnabled()
const;
362 void computeNumValueSiteCounts(InstrProfValueProfileInst *Ins);
365 void lowerValueProfileInst(InstrProfValueProfileInst *Ins);
368 void lowerCover(InstrProfCoverInst *Inc);
372 void lowerTimestamp(InstrProfTimestampInst *TimestampInstruction);
375 void lowerIncrement(InstrProfIncrementInst *Inc);
378 void lowerCoverageData(GlobalVariable *CoverageNamesVar);
382 void lowerMCDCTestVectorBitmapUpdate(InstrProfMCDCTVBitmapUpdate *Ins);
386 GlobalVariable *getOrCreateBiasVar(StringRef VarName);
390 Value *getCounterAddress(InstrProfCntrInstBase *
I);
393 void doSampling(Instruction *
I);
399 GlobalVariable *getOrCreateRegionCounters(InstrProfCntrInstBase *Inc);
403 GlobalVariable *getOrCreateUniformCounters(InstrProfCntrInstBase *Inc);
406 GlobalVariable *createRegionCounters(InstrProfCntrInstBase *Inc,
412 Value *getBitmapAddress(InstrProfMCDCTVBitmapUpdate *
I);
418 GlobalVariable *getOrCreateRegionBitmaps(InstrProfMCDCBitmapInstBase *Inc);
425 GlobalVariable *createRegionBitmaps(InstrProfMCDCBitmapInstBase *Inc,
430 void maybeSetComdat(GlobalVariable *GV, GlobalObject *GO, StringRef VarName);
433 GlobalVariable *setupProfileSection(InstrProfInstBase *Inc,
437 void createDataVariable(InstrProfCntrInstBase *Inc);
440 void getOrCreateVTableProfData(GlobalVariable *GV);
446 void emitVTableNames();
452 void emitRegistration();
456 bool emitRuntimeHook();
463 void emitInitialization();
466 StructType *getProfileDataTy();
478 PGOCounterPromoterHelper(
479 Instruction *L, Instruction *S, SSAUpdater &
SSA,
Value *Init,
483 LoopInfo &LI,
bool IsAtomic)
484 : LoadAndStorePromoter({
L, S},
SSA),
Store(S), ExitBlocks(ExitBlocks),
485 InsertPts(InsertPts), LoopToCandidates(LoopToCands), LI(LI),
489 SSA.AddAvailableValue(PH, Init);
492 void doExtraRewritesBeforeFinalDeletion()
override {
493 for (
unsigned i = 0, e = ExitBlocks.size(); i != e; ++i) {
499 Value *LiveInValue =
SSA.GetValueInMiddleOfBlock(ExitBlock);
511 assert(OrigBiasInst->getOpcode() == Instruction::BinaryOps::Add);
512 Value *BiasInst = Builder.Insert(OrigBiasInst->clone());
513 Addr = Builder.CreateIntToPtr(BiasInst,
517 IterativeCounterPromotion ? LI.getLoopFor(ExitBlock) :
nullptr;
520 if ((IsAtomic && !TargetLoop) || AtomicCounterUpdatePromoted)
522 MaybeAlign(), AtomicOrdering::Monotonic);
524 LoadInst *OldVal = Builder.CreateLoad(Ty, Addr,
"pgocount.promoted");
525 auto *NewVal = Builder.CreateAdd(OldVal, LiveInValue);
526 auto *NewStore = Builder.CreateStore(NewVal, Addr);
530 LoopToCandidates[TargetLoop].emplace_back(OldVal, NewStore);
539 DenseMap<Loop *, SmallVector<LoadStorePair, 8>> &LoopToCandidates;
547class PGOCounterPromoter {
551 Loop &CurLoop, LoopInfo &LI, BlockFrequencyInfo *BFI,
bool IsAtomic)
552 : LoopToCandidates(LoopToCands), L(CurLoop), LI(LI), BFI(BFI),
557 SmallVector<BasicBlock *, 8> LoopExitBlocks;
558 SmallPtrSet<BasicBlock *, 8>
BlockSet;
560 L.getExitBlocks(LoopExitBlocks);
561 if (!isPromotionPossible(&L, LoopExitBlocks))
564 for (BasicBlock *ExitBlock : LoopExitBlocks) {
569 ExitBlocks.push_back(ExitBlock);
575 bool run(int64_t *NumPromoted) {
576 bool RC = promoteCandidates(NumPromoted);
587 for (
auto &Cand : LoopToCandidates[&L])
588 if (Cand.first !=
nullptr && Cand.second !=
nullptr)
589 makeAtomic(Cand.first, Cand.second);
594 bool promoteCandidates(int64_t *NumPromoted) {
596 if (ExitBlocks.size() == 0)
604 if (SkipRetExitBlock) {
605 for (
auto *BB : ExitBlocks)
610 unsigned MaxProm = getMaxNumOfPromotionsInLoop(&L);
614 [[maybe_unused]]
auto *Ptr = LoopToCandidates.getPointerIntoBucketsArray();
615 unsigned Promoted = 0;
616 for (
auto &Cand : LoopToCandidates[&L]) {
618 SSAUpdater
SSA(&NewPHIs);
619 Value *InitVal = ConstantInt::get(Cand.first->getType(), 0);
623 auto *BB = Cand.first->getParent();
624 auto InstrCount = BFI->getBlockProfileCount(BB);
627 auto PreheaderCount = BFI->getBlockProfileCount(L.getLoopPreheader());
630 if (PreheaderCount && (*PreheaderCount * 3) >= (*
InstrCount * 2))
634 PGOCounterPromoterHelper Promoter(
635 Cand.first, Cand.second,
SSA, InitVal, L.getLoopPreheader(),
636 ExitBlocks, InsertPts, LoopToCandidates, LI, IsAtomic);
637 Promoter.run(SmallVector<Instruction *, 2>({Cand.first, Cand.second}));
639 assert(LoopToCandidates.isPointerIntoBucketsArray(Ptr) &&
640 "References into LoopToCandidates might be invalid");
641 Cand = {
nullptr,
nullptr};
644 if (Promoted >= MaxProm)
648 if (MaxNumOfPromotions != -1 && *NumPromoted >= MaxNumOfPromotions)
652 LLVM_DEBUG(
dbgs() << Promoted <<
" counters promoted for loop (depth="
653 << L.getLoopDepth() <<
")\n");
654 return Promoted != 0;
658 bool allowSpeculativeCounterPromotion(
Loop *LP) {
659 SmallVector<BasicBlock *, 8> ExitingBlocks;
660 L.getExitingBlocks(ExitingBlocks);
662 if (ExitingBlocks.
size() == 1)
664 if (ExitingBlocks.
size() > SpeculativeCounterPromotionMaxExiting)
672 isPromotionPossible(
Loop *LP,
673 const SmallVectorImpl<BasicBlock *> &LoopExitBlocks) {
691 unsigned getMaxNumOfPromotionsInLoop(
Loop *LP) {
692 SmallVector<BasicBlock *, 8> LoopExitBlocks;
694 if (!isPromotionPossible(LP, LoopExitBlocks))
697 SmallVector<BasicBlock *, 8> ExitingBlocks;
705 if (ExitingBlocks.
size() == 1)
706 return MaxNumOfPromotionsPerLoop;
708 if (ExitingBlocks.
size() > SpeculativeCounterPromotionMaxExiting)
712 if (SpeculativeCounterPromotionToLoop)
713 return MaxNumOfPromotionsPerLoop;
716 unsigned MaxProm = MaxNumOfPromotionsPerLoop;
717 for (
auto *TargetBlock : LoopExitBlocks) {
718 auto *TargetLoop = LI.getLoopFor(TargetBlock);
721 unsigned MaxPromForTarget = getMaxNumOfPromotionsInLoop(TargetLoop);
722 unsigned PendingCandsInTarget = LoopToCandidates[TargetLoop].size();
724 std::min(MaxProm, std::max(MaxPromForTarget, PendingCandsInTarget) -
725 PendingCandsInTarget);
730 DenseMap<Loop *, SmallVector<LoadStorePair, 8>> &LoopToCandidates;
731 SmallVector<BasicBlock *, 8> ExitBlocks;
732 SmallVector<Instruction *, 8> InsertPts;
735 BlockFrequencyInfo *BFI;
739enum class ValueProfilingCallType {
757 InstrLowerer Lowerer(M, Options, GetTLI, IsCS);
758 if (!Lowerer.lower())
809 if (!isSamplingEnabled())
812 SampledInstrumentationConfig config = getSampledInstrumentationConfig();
815 return Builder.getInt16(
C);
817 return Builder.getInt32(
C);
827 assert(SamplingVar &&
"SamplingVar not set properly");
831 Value *NewSamplingVarVal;
835 auto *LoadSamplingVar = CondBuilder.CreateLoad(SamplingVarTy, SamplingVar);
836 if (config.IsSimpleSampling) {
840 IncBuilder.CreateAdd(LoadSamplingVar, GetConstant(IncBuilder, 1));
841 SamplingVarIncr = IncBuilder.CreateStore(NewSamplingVarVal, SamplingVar);
844 auto *DurationCond = CondBuilder.CreateICmpULE(
845 LoadSamplingVar, GetConstant(CondBuilder, config.BurstDuration - 1));
846 BranchWeight = MDB.createBranchWeights(
847 config.BurstDuration, config.Period - config.BurstDuration);
849 DurationCond,
I,
false, BranchWeight);
852 IncBuilder.CreateAdd(LoadSamplingVar, GetConstant(IncBuilder, 1));
853 SamplingVarIncr = IncBuilder.CreateStore(NewSamplingVarVal, SamplingVar);
857 if (config.IsFastSampling)
863 auto *PeriodCond = PeriodCondBuilder.CreateICmpUGE(
864 NewSamplingVarVal, GetConstant(PeriodCondBuilder, config.Period));
865 BranchWeight = MDB.createBranchWeights(1, config.Period - 1);
867 &ElseTerm, BranchWeight);
870 if (config.IsSimpleSampling)
874 ResetBuilder.CreateStore(GetConstant(ResetBuilder, 0), SamplingVar);
878bool InstrLowerer::lowerIntrinsics(
Function *
F) {
879 bool MadeChange =
false;
880 PromotionCandidates.clear();
893 for (
auto *Instr : InstrProfInsts) {
896 lowerIncrement(IPIS);
908 lowerValueProfileInst(IPVP);
911 IPMP->eraseFromParent();
914 lowerMCDCTestVectorBitmapUpdate(IPBU);
922 promoteCounterLoadStores(
F);
926bool InstrLowerer::isRuntimeCounterRelocationEnabled()
const {
928 if (
TT.isOSBinFormatMachO())
931 if (RuntimeCounterRelocation.getNumOccurrences() > 0)
932 return RuntimeCounterRelocation;
935 return TT.isOSFuchsia();
938bool InstrLowerer::isSamplingEnabled()
const {
939 if (SampledInstr.getNumOccurrences() > 0)
944bool InstrLowerer::isCounterPromotionEnabled()
const {
945 if (DoCounterPromotion.getNumOccurrences() > 0)
946 return DoCounterPromotion;
947 return Options.DoCounterPromotion;
950bool InstrLowerer::isAtomic()
const {
951 return Options.Atomic || AtomicCounterUpdateAll;
956 const Value *Addr =
nullptr;
958 Addr = LI->getOperand(0);
960 Addr = LI->getOperand(1);
970void InstrLowerer::promoteCounterLoadStores(
Function *
F) {
971 if (!isCounterPromotionEnabled())
980 std::unique_ptr<BlockFrequencyInfo> BFI;
981 if (
Options.UseBFIInPromotion) {
982 std::unique_ptr<BranchProbabilityInfo> BPI;
987 for (
const auto &LoadStore : PromotionCandidates) {
994 makeAtomic(CounterLoad, CounterStore);
997 LoopPromotionCandidates[ParentLoop].emplace_back(CounterLoad, CounterStore);
1005 PGOCounterPromoter Promoter(LoopPromotionCandidates, *
Loop, LI, BFI.get(),
1007 Promoter.run(&TotalCountersPromoted);
1010 if (
isAtomic() && VerifyAtomicPromotion)
1016 if (TT.isOSFuchsia())
1024 auto containsIntrinsic = [&](
int ID) {
1026 return !
F->use_empty();
1029 return containsIntrinsic(Intrinsic::instrprof_cover) ||
1030 containsIntrinsic(Intrinsic::instrprof_increment) ||
1031 containsIntrinsic(Intrinsic::instrprof_increment_step) ||
1032 containsIntrinsic(Intrinsic::instrprof_timestamp) ||
1033 containsIntrinsic(Intrinsic::instrprof_value_profile);
1036bool InstrLowerer::lower() {
1037 bool MadeChange =
false;
1039 if (NeedsRuntimeHook)
1040 MadeChange = emitRuntimeHook();
1042 if (!IsCS && isSamplingEnabled())
1049 if (!ContainsProfiling && !CoverageNamesVar)
1060 computeNumValueSiteCounts(Ind);
1062 if (FirstProfInst ==
nullptr &&
1067 static_cast<void>(getOrCreateRegionBitmaps(Params));
1074 if (FirstProfInst !=
nullptr) {
1075 static_cast<void>(getOrCreateRegionCounters(FirstProfInst));
1082 if (GV.hasMetadata(LLVMContext::MD_type))
1083 getOrCreateVTableProfData(&GV);
1086 MadeChange |= lowerIntrinsics(&
F);
1088 if (CoverageNamesVar) {
1089 lowerCoverageData(CoverageNamesVar);
1104 if (!NeedsRuntimeHook && ContainsProfiling)
1109 emitInitialization();
1115 ValueProfilingCallType CallType = ValueProfilingCallType::Default) {
1120 if (
auto AK = TLI.getExtAttrForI32Param(
false))
1121 AL = AL.addParamAttribute(M.getContext(), 2, AK);
1123 assert((CallType == ValueProfilingCallType::Default ||
1124 CallType == ValueProfilingCallType::MemOp) &&
1125 "Must be Default or MemOp");
1126 Type *ParamTypes[] = {
1127#define VALUE_PROF_FUNC_PARAM(ParamType, ParamName, ParamLLVMType) ParamLLVMType
1130 auto *ValueProfilingCallTy =
1132 StringRef FuncName = CallType == ValueProfilingCallType::Default
1135 return M.getOrInsertFunction(FuncName, ValueProfilingCallTy, AL);
1142 auto &
PD = ProfileDataMap[
Name];
1144 std::max(
PD.NumValueSites[ValueKind], (uint32_t)(Index + 1));
1153 "Value profiling is not yet supported with lightweight instrumentation");
1155 auto It = ProfileDataMap.find(Name);
1156 assert(It != ProfileDataMap.end() && It->second.DataVar &&
1157 "value profiling detected in function with no counter increment");
1163 Index += It->second.NumValueSites[Kind];
1166 bool IsMemOpSize = (Ind->
getValueKind()->getZExtValue() ==
1167 llvm::InstrProfValueKind::IPVK_MemOPSize);
1191 if (
auto AK = TLI->getExtAttrForI32Param(
false))
1214 if (
TT.supportsCOMDAT())
1215 Bias->
setComdat(
M.getOrInsertComdat(VarName));
1221 auto *
Counters = getOrCreateRegionCounters(
I);
1230 if (!isRuntimeCounterRelocationEnabled())
1235 LoadInst *&BiasLI = FunctionToProfileBiasMap[Fn];
1239 BiasLI = EntryBuilder.CreateLoad(Int64Ty, Bias,
"profc_bias");
1241 BiasLI->
setMetadata(LLVMContext::MD_invariant_load,
1249 auto *Bitmaps = getOrCreateRegionBitmaps(
I);
1250 if (!isRuntimeCounterRelocationEnabled())
1258 auto *BiasLI = EntryBuilder.CreateLoad(Int64Ty, Bias,
"profbm_bias");
1260 BiasLI->
setMetadata(LLVMContext::MD_invariant_load,
1265 return Builder.
CreatePtrAdd(Bitmaps, BiasLI,
"profbm_addr");
1269 auto *Addr = getCounterAddress(CoverInstruction);
1271 if (ConditionalCounterUpdate) {
1273 auto &Ctx = CoverInstruction->
getParent()->getContext();
1287void InstrLowerer::lowerTimestamp(
1290 "timestamp probes are always the first probe for a function");
1291 auto &Ctx =
M.getContext();
1292 auto *TimestampAddr = getCounterAddress(TimestampInstruction);
1296 auto Callee =
M.getOrInsertFunction(
1302InstrLowerer::GPUPGOInvariants &
1303InstrLowerer::getOrCreateGPUInvariants(
Function *
F) {
1304 auto It = GPUInvariantsCache.find(
F);
1305 if (It != GPUInvariantsCache.end())
1315 if (OffloadPGOSampling > 0) {
1318 RTLIB::impl___llvm_profile_sampling_gpu),
1321 IsSampledFn, {ConstantInt::get(Int32Ty, OffloadPGOSampling)},
1323 Matched = Builder.
CreateICmpNE(SampledInt, ConstantInt::get(Int32Ty, 0),
1327 auto &Inv = GPUInvariantsCache[
F];
1328 Inv.Matched = Matched;
1336 auto &Inv = getOrCreateGPUInvariants(
F);
1342 auto *Addr = getCounterAddress(Inc);
1347 if (!Inv.WaveSizeStored) {
1348 Inv.WaveSizeStored =
true;
1350 auto &
PD = ProfileDataMap[NamePtr];
1352 IRBuilder<> EntryBuilder(&*
F->getEntryBlock().getFirstInsertionPt());
1353 Value *WaveSize16 =
nullptr;
1357 if (
TT.isAMDGPU()) {
1363 Value *WaveSize = EntryBuilder.CreateCall(WaveSizeFn);
1364 WaveSize16 = EntryBuilder.CreateTrunc(
1370 Value *WaveSizeAddr = EntryBuilder.CreateStructGEP(
1371 PD.DataVar->getValueType(),
PD.DataVar, 9,
"profd.wavesize");
1372 EntryBuilder.CreateStore(WaveSize16, WaveSizeAddr);
1376 GlobalVariable *UniformCounters = getOrCreateUniformCounters(Inc);
1378 if (UniformCounters) {
1381 UniformCounters->
getValueType(), UniformCounters, UniformIndices,
1391 {PtrTy, PtrTy, Int64Ty},
false);
1394 RTLIB::impl___llvm_profile_instrument_gpu),
1397 if (OffloadPGOSampling > 0) {
1405 HeadBuilder.CreateCondBr(Inv.Matched, ThenBB, ContBB);
1408 ThenBuilder.CreateCall(Callee, {CastAddr, UniformAddrArg, StepI64});
1409 ThenBuilder.CreateBr(ContBB);
1411 Builder.
CreateCall(Callee, {CastAddr, UniformAddrArg, StepI64});
1417 auto *Addr = getCounterAddress(Inc);
1420 if ((!isCounterPromotionEnabled() &&
isAtomic()) ||
1429 if (isCounterPromotionEnabled())
1435void InstrLowerer::lowerCoverageData(
GlobalVariable *CoverageNamesVar) {
1440 Value *
V =
NC->stripPointerCasts();
1445 ReferencedNames.push_back(Name);
1447 NC->dropAllReferences();
1452void InstrLowerer::lowerMCDCTestVectorBitmapUpdate(
1454 auto &Ctx =
M.getContext();
1459 auto *BitmapAddr = getBitmapAddress(Update);
1464 Builder.
CreateLoad(Int32Ty, MCDCCondBitmapAddr,
"mcdc.temp"),
1469 auto *BitmapByteOffset = Builder.
CreateLShr(Temp, 0x3);
1473 auto *BitmapByteAddr =
1487 auto *Bitmap = Builder.
CreateLoad(Int8Ty, BitmapByteAddr,
"mcdc.bits");
1528 return (Prefix + Name).str();
1534 return (Prefix + Name).str();
1543 if (!profDataReferencedByCode(*
F->getParent()))
1547 bool HasAvailableExternallyLinkage =
F->hasAvailableExternallyLinkage();
1548 if (!
F->hasLinkOnceLinkage() && !
F->hasLocalLinkage() &&
1549 !HasAvailableExternallyLinkage)
1555 if (HasAvailableExternallyLinkage &&
1556 F->hasFnAttribute(Attribute::AlwaysInline))
1562 if (
F->hasLocalLinkage() &&
F->hasComdat())
1572 return F->hasAddressTaken() ||
F->hasLinkOnceLinkage();
1625 Fn->
getName() +
".local", Fn);
1654 if (TT.isOSBinFormatELF() || TT.isOSBinFormatCOFF() ||
1655 TT.isOSBinFormatMachO() || TT.isOSBinFormatXCOFF() ||
1656 TT.isOSBinFormatWasm())
1669 bool UseComdat = (NeedComdat ||
TT.isOSBinFormatELF());
1684 StringRef GroupName =
TT.isOSBinFormatCOFF() && DataReferencedByCode
1687 Comdat *
C =
M.getOrInsertComdat(GroupName);
1707 if (!profDataReferencedByCode(*GV->
getParent()))
1732void InstrLowerer::getOrCreateVTableProfData(
GlobalVariable *GV) {
1734 "Value profiling is not supported with lightweight instrumentation");
1745 auto It = VTableDataMap.find(GV);
1746 if (It != VTableDataMap.end() && It->second)
1754 if (
TT.isOSBinFormatXCOFF()) {
1760 Type *DataTypes[] = {
1761#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Init) LLVMType,
1763#undef INSTR_PROF_VTABLE_DATA
1770 const std::string PGOVTableName =
getPGOName(*GV);
1776#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Init) Init,
1778#undef INSTR_PROF_VTABLE_DATA
1786 Data->setVisibility(Visibility);
1790 maybeSetComdat(
Data, GV,
Data->getName());
1792 VTableDataMap[GV] =
Data;
1794 ReferencedVTables.push_back(GV);
1798 UsedVars.push_back(
Data);
1821 if (
TT.isOSBinFormatXCOFF()) {
1830 if (IPSK == IPSK_cnts) {
1834 Ptr = createRegionCounters(CntrIncrement, VarName,
Linkage);
1835 }
else if (IPSK == IPSK_bitmap) {
1840 Ptr = createRegionBitmaps(BitmapUpdate, VarName,
Linkage);
1849 Ptr->
setComdat(
M.getOrInsertComdat(VarName));
1853 maybeSetComdat(Ptr, Fn, VarName);
1873 auto &
PD = ProfileDataMap[NamePtr];
1874 if (
PD.RegionBitmaps)
1875 return PD.RegionBitmaps;
1879 auto *BitmapPtr = setupProfileSection(Inc, IPSK_bitmap);
1880 PD.RegionBitmaps = BitmapPtr;
1883 if (
PD.NumBitmapBytes &&
1889 Metadata *FunctionNameAnnotation[] = {
1893 Metadata *NumBitmapBitsAnnotation[] = {
1901 auto *DICounter =
DB.createGlobalVariableExpression(
1902 SP, BitmapPtr->getName(),
StringRef(),
SP->getFile(),
1903 0,
DB.createUnspecifiedType(
"Profile Bitmap Type"),
1904 BitmapPtr->hasLocalLinkage(),
true,
nullptr,
1905 nullptr,
nullptr, 0,
1907 BitmapPtr->addDebugInfo(DICounter);
1908 DB.finalizeSubprogram(SP);
1913 CompilerUsedVars.push_back(
PD.RegionBitmaps);
1916 return PD.RegionBitmaps;
1923 auto &Ctx =
M.getContext();
1929 std::vector<Constant *> InitialValues(NumCounters,
1947 auto &
PD = ProfileDataMap[NamePtr];
1948 if (
PD.RegionCounters)
1949 return PD.RegionCounters;
1953 auto *CounterPtr = setupProfileSection(Inc, IPSK_cnts);
1954 PD.RegionCounters = CounterPtr;
1961 Metadata *FunctionNameAnnotation[] = {
1969 Metadata *NumCountersAnnotation[] = {
1978 auto *DICounter =
DB.createGlobalVariableExpression(
1979 SP, CounterPtr->getName(),
StringRef(),
SP->getFile(),
1980 0,
DB.createUnspecifiedType(
"Profile Data Type"),
1981 CounterPtr->hasLocalLinkage(),
true,
nullptr,
1982 nullptr,
nullptr, 0,
1984 CounterPtr->addDebugInfo(DICounter);
1985 DB.finalizeSubprogram(SP);
1990 CompilerUsedVars.push_back(
PD.RegionCounters);
1995 getOrCreateUniformCounters(Inc);
1998 createDataVariable(Inc);
2000 return PD.RegionCounters;
2010 auto &
PD = ProfileDataMap[NamePtr];
2011 if (
PD.UniformCounters)
2012 return PD.UniformCounters;
2014 assert(
PD.RegionCounters &&
"region counters must be created first");
2034 PD.UniformCounters = GV;
2035 CompilerUsedVars.push_back(GV);
2037 return PD.UniformCounters;
2047 auto &
PD = ProfileDataMap[NamePtr];
2064 if (
TT.isOSBinFormatXCOFF()) {
2073 std::string CntsVarName =
2075 std::string DataVarName =
2083 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
2084 NS +=
PD.NumValueSites[Kind];
2085 if (NS > 0 && ValueProfileStaticAlloc &&
2091 ValuesVar->setVisibility(Visibility);
2093 ValuesVar->setSection(
2095 ValuesVar->setAlignment(
Align(8));
2096 maybeSetComdat(ValuesVar, Fn, CntsVarName);
2109 auto *
IntPtrTy =
M.getDataLayout().getIntPtrType(
M.getContext());
2112 auto *DataTy = getProfileDataTy();
2116 Constant *Int16ArrayVals[IPVK_Last + 1];
2117 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
2118 Int16ArrayVals[Kind] = ConstantInt::get(Int16Ty,
PD.NumValueSites[Kind]);
2120 uint16_t OffloadDeviceWaveSizeVal = 0;
2143 !(DataReferencedByCode && NeedComdat && !Renamed) &&
2144 (
TT.isOSBinFormatELF() ||
2145 (!DataReferencedByCode &&
TT.isOSBinFormatCOFF()))) {
2152 if (
TT.isGPU() &&
TT.isOSBinFormatELF() &&
2166 DataSectionKind = IPSK_covdata;
2168 if (BitmapPtr !=
nullptr)
2171 RelativeUniformCounterPtr =
2173 }
else if (
TT.isNVPTX()) {
2177 DataSectionKind = IPSK_data;
2182 DataSectionKind = IPSK_data;
2183 RelativeCounterPtr =
2186 if (BitmapPtr !=
nullptr)
2197#define INSTR_PROF_DATA(Type, LLVMType, Name, Init) Init,
2202 Data->setVisibility(Visibility);
2207 Data->setComdat(
M.getOrInsertComdat(CntsVarName));
2210 maybeSetComdat(
Data, Fn, CntsVarName);
2216 CompilerUsedVars.push_back(
Data);
2222 ReferencedNames.push_back(NamePtr);
2225void InstrLowerer::emitVNodes() {
2226 if (!ValueProfileStaticAlloc)
2236 for (
auto &PD : ProfileDataMap) {
2237 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
2238 TotalNS +=
PD.second.NumValueSites[Kind];
2244 uint64_t NumCounters = TotalNS * NumCountersPerValueSite;
2252#define INSTR_PROF_MIN_VAL_COUNTS 10
2256 auto &Ctx =
M.getContext();
2257 Type *VNodeTypes[] = {
2258#define INSTR_PROF_VALUE_NODE(Type, LLVMType, Name, Init) LLVMType,
2268 VNodesVar->setSection(
2270 VNodesVar->setAlignment(
M.getDataLayout().getABITypeAlign(VNodesTy));
2273 UsedVars.push_back(VNodesVar);
2281 std::string Name = (
"__llvm_profile_sections" + CUIDPostfix).str();
2282 if (M.getNamedValue(Name))
2286 unsigned AS = M.getDataLayout().getDefaultGlobalsAddressSpace();
2292 nullptr, Sym,
nullptr,
2301 Constant *Fields[] = {
Extern(
"__start___llvm_prf_names", I8,
false, Hidden),
2302 Extern(
"__stop___llvm_prf_names", I8,
false, Hidden),
2303 Extern(
"__start___llvm_prf_cnts", I8,
false, Hidden),
2304 Extern(
"__stop___llvm_prf_cnts", I8,
false, Hidden),
2305 Extern(
"__start___llvm_prf_data", I8,
false, Hidden),
2306 Extern(
"__stop___llvm_prf_data", I8,
false, Hidden),
2307 Extern(
"__start___llvm_prf_ucnts", I8,
false, Hidden),
2308 Extern(
"__stop___llvm_prf_ucnts", I8,
false, Hidden),
2309 Extern(
"__llvm_profile_raw_version",
2314 Ctx, {PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy});
2323void InstrLowerer::emitNameData() {
2324 if (ReferencedNames.empty())
2327 std::string CompressedNameStr;
2333 auto &Ctx =
M.getContext();
2339 std::string GPUCUIDPostfix;
2344 if (
Init->isCString()) {
2345 GPUCUIDPostfix =
Init->getAsCString().str();
2346 NamesVarName += GPUCUIDPostfix;
2350 M, [GV](
Constant *
C) {
return C->stripPointerCasts() == GV; });
2356 NamesVar =
new GlobalVariable(M, NamesVal->getType(),
true, NamesLinkage,
2357 NamesVal, NamesVarName);
2358 NamesVar->setVisibility(NamesVisibility);
2360 NamesSize = CompressedNameStr.size();
2362 std::string NamesSectionName =
2366 NamesVar->setSection(NamesSectionName);
2370 NamesVar->setAlignment(
Align(1));
2373 UsedVars.push_back(NamesVar);
2375 for (
auto *NamePtr : ReferencedNames)
2381 [](
const auto &KV) { return KV.second.DataVar; });
2382 if (!GPUCUIDPostfix.empty() && HasData)
2384 CompilerUsedVars.push_back(GV);
2387void InstrLowerer::emitVTableNames() {
2392 std::string CompressedVTableNames;
2398 auto &Ctx =
M.getContext();
2400 Ctx,
StringRef(CompressedVTableNames),
false );
2409 UsedVars.push_back(VTableNamesVar);
2412void InstrLowerer::emitRegistration() {
2425 RegisterF->addFnAttr(Attribute::NoRedZone);
2428 auto *RuntimeRegisterF =
2436 IRB.CreateCall(RuntimeRegisterF,
2437 IRB.CreatePointerBitCastOrAddrSpaceCast(
Data, VoidPtrTy));
2440 IRB.CreateCall(RuntimeRegisterF,
2441 IRB.CreatePointerBitCastOrAddrSpaceCast(
Data, VoidPtrTy));
2444 Type *ParamTypes[] = {VoidPtrTy, Int64Ty};
2445 auto *NamesRegisterTy =
2447 auto *NamesRegisterF =
2450 IRB.CreateCall(NamesRegisterF, {IRB.CreatePointerBitCastOrAddrSpaceCast(
2451 NamesVar, VoidPtrTy),
2452 IRB.getInt64(NamesSize)});
2455 IRB.CreateRetVoid();
2458bool InstrLowerer::emitRuntimeHook() {
2466 if (
TT.isOSLinux() ||
TT.isOSAIX())
2480 if (
TT.isOSBinFormatELF() && !
TT.isPS()) {
2482 CompilerUsedVars.push_back(Var);
2488 User->addFnAttr(Attribute::NoInline);
2490 User->addFnAttr(Attribute::NoRedZone);
2492 if (
TT.supportsCOMDAT())
2495 User->setEntryCount(0);
2498 auto *
Load = IRB.CreateLoad(Int32Ty, Var);
2499 IRB.CreateRet(
Load);
2502 CompilerUsedVars.push_back(
User);
2507void InstrLowerer::emitUses() {
2517 if (
TT.isOSBinFormatELF() ||
TT.isOSBinFormatMachO() ||
2518 (
TT.isOSBinFormatCOFF() && !DataReferencedByCode))
2529void InstrLowerer::emitInitialization() {
2546 F->addFnAttr(Attribute::NoInline);
2548 F->addFnAttr(Attribute::NoRedZone);
2552 IRB.CreateCall(RegisterF, {});
2553 IRB.CreateRetVoid();
2564 if (getSampledInstrumentationConfig().UseShort) {
2574 SamplingVar->setThreadLocal(
true);
2575 Triple TT(M.getTargetTriple());
2576 if (TT.supportsCOMDAT()) {
2578 SamplingVar->setComdat(M.getOrInsertComdat(VarName));
2587StructType *InstrLowerer::getProfileDataTy() {
2589 return ProfileDataTy;
2591 auto &Ctx =
M.getContext();
2592 auto *
IntPtrTy =
M.getDataLayout().getIntPtrType(
M.getContext());
2595 Type *DataTypes[] = {
2596#define INSTR_PROF_DATA(Type, LLVMType, Name, Init) LLVMType,
2600 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< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
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.
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.
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...
void analyze(ParentT F)
Create the loop forest for a function.
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(LLVMContext &C)
This constructs an opaque pointer to an object in the default address space (address space zero).
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object 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.
@ 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.