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,
481 ArrayRef<Instruction *> InsertPts,
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);
538 ArrayRef<Instruction *> InsertPts;
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) {
579 auto &OrigCandidates = LoopToCandidates[&L];
581 OrigCandidates.clear();
582 bool RC = promoteCandidates(Candidates, NumPromoted);
584 "Did not expect new candidates to be added to current loop");
595 for (
auto &Cand : Candidates)
596 if (Cand.first !=
nullptr && Cand.second !=
nullptr)
597 makeAtomic(Cand.first, Cand.second);
602 bool promoteCandidates(SmallVectorImpl<LoadStorePair> &Candidates,
603 int64_t *NumPromoted) {
605 if (ExitBlocks.size() == 0)
613 if (SkipRetExitBlock) {
614 for (
auto *BB : ExitBlocks)
619 unsigned MaxProm = getMaxNumOfPromotionsInLoop(&L);
623 unsigned Promoted = 0;
624 for (
auto &Cand : Candidates) {
626 SSAUpdater
SSA(&NewPHIs);
627 Value *InitVal = ConstantInt::get(Cand.first->getType(), 0);
631 auto *BB = Cand.first->getParent();
632 auto InstrCount = BFI->getBlockProfileCount(BB);
635 auto PreheaderCount = BFI->getBlockProfileCount(L.getLoopPreheader());
638 if (PreheaderCount && (*PreheaderCount * 3) >= (*
InstrCount * 2))
642 PGOCounterPromoterHelper Promoter(
643 Cand.first, Cand.second,
SSA, InitVal, L.getLoopPreheader(),
644 ExitBlocks, InsertPts, LoopToCandidates, LI, IsAtomic);
645 Promoter.run(SmallVector<Instruction *, 2>({Cand.first, Cand.second}));
647 Cand = {
nullptr,
nullptr};
650 if (Promoted >= MaxProm)
654 if (MaxNumOfPromotions != -1 && *NumPromoted >= MaxNumOfPromotions)
658 LLVM_DEBUG(
dbgs() << Promoted <<
" counters promoted for loop (depth="
659 << L.getLoopDepth() <<
")\n");
660 return Promoted != 0;
664 bool allowSpeculativeCounterPromotion(
Loop *LP) {
665 SmallVector<BasicBlock *, 8> ExitingBlocks;
666 L.getExitingBlocks(ExitingBlocks);
668 if (ExitingBlocks.
size() == 1)
670 if (ExitingBlocks.
size() > SpeculativeCounterPromotionMaxExiting)
678 isPromotionPossible(
Loop *LP,
679 const SmallVectorImpl<BasicBlock *> &LoopExitBlocks) {
697 unsigned getMaxNumOfPromotionsInLoop(
Loop *LP) {
698 SmallVector<BasicBlock *, 8> LoopExitBlocks;
700 if (!isPromotionPossible(LP, LoopExitBlocks))
703 SmallVector<BasicBlock *, 8> ExitingBlocks;
711 if (ExitingBlocks.
size() == 1)
712 return MaxNumOfPromotionsPerLoop;
714 if (ExitingBlocks.
size() > SpeculativeCounterPromotionMaxExiting)
718 if (SpeculativeCounterPromotionToLoop)
719 return MaxNumOfPromotionsPerLoop;
722 unsigned MaxProm = MaxNumOfPromotionsPerLoop;
723 for (
auto *TargetBlock : LoopExitBlocks) {
724 auto *TargetLoop = LI.getLoopFor(TargetBlock);
727 unsigned MaxPromForTarget = getMaxNumOfPromotionsInLoop(TargetLoop);
728 unsigned PendingCandsInTarget = LoopToCandidates[TargetLoop].size();
730 std::min(MaxProm, std::max(MaxPromForTarget, PendingCandsInTarget) -
731 PendingCandsInTarget);
736 DenseMap<Loop *, SmallVector<LoadStorePair, 8>> &LoopToCandidates;
737 SmallVector<BasicBlock *, 8> ExitBlocks;
738 SmallVector<Instruction *, 8> InsertPts;
741 BlockFrequencyInfo *BFI;
745enum class ValueProfilingCallType {
763 InstrLowerer Lowerer(M, Options, GetTLI, IsCS);
764 if (!Lowerer.lower())
815 if (!isSamplingEnabled())
818 SampledInstrumentationConfig config = getSampledInstrumentationConfig();
821 return Builder.getInt16(
C);
823 return Builder.getInt32(
C);
833 assert(SamplingVar &&
"SamplingVar not set properly");
837 Value *NewSamplingVarVal;
841 auto *LoadSamplingVar = CondBuilder.CreateLoad(SamplingVarTy, SamplingVar);
842 if (config.IsSimpleSampling) {
846 IncBuilder.CreateAdd(LoadSamplingVar, GetConstant(IncBuilder, 1));
847 SamplingVarIncr = IncBuilder.CreateStore(NewSamplingVarVal, SamplingVar);
850 auto *DurationCond = CondBuilder.CreateICmpULE(
851 LoadSamplingVar, GetConstant(CondBuilder, config.BurstDuration - 1));
852 BranchWeight = MDB.createBranchWeights(
853 config.BurstDuration, config.Period - config.BurstDuration);
855 DurationCond,
I,
false, BranchWeight);
858 IncBuilder.CreateAdd(LoadSamplingVar, GetConstant(IncBuilder, 1));
859 SamplingVarIncr = IncBuilder.CreateStore(NewSamplingVarVal, SamplingVar);
863 if (config.IsFastSampling)
869 auto *PeriodCond = PeriodCondBuilder.CreateICmpUGE(
870 NewSamplingVarVal, GetConstant(PeriodCondBuilder, config.Period));
871 BranchWeight = MDB.createBranchWeights(1, config.Period - 1);
873 &ElseTerm, BranchWeight);
876 if (config.IsSimpleSampling)
880 ResetBuilder.CreateStore(GetConstant(ResetBuilder, 0), SamplingVar);
884bool InstrLowerer::lowerIntrinsics(
Function *
F) {
885 bool MadeChange =
false;
886 PromotionCandidates.clear();
899 for (
auto *Instr : InstrProfInsts) {
902 lowerIncrement(IPIS);
914 lowerValueProfileInst(IPVP);
917 IPMP->eraseFromParent();
920 lowerMCDCTestVectorBitmapUpdate(IPBU);
928 promoteCounterLoadStores(
F);
932bool InstrLowerer::isRuntimeCounterRelocationEnabled()
const {
934 if (
TT.isOSBinFormatMachO())
937 if (RuntimeCounterRelocation.getNumOccurrences() > 0)
938 return RuntimeCounterRelocation;
941 return TT.isOSFuchsia();
944bool InstrLowerer::isSamplingEnabled()
const {
945 if (SampledInstr.getNumOccurrences() > 0)
950bool InstrLowerer::isCounterPromotionEnabled()
const {
951 if (DoCounterPromotion.getNumOccurrences() > 0)
952 return DoCounterPromotion;
953 return Options.DoCounterPromotion;
956bool InstrLowerer::isAtomic()
const {
957 return Options.Atomic || AtomicCounterUpdateAll;
962 const Value *Addr =
nullptr;
964 Addr = LI->getOperand(0);
966 Addr = LI->getOperand(1);
976void InstrLowerer::promoteCounterLoadStores(
Function *
F) {
977 if (!isCounterPromotionEnabled())
986 std::unique_ptr<BlockFrequencyInfo> BFI;
987 if (
Options.UseBFIInPromotion) {
988 std::unique_ptr<BranchProbabilityInfo> BPI;
993 for (
const auto &LoadStore : PromotionCandidates) {
1000 makeAtomic(CounterLoad, CounterStore);
1003 LoopPromotionCandidates[ParentLoop].emplace_back(CounterLoad, CounterStore);
1011 PGOCounterPromoter Promoter(LoopPromotionCandidates, *
Loop, LI, BFI.get(),
1013 Promoter.run(&TotalCountersPromoted);
1016 if (
isAtomic() && VerifyAtomicPromotion)
1022 if (TT.isOSFuchsia())
1030 auto containsIntrinsic = [&](
int ID) {
1032 return !
F->use_empty();
1035 return containsIntrinsic(Intrinsic::instrprof_cover) ||
1036 containsIntrinsic(Intrinsic::instrprof_increment) ||
1037 containsIntrinsic(Intrinsic::instrprof_increment_step) ||
1038 containsIntrinsic(Intrinsic::instrprof_timestamp) ||
1039 containsIntrinsic(Intrinsic::instrprof_value_profile);
1042bool InstrLowerer::lower() {
1043 bool MadeChange =
false;
1045 if (NeedsRuntimeHook)
1046 MadeChange = emitRuntimeHook();
1048 if (!IsCS && isSamplingEnabled())
1055 if (!ContainsProfiling && !CoverageNamesVar)
1066 computeNumValueSiteCounts(Ind);
1068 if (FirstProfInst ==
nullptr &&
1073 static_cast<void>(getOrCreateRegionBitmaps(Params));
1080 if (FirstProfInst !=
nullptr) {
1081 static_cast<void>(getOrCreateRegionCounters(FirstProfInst));
1088 if (GV.hasMetadata(LLVMContext::MD_type))
1089 getOrCreateVTableProfData(&GV);
1092 MadeChange |= lowerIntrinsics(&
F);
1094 if (CoverageNamesVar) {
1095 lowerCoverageData(CoverageNamesVar);
1110 if (!NeedsRuntimeHook && ContainsProfiling)
1115 emitInitialization();
1121 ValueProfilingCallType CallType = ValueProfilingCallType::Default) {
1126 if (
auto AK = TLI.getExtAttrForI32Param(
false))
1127 AL = AL.addParamAttribute(M.getContext(), 2, AK);
1129 assert((CallType == ValueProfilingCallType::Default ||
1130 CallType == ValueProfilingCallType::MemOp) &&
1131 "Must be Default or MemOp");
1132 Type *ParamTypes[] = {
1133#define VALUE_PROF_FUNC_PARAM(ParamType, ParamName, ParamLLVMType) ParamLLVMType
1136 auto *ValueProfilingCallTy =
1138 StringRef FuncName = CallType == ValueProfilingCallType::Default
1141 return M.getOrInsertFunction(FuncName, ValueProfilingCallTy, AL);
1148 auto &
PD = ProfileDataMap[
Name];
1150 std::max(
PD.NumValueSites[ValueKind], (uint32_t)(Index + 1));
1159 "Value profiling is not yet supported with lightweight instrumentation");
1161 auto It = ProfileDataMap.find(Name);
1162 assert(It != ProfileDataMap.end() && It->second.DataVar &&
1163 "value profiling detected in function with no counter increment");
1169 Index += It->second.NumValueSites[Kind];
1172 bool IsMemOpSize = (Ind->
getValueKind()->getZExtValue() ==
1173 llvm::InstrProfValueKind::IPVK_MemOPSize);
1197 if (
auto AK = TLI->getExtAttrForI32Param(
false))
1220 if (
TT.supportsCOMDAT())
1221 Bias->
setComdat(
M.getOrInsertComdat(VarName));
1227 auto *
Counters = getOrCreateRegionCounters(
I);
1236 if (!isRuntimeCounterRelocationEnabled())
1241 LoadInst *&BiasLI = FunctionToProfileBiasMap[Fn];
1245 BiasLI = EntryBuilder.CreateLoad(Int64Ty, Bias,
"profc_bias");
1247 BiasLI->
setMetadata(LLVMContext::MD_invariant_load,
1255 auto *Bitmaps = getOrCreateRegionBitmaps(
I);
1256 if (!isRuntimeCounterRelocationEnabled())
1264 auto *BiasLI = EntryBuilder.CreateLoad(Int64Ty, Bias,
"profbm_bias");
1266 BiasLI->
setMetadata(LLVMContext::MD_invariant_load,
1271 return Builder.
CreatePtrAdd(Bitmaps, BiasLI,
"profbm_addr");
1275 auto *Addr = getCounterAddress(CoverInstruction);
1277 if (ConditionalCounterUpdate) {
1279 auto &Ctx = CoverInstruction->
getParent()->getContext();
1293void InstrLowerer::lowerTimestamp(
1296 "timestamp probes are always the first probe for a function");
1297 auto &Ctx =
M.getContext();
1298 auto *TimestampAddr = getCounterAddress(TimestampInstruction);
1302 auto Callee =
M.getOrInsertFunction(
1308InstrLowerer::GPUPGOInvariants &
1309InstrLowerer::getOrCreateGPUInvariants(
Function *
F) {
1310 auto It = GPUInvariantsCache.find(
F);
1311 if (It != GPUInvariantsCache.end())
1321 if (OffloadPGOSampling > 0) {
1324 RTLIB::impl___llvm_profile_sampling_gpu),
1327 IsSampledFn, {ConstantInt::get(Int32Ty, OffloadPGOSampling)},
1329 Matched = Builder.
CreateICmpNE(SampledInt, ConstantInt::get(Int32Ty, 0),
1333 auto &Inv = GPUInvariantsCache[
F];
1334 Inv.Matched = Matched;
1342 auto &Inv = getOrCreateGPUInvariants(
F);
1348 auto *Addr = getCounterAddress(Inc);
1353 if (!Inv.WaveSizeStored) {
1354 Inv.WaveSizeStored =
true;
1356 auto &
PD = ProfileDataMap[NamePtr];
1358 IRBuilder<> EntryBuilder(&*
F->getEntryBlock().getFirstInsertionPt());
1359 Value *WaveSize16 =
nullptr;
1363 if (
TT.isAMDGPU()) {
1369 Value *WaveSize = EntryBuilder.CreateCall(WaveSizeFn);
1370 WaveSize16 = EntryBuilder.CreateTrunc(
1376 Value *WaveSizeAddr = EntryBuilder.CreateStructGEP(
1377 PD.DataVar->getValueType(),
PD.DataVar, 9,
"profd.wavesize");
1378 EntryBuilder.CreateStore(WaveSize16, WaveSizeAddr);
1382 GlobalVariable *UniformCounters = getOrCreateUniformCounters(Inc);
1384 if (UniformCounters) {
1387 UniformCounters->
getValueType(), UniformCounters, UniformIndices,
1397 {PtrTy, PtrTy, Int64Ty},
false);
1400 RTLIB::impl___llvm_profile_instrument_gpu),
1403 if (OffloadPGOSampling > 0) {
1411 HeadBuilder.CreateCondBr(Inv.Matched, ThenBB, ContBB);
1414 ThenBuilder.CreateCall(Callee, {CastAddr, UniformAddrArg, StepI64});
1415 ThenBuilder.CreateBr(ContBB);
1417 Builder.
CreateCall(Callee, {CastAddr, UniformAddrArg, StepI64});
1423 auto *Addr = getCounterAddress(Inc);
1426 if ((!isCounterPromotionEnabled() &&
isAtomic()) ||
1435 if (isCounterPromotionEnabled())
1441void InstrLowerer::lowerCoverageData(
GlobalVariable *CoverageNamesVar) {
1446 Value *
V =
NC->stripPointerCasts();
1451 ReferencedNames.push_back(Name);
1453 NC->dropAllReferences();
1458void InstrLowerer::lowerMCDCTestVectorBitmapUpdate(
1460 auto &Ctx =
M.getContext();
1465 auto *BitmapAddr = getBitmapAddress(Update);
1470 Builder.
CreateLoad(Int32Ty, MCDCCondBitmapAddr,
"mcdc.temp"),
1475 auto *BitmapByteOffset = Builder.
CreateLShr(Temp, 0x3);
1479 auto *BitmapByteAddr =
1493 auto *Bitmap = Builder.
CreateLoad(Int8Ty, BitmapByteAddr,
"mcdc.bits");
1534 return (Prefix + Name).str();
1540 return (Prefix + Name).str();
1549 if (!profDataReferencedByCode(*
F->getParent()))
1553 bool HasAvailableExternallyLinkage =
F->hasAvailableExternallyLinkage();
1554 if (!
F->hasLinkOnceLinkage() && !
F->hasLocalLinkage() &&
1555 !HasAvailableExternallyLinkage)
1561 if (HasAvailableExternallyLinkage &&
1562 F->hasFnAttribute(Attribute::AlwaysInline))
1568 if (
F->hasLocalLinkage() &&
F->hasComdat())
1578 return F->hasAddressTaken() ||
F->hasLinkOnceLinkage();
1631 Fn->
getName() +
".local", Fn);
1660 if (TT.isOSBinFormatELF() || TT.isOSBinFormatCOFF() ||
1661 TT.isOSBinFormatMachO() || TT.isOSBinFormatXCOFF() ||
1662 TT.isOSBinFormatWasm())
1675 bool UseComdat = (NeedComdat ||
TT.isOSBinFormatELF());
1690 StringRef GroupName =
TT.isOSBinFormatCOFF() && DataReferencedByCode
1693 Comdat *
C =
M.getOrInsertComdat(GroupName);
1713 if (!profDataReferencedByCode(*GV->
getParent()))
1738void InstrLowerer::getOrCreateVTableProfData(
GlobalVariable *GV) {
1740 "Value profiling is not supported with lightweight instrumentation");
1751 auto It = VTableDataMap.find(GV);
1752 if (It != VTableDataMap.end() && It->second)
1760 if (
TT.isOSBinFormatXCOFF()) {
1766 Type *DataTypes[] = {
1767#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Init) LLVMType,
1769#undef INSTR_PROF_VTABLE_DATA
1782#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Init) Init,
1784#undef INSTR_PROF_VTABLE_DATA
1792 Data->setVisibility(Visibility);
1796 maybeSetComdat(
Data, GV,
Data->getName());
1798 VTableDataMap[GV] =
Data;
1800 ReferencedVTables.push_back(GV);
1804 UsedVars.push_back(
Data);
1827 if (
TT.isOSBinFormatXCOFF()) {
1836 if (IPSK == IPSK_cnts) {
1840 Ptr = createRegionCounters(CntrIncrement, VarName,
Linkage);
1841 }
else if (IPSK == IPSK_bitmap) {
1846 Ptr = createRegionBitmaps(BitmapUpdate, VarName,
Linkage);
1855 Ptr->
setComdat(
M.getOrInsertComdat(VarName));
1859 maybeSetComdat(Ptr, Fn, VarName);
1879 auto &
PD = ProfileDataMap[NamePtr];
1880 if (
PD.RegionBitmaps)
1881 return PD.RegionBitmaps;
1885 auto *BitmapPtr = setupProfileSection(Inc, IPSK_bitmap);
1886 PD.RegionBitmaps = BitmapPtr;
1889 if (
PD.NumBitmapBytes &&
1895 Metadata *FunctionNameAnnotation[] = {
1899 Metadata *NumBitmapBitsAnnotation[] = {
1907 auto *DICounter =
DB.createGlobalVariableExpression(
1908 SP, BitmapPtr->getName(),
StringRef(),
SP->getFile(),
1909 0,
DB.createUnspecifiedType(
"Profile Bitmap Type"),
1910 BitmapPtr->hasLocalLinkage(),
true,
nullptr,
1911 nullptr,
nullptr, 0,
1913 BitmapPtr->addDebugInfo(DICounter);
1914 DB.finalizeSubprogram(SP);
1919 CompilerUsedVars.push_back(
PD.RegionBitmaps);
1922 return PD.RegionBitmaps;
1929 auto &Ctx =
M.getContext();
1935 std::vector<Constant *> InitialValues(NumCounters,
1953 auto &
PD = ProfileDataMap[NamePtr];
1954 if (
PD.RegionCounters)
1955 return PD.RegionCounters;
1959 auto *CounterPtr = setupProfileSection(Inc, IPSK_cnts);
1960 PD.RegionCounters = CounterPtr;
1967 Metadata *FunctionNameAnnotation[] = {
1975 Metadata *NumCountersAnnotation[] = {
1984 auto *DICounter =
DB.createGlobalVariableExpression(
1985 SP, CounterPtr->getName(),
StringRef(),
SP->getFile(),
1986 0,
DB.createUnspecifiedType(
"Profile Data Type"),
1987 CounterPtr->hasLocalLinkage(),
true,
nullptr,
1988 nullptr,
nullptr, 0,
1990 CounterPtr->addDebugInfo(DICounter);
1991 DB.finalizeSubprogram(SP);
1996 CompilerUsedVars.push_back(
PD.RegionCounters);
2001 getOrCreateUniformCounters(Inc);
2004 createDataVariable(Inc);
2006 return PD.RegionCounters;
2016 auto &
PD = ProfileDataMap[NamePtr];
2017 if (
PD.UniformCounters)
2018 return PD.UniformCounters;
2020 assert(
PD.RegionCounters &&
"region counters must be created first");
2040 PD.UniformCounters = GV;
2041 CompilerUsedVars.push_back(GV);
2043 return PD.UniformCounters;
2053 auto &
PD = ProfileDataMap[NamePtr];
2070 if (
TT.isOSBinFormatXCOFF()) {
2079 std::string CntsVarName =
2081 std::string DataVarName =
2089 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
2090 NS +=
PD.NumValueSites[Kind];
2091 if (NS > 0 && ValueProfileStaticAlloc &&
2097 ValuesVar->setVisibility(Visibility);
2099 ValuesVar->setSection(
2101 ValuesVar->setAlignment(
Align(8));
2102 maybeSetComdat(ValuesVar, Fn, CntsVarName);
2115 auto *
IntPtrTy =
M.getDataLayout().getIntPtrType(
M.getContext());
2118 auto *DataTy = getProfileDataTy();
2122 Constant *Int16ArrayVals[IPVK_Last + 1];
2123 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
2124 Int16ArrayVals[Kind] = ConstantInt::get(Int16Ty,
PD.NumValueSites[Kind]);
2126 uint16_t OffloadDeviceWaveSizeVal = 0;
2149 !(DataReferencedByCode && NeedComdat && !Renamed) &&
2150 (
TT.isOSBinFormatELF() ||
2151 (!DataReferencedByCode &&
TT.isOSBinFormatCOFF()))) {
2158 if (
TT.isGPU() &&
TT.isOSBinFormatELF() &&
2172 DataSectionKind = IPSK_covdata;
2174 if (BitmapPtr !=
nullptr)
2177 RelativeUniformCounterPtr =
2179 }
else if (
TT.isNVPTX()) {
2183 DataSectionKind = IPSK_data;
2188 DataSectionKind = IPSK_data;
2189 RelativeCounterPtr =
2192 if (BitmapPtr !=
nullptr)
2203#define INSTR_PROF_DATA(Type, LLVMType, Name, Init) Init,
2208 Data->setVisibility(Visibility);
2213 Data->setComdat(
M.getOrInsertComdat(CntsVarName));
2216 maybeSetComdat(
Data, Fn, CntsVarName);
2222 CompilerUsedVars.push_back(
Data);
2228 ReferencedNames.push_back(NamePtr);
2231void InstrLowerer::emitVNodes() {
2232 if (!ValueProfileStaticAlloc)
2242 for (
auto &PD : ProfileDataMap) {
2243 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
2244 TotalNS +=
PD.second.NumValueSites[Kind];
2250 uint64_t NumCounters = TotalNS * NumCountersPerValueSite;
2258#define INSTR_PROF_MIN_VAL_COUNTS 10
2262 auto &Ctx =
M.getContext();
2263 Type *VNodeTypes[] = {
2264#define INSTR_PROF_VALUE_NODE(Type, LLVMType, Name, Init) LLVMType,
2274 VNodesVar->setSection(
2276 VNodesVar->setAlignment(
M.getDataLayout().getABITypeAlign(VNodesTy));
2279 UsedVars.push_back(VNodesVar);
2287 std::string Name = (
"__llvm_profile_sections" + CUIDPostfix).str();
2288 if (M.getNamedValue(Name))
2292 unsigned AS = M.getDataLayout().getDefaultGlobalsAddressSpace();
2298 nullptr, Sym,
nullptr,
2307 Constant *Fields[] = {
Extern(
"__start___llvm_prf_names", I8,
false, Hidden),
2308 Extern(
"__stop___llvm_prf_names", I8,
false, Hidden),
2309 Extern(
"__start___llvm_prf_cnts", I8,
false, Hidden),
2310 Extern(
"__stop___llvm_prf_cnts", I8,
false, Hidden),
2311 Extern(
"__start___llvm_prf_data", I8,
false, Hidden),
2312 Extern(
"__stop___llvm_prf_data", I8,
false, Hidden),
2313 Extern(
"__start___llvm_prf_ucnts", I8,
false, Hidden),
2314 Extern(
"__stop___llvm_prf_ucnts", I8,
false, Hidden),
2315 Extern(
"__llvm_profile_raw_version",
2320 Ctx, {PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy});
2329void InstrLowerer::emitNameData() {
2330 if (ReferencedNames.empty())
2333 std::string CompressedNameStr;
2339 auto &Ctx =
M.getContext();
2345 std::string GPUCUIDPostfix;
2350 if (
Init->isCString()) {
2351 GPUCUIDPostfix =
Init->getAsCString().str();
2352 NamesVarName += GPUCUIDPostfix;
2356 M, [GV](
Constant *
C) {
return C->stripPointerCasts() == GV; });
2362 NamesVar =
new GlobalVariable(M, NamesVal->getType(),
true, NamesLinkage,
2363 NamesVal, NamesVarName);
2364 NamesVar->setVisibility(NamesVisibility);
2366 NamesSize = CompressedNameStr.size();
2368 std::string NamesSectionName =
2372 NamesVar->setSection(NamesSectionName);
2376 NamesVar->setAlignment(
Align(1));
2379 UsedVars.push_back(NamesVar);
2381 for (
auto *NamePtr : ReferencedNames)
2387 [](
const auto &KV) { return KV.second.DataVar; });
2388 if (!GPUCUIDPostfix.empty() && HasData)
2390 CompilerUsedVars.push_back(GV);
2393void InstrLowerer::emitVTableNames() {
2398 std::string CompressedVTableNames;
2404 auto &Ctx =
M.getContext();
2406 Ctx,
StringRef(CompressedVTableNames),
false );
2415 UsedVars.push_back(VTableNamesVar);
2418void InstrLowerer::emitRegistration() {
2431 RegisterF->addFnAttr(Attribute::NoRedZone);
2434 auto *RuntimeRegisterF =
2442 IRB.CreateCall(RuntimeRegisterF,
2443 IRB.CreatePointerBitCastOrAddrSpaceCast(
Data, VoidPtrTy));
2446 IRB.CreateCall(RuntimeRegisterF,
2447 IRB.CreatePointerBitCastOrAddrSpaceCast(
Data, VoidPtrTy));
2450 Type *ParamTypes[] = {VoidPtrTy, Int64Ty};
2451 auto *NamesRegisterTy =
2453 auto *NamesRegisterF =
2456 IRB.CreateCall(NamesRegisterF, {IRB.CreatePointerBitCastOrAddrSpaceCast(
2457 NamesVar, VoidPtrTy),
2458 IRB.getInt64(NamesSize)});
2461 IRB.CreateRetVoid();
2464bool InstrLowerer::emitRuntimeHook() {
2472 if (
TT.isOSLinux() ||
TT.isOSAIX())
2486 if (
TT.isOSBinFormatELF() && !
TT.isPS()) {
2488 CompilerUsedVars.push_back(Var);
2494 User->addFnAttr(Attribute::NoInline);
2496 User->addFnAttr(Attribute::NoRedZone);
2498 if (
TT.supportsCOMDAT())
2501 User->setEntryCount(0);
2504 auto *
Load = IRB.CreateLoad(Int32Ty, Var);
2505 IRB.CreateRet(
Load);
2508 CompilerUsedVars.push_back(
User);
2513void InstrLowerer::emitUses() {
2523 if (
TT.isOSBinFormatELF() ||
TT.isOSBinFormatMachO() ||
2524 (
TT.isOSBinFormatCOFF() && !DataReferencedByCode))
2535void InstrLowerer::emitInitialization() {
2552 F->addFnAttr(Attribute::NoInline);
2554 F->addFnAttr(Attribute::NoRedZone);
2558 IRB.CreateCall(RegisterF, {});
2559 IRB.CreateRetVoid();
2570 if (getSampledInstrumentationConfig().UseShort) {
2580 SamplingVar->setThreadLocal(
true);
2581 Triple TT(M.getTargetTriple());
2582 if (TT.supportsCOMDAT()) {
2584 SamplingVar->setComdat(M.getOrInsertComdat(VarName));
2593StructType *InstrLowerer::getProfileDataTy() {
2595 return ProfileDataTy;
2597 auto &Ctx =
M.getContext();
2598 auto *
IntPtrTy =
M.getDataLayout().getIntPtrType(
M.getContext());
2601 Type *DataTypes[] = {
2602#define INSTR_PROF_DATA(Type, LLVMType, Name, Init) LLVMType,
2606 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)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the 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.
LLVM_ABI std::string getIRPGOObjectName(const GlobalObject &GO, bool InLTO=false)
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)
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.
IRBuilder(LLVMContext &, FolderTy, InserterTy) -> IRBuilder< FolderTy, InserterTy >
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.
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.