71#define DEBUG_TYPE "instrprof"
80 return InstrumentationOptions::Global.profile_correlate.has_value();
85struct SampledInstrumentationConfig {
86 unsigned BurstDuration;
89 bool IsSimpleSampling;
93static SampledInstrumentationConfig
94getSampledInstrumentationConfig(
const InstrumentationOptions &Opts) {
95 SampledInstrumentationConfig config;
96 config.BurstDuration = Opts.sampled_instr_burst_duration;
97 config.Period = Opts.sampled_instr_period;
98 if (config.BurstDuration > config.Period)
100 "SampledBurstDuration must be less than or equal to SampledPeriod");
101 if (config.Period == 0 || config.BurstDuration == 0)
103 "SampledPeriod and SampledBurstDuration must be greater than 0");
104 config.IsSimpleSampling = (config.BurstDuration == 1);
107 config.IsFastSampling =
108 (!config.IsSimpleSampling && config.Period == USHRT_MAX + 1);
109 config.UseShort = (config.Period <= USHRT_MAX) || config.IsFastSampling;
113using LoadStorePair = std::pair<Instruction *, Instruction *>;
117 assert(Addition && Addition->getOpcode() == Instruction::BinaryOps::Add);
118 auto *Addend = Addition->getOperand(1);
123 Store->eraseFromParent();
124 Addition->eraseFromParent();
125 Load->eraseFromParent();
138static bool enablesValueProfiling(
const Module &M) {
140 getIntModuleFlagOrZero(M,
"EnableValueProfiling") != 0;
144static bool profDataReferencedByCode(
const Module &M) {
145 return enablesValueProfiling(M);
148class InstrLowerer final {
150 InstrLowerer(
const InstrumentationOptions &Opts,
Module &M,
151 const InstrProfOptions &Options,
152 std::function<
const TargetLibraryInfo &(
Function &
F)> GetTLI,
154 : Opts(Opts), M(M), Options(Options), TT(M.getTargetTriple()), IsCS(IsCS),
155 GetTLI(GetTLI), DataReferencedByCode(profDataReferencedByCode(M)) {}
160 const InstrumentationOptions &Opts;
162 const InstrProfOptions Options;
167 std::function<
const TargetLibraryInfo &(
Function &
F)> GetTLI;
169 const bool DataReferencedByCode;
171 struct PerFunctionProfileData {
172 uint32_t NumValueSites[IPVK_Last + 1] = {};
173 GlobalVariable *RegionCounters =
nullptr;
174 GlobalVariable *UniformCounters =
176 GlobalVariable *DataVar =
nullptr;
177 GlobalVariable *RegionBitmaps =
nullptr;
178 uint32_t NumBitmapBytes = 0;
180 PerFunctionProfileData() =
default;
182 DenseMap<GlobalVariable *, PerFunctionProfileData> ProfileDataMap;
185 DenseMap<GlobalVariable *, GlobalVariable *> VTableDataMap;
188 DenseMap<const Function *, LoadInst *> FunctionToProfileBiasMap;
189 std::vector<GlobalValue *> CompilerUsedVars;
190 std::vector<GlobalValue *> UsedVars;
191 std::vector<GlobalVariable *> ReferencedNames;
194 std::vector<GlobalVariable *> ReferencedVTables;
195 GlobalVariable *NamesVar =
nullptr;
196 size_t NamesSize = 0;
198 StructType *ProfileDataTy =
nullptr;
201 std::vector<LoadStorePair> PromotionCandidates;
203 int64_t TotalCountersPromoted = 0;
208 struct GPUPGOInvariants {
209 Value *Matched =
nullptr;
210 bool WaveSizeStored =
false;
212 DenseMap<Function *, GPUPGOInvariants> GPUInvariantsCache;
215 GPUPGOInvariants &getOrCreateGPUInvariants(
Function *
F);
222 void promoteCounterLoadStores(
Function *
F);
225 bool isRuntimeCounterRelocationEnabled()
const;
228 bool isCounterPromotionEnabled()
const;
234 bool isSamplingEnabled()
const;
237 void computeNumValueSiteCounts(InstrProfValueProfileInst *Ins);
240 void lowerValueProfileInst(InstrProfValueProfileInst *Ins);
243 void lowerCover(InstrProfCoverInst *Inc);
247 void lowerTimestamp(InstrProfTimestampInst *TimestampInstruction);
250 void lowerIncrement(InstrProfIncrementInst *Inc);
253 void lowerCoverageData(GlobalVariable *CoverageNamesVar);
257 void lowerMCDCTestVectorBitmapUpdate(InstrProfMCDCTVBitmapUpdate *Ins);
261 GlobalVariable *getOrCreateBiasVar(StringRef VarName);
265 Value *getCounterAddress(InstrProfCntrInstBase *
I);
268 void doSampling(Instruction *
I);
274 GlobalVariable *getOrCreateRegionCounters(InstrProfCntrInstBase *Inc);
278 GlobalVariable *getOrCreateUniformCounters(InstrProfCntrInstBase *Inc);
281 GlobalVariable *createRegionCounters(InstrProfCntrInstBase *Inc,
287 Value *getBitmapAddress(InstrProfMCDCTVBitmapUpdate *
I);
293 GlobalVariable *getOrCreateRegionBitmaps(InstrProfMCDCBitmapInstBase *Inc);
300 GlobalVariable *createRegionBitmaps(InstrProfMCDCBitmapInstBase *Inc,
305 void maybeSetComdat(GlobalVariable *GV, GlobalObject *GO, StringRef VarName);
308 GlobalVariable *setupProfileSection(InstrProfInstBase *Inc,
312 void createDataVariable(InstrProfCntrInstBase *Inc);
315 void getOrCreateVTableProfData(GlobalVariable *GV);
321 void emitVTableNames();
327 void emitRegistration();
331 bool emitRuntimeHook();
338 void emitInitialization();
341 StructType *getProfileDataTy();
353 PGOCounterPromoterHelper(
354 const InstrumentationOptions &Opts, Instruction *L, Instruction *S,
355 SSAUpdater &
SSA,
Value *Init, BasicBlock *PH,
358 LoopInfo &LI,
bool IsAtomic)
359 : LoadAndStorePromoter({
L, S},
SSA), Opts(Opts),
Store(S),
360 ExitBlocks(ExitBlocks), InsertPts(InsertPts),
361 LoopToCandidates(LoopToCands), LI(LI), IsAtomic(IsAtomic) {
364 SSA.AddAvailableValue(PH, Init);
367 void doExtraRewritesBeforeFinalDeletion()
override {
368 for (
unsigned i = 0, e = ExitBlocks.size(); i != e; ++i) {
374 Value *LiveInValue =
SSA.GetValueInMiddleOfBlock(ExitBlock);
386 assert(OrigBiasInst->getOpcode() == Instruction::BinaryOps::Add);
387 Value *BiasInst = Builder.Insert(OrigBiasInst->clone());
388 Addr = Builder.CreateIntToPtr(BiasInst,
392 Opts.iterative_counter_promotion ? LI.getLoopFor(ExitBlock) :
nullptr;
395 if ((IsAtomic && !TargetLoop) || Opts.atomic_counter_update_promoted)
397 MaybeAlign(), AtomicOrdering::Monotonic);
399 LoadInst *OldVal = Builder.CreateLoad(Ty, Addr,
"pgocount.promoted");
400 auto *NewVal = Builder.CreateAdd(OldVal, LiveInValue);
401 auto *NewStore = Builder.CreateStore(NewVal, Addr);
405 LoopToCandidates[TargetLoop].emplace_back(OldVal, NewStore);
411 const InstrumentationOptions &Opts;
414 ArrayRef<Instruction *> InsertPts;
415 DenseMap<Loop *, SmallVector<LoadStorePair, 8>> &LoopToCandidates;
423class PGOCounterPromoter {
426 const InstrumentationOptions &Opts,
428 Loop &CurLoop, LoopInfo &LI, BlockFrequencyInfo *BFI,
bool IsAtomic)
429 : Opts(Opts), LoopToCandidates(LoopToCands), L(CurLoop), LI(LI), BFI(BFI),
434 SmallVector<BasicBlock *, 8> LoopExitBlocks;
435 SmallPtrSet<BasicBlock *, 8>
BlockSet;
437 L.getExitBlocks(LoopExitBlocks);
438 if (!isPromotionPossible(&L, LoopExitBlocks))
441 for (BasicBlock *ExitBlock : LoopExitBlocks) {
446 ExitBlocks.push_back(ExitBlock);
452 bool run(int64_t *NumPromoted) {
456 auto &OrigCandidates = LoopToCandidates[&L];
458 OrigCandidates.clear();
459 bool RC = promoteCandidates(Candidates, NumPromoted);
461 "Did not expect new candidates to be added to current loop");
472 for (
auto &Cand : Candidates)
473 if (Cand.first !=
nullptr && Cand.second !=
nullptr)
474 makeAtomic(Cand.first, Cand.second);
479 bool promoteCandidates(SmallVectorImpl<LoadStorePair> &Candidates,
480 int64_t *NumPromoted) {
482 if (ExitBlocks.size() == 0)
490 if (Opts.skip_ret_exit_block) {
491 for (
auto *BB : ExitBlocks)
496 unsigned MaxProm = getMaxNumOfPromotionsInLoop(&L);
500 unsigned Promoted = 0;
501 for (
auto &Cand : Candidates) {
503 SSAUpdater
SSA(&NewPHIs);
504 Value *InitVal = ConstantInt::get(Cand.first->getType(), 0);
508 auto *BB = Cand.first->getParent();
509 auto InstrCount = BFI->getBlockProfileCount(BB);
512 auto PreheaderCount = BFI->getBlockProfileCount(L.getLoopPreheader());
515 if (PreheaderCount && (*PreheaderCount * 3) >= (*
InstrCount * 2))
519 PGOCounterPromoterHelper Promoter(
520 Opts, Cand.first, Cand.second,
SSA, InitVal, L.getLoopPreheader(),
521 ExitBlocks, InsertPts, LoopToCandidates, LI, IsAtomic);
522 Promoter.run(SmallVector<Instruction *, 2>({Cand.first, Cand.second}));
524 Cand = {
nullptr,
nullptr};
527 if (Promoted >= MaxProm)
531 if (Opts.max_counter_promotions != -1 &&
532 *NumPromoted >= Opts.max_counter_promotions)
536 LLVM_DEBUG(
dbgs() << Promoted <<
" counters promoted for loop (depth="
537 << L.getLoopDepth() <<
")\n");
538 return Promoted != 0;
542 bool allowSpeculativeCounterPromotion(
Loop *LP) {
543 SmallVector<BasicBlock *, 8> ExitingBlocks;
544 L.getExitingBlocks(ExitingBlocks);
546 if (ExitingBlocks.
size() == 1)
548 if (ExitingBlocks.
size() > Opts.speculative_counter_promotion_max_exiting)
556 isPromotionPossible(
Loop *LP,
557 const SmallVectorImpl<BasicBlock *> &LoopExitBlocks) {
575 unsigned getMaxNumOfPromotionsInLoop(
Loop *LP) {
576 SmallVector<BasicBlock *, 8> LoopExitBlocks;
578 if (!isPromotionPossible(LP, LoopExitBlocks))
581 SmallVector<BasicBlock *, 8> ExitingBlocks;
589 if (ExitingBlocks.
size() == 1)
590 return Opts.max_counter_promotions_per_loop;
592 if (ExitingBlocks.
size() > Opts.speculative_counter_promotion_max_exiting)
596 if (Opts.speculative_counter_promotion_to_loop)
597 return Opts.max_counter_promotions_per_loop;
600 unsigned MaxProm = Opts.max_counter_promotions_per_loop;
601 for (
auto *TargetBlock : LoopExitBlocks) {
602 auto *TargetLoop = LI.getLoopFor(TargetBlock);
605 unsigned MaxPromForTarget = getMaxNumOfPromotionsInLoop(TargetLoop);
606 unsigned PendingCandsInTarget = LoopToCandidates[TargetLoop].size();
608 std::min(MaxProm, std::max(MaxPromForTarget, PendingCandsInTarget) -
609 PendingCandsInTarget);
614 const InstrumentationOptions &Opts;
615 DenseMap<Loop *, SmallVector<LoadStorePair, 8>> &LoopToCandidates;
616 SmallVector<BasicBlock *, 8> ExitBlocks;
617 SmallVector<Instruction *, 8> InsertPts;
620 BlockFrequencyInfo *BFI;
624enum class ValueProfilingCallType {
642 InstrLowerer Lowerer(InstrumentationOptions::Global, M, Options, GetTLI,
644 if (!Lowerer.lower())
695 if (!isSamplingEnabled())
698 SampledInstrumentationConfig config = getSampledInstrumentationConfig(Opts);
701 return Builder.getInt16(
C);
703 return Builder.getInt32(
C);
713 assert(SamplingVar &&
"SamplingVar not set properly");
717 Value *NewSamplingVarVal;
721 auto *LoadSamplingVar = CondBuilder.CreateLoad(SamplingVarTy, SamplingVar);
722 if (config.IsSimpleSampling) {
726 IncBuilder.CreateAdd(LoadSamplingVar, GetConstant(IncBuilder, 1));
727 SamplingVarIncr = IncBuilder.CreateStore(NewSamplingVarVal, SamplingVar);
730 auto *DurationCond = CondBuilder.CreateICmpULE(
731 LoadSamplingVar, GetConstant(CondBuilder, config.BurstDuration - 1));
732 BranchWeight = MDB.createBranchWeights(
733 config.BurstDuration, config.Period - config.BurstDuration);
735 DurationCond,
I,
false, BranchWeight);
738 IncBuilder.CreateAdd(LoadSamplingVar, GetConstant(IncBuilder, 1));
739 SamplingVarIncr = IncBuilder.CreateStore(NewSamplingVarVal, SamplingVar);
743 if (config.IsFastSampling)
749 auto *PeriodCond = PeriodCondBuilder.CreateICmpUGE(
750 NewSamplingVarVal, GetConstant(PeriodCondBuilder, config.Period));
751 BranchWeight = MDB.createBranchWeights(1, config.Period - 1);
753 &ElseTerm, BranchWeight);
756 if (config.IsSimpleSampling)
760 ResetBuilder.CreateStore(GetConstant(ResetBuilder, 0), SamplingVar);
764bool InstrLowerer::lowerIntrinsics(
Function *
F) {
765 bool MadeChange =
false;
766 PromotionCandidates.clear();
779 for (
auto *Instr : InstrProfInsts) {
782 lowerIncrement(IPIS);
794 lowerValueProfileInst(IPVP);
797 IPMP->eraseFromParent();
800 lowerMCDCTestVectorBitmapUpdate(IPBU);
808 promoteCounterLoadStores(
F);
812bool InstrLowerer::isRuntimeCounterRelocationEnabled()
const {
814 if (
TT.isOSBinFormatMachO())
818 return valueOr(Opts.runtime_counter_relocation,
TT.isOSFuchsia());
821bool InstrLowerer::isSamplingEnabled()
const {
825bool InstrLowerer::isCounterPromotionEnabled()
const {
826 return valueOr(Opts.do_counter_promotion,
Options.DoCounterPromotion);
829bool InstrLowerer::isAtomic()
const {
830 return Options.Atomic || Opts.instrprof_atomic_counter_update_all;
835 const Value *Addr =
nullptr;
837 Addr = LI->getOperand(0);
839 Addr = LI->getOperand(1);
849void InstrLowerer::promoteCounterLoadStores(
Function *
F) {
850 if (!isCounterPromotionEnabled())
859 std::unique_ptr<BlockFrequencyInfo> BFI;
860 if (
Options.UseBFIInPromotion) {
861 std::unique_ptr<BranchProbabilityInfo> BPI;
866 for (
const auto &LoadStore : PromotionCandidates) {
873 makeAtomic(CounterLoad, CounterStore);
876 LoopPromotionCandidates[ParentLoop].emplace_back(CounterLoad, CounterStore);
884 PGOCounterPromoter Promoter(Opts, LoopPromotionCandidates, *
Loop, LI,
886 Promoter.run(&TotalCountersPromoted);
889 if (
isAtomic() && Opts.verify_atomic_counter_promoted)
895 if (TT.isOSFuchsia())
903 auto containsIntrinsic = [&](
int ID) {
905 return !
F->use_empty();
908 return containsIntrinsic(Intrinsic::instrprof_cover) ||
909 containsIntrinsic(Intrinsic::instrprof_increment) ||
910 containsIntrinsic(Intrinsic::instrprof_increment_step) ||
911 containsIntrinsic(Intrinsic::instrprof_timestamp) ||
912 containsIntrinsic(Intrinsic::instrprof_value_profile);
915bool InstrLowerer::lower() {
916 bool MadeChange =
false;
918 if (NeedsRuntimeHook)
919 MadeChange = emitRuntimeHook();
921 if (!IsCS && isSamplingEnabled())
928 if (!ContainsProfiling && !CoverageNamesVar)
939 computeNumValueSiteCounts(Ind);
941 if (FirstProfInst ==
nullptr &&
946 static_cast<void>(getOrCreateRegionBitmaps(Params));
953 if (FirstProfInst !=
nullptr) {
954 static_cast<void>(getOrCreateRegionCounters(FirstProfInst));
961 if (GV.hasMetadata(LLVMContext::MD_type))
962 getOrCreateVTableProfData(&GV);
965 MadeChange |= lowerIntrinsics(&
F);
967 if (CoverageNamesVar) {
968 lowerCoverageData(CoverageNamesVar);
983 if (!NeedsRuntimeHook && ContainsProfiling)
988 emitInitialization();
994 ValueProfilingCallType CallType = ValueProfilingCallType::Default) {
999 if (
auto AK = TLI.getExtAttrForI32Param(
false))
1000 AL = AL.addParamAttribute(M.getContext(), 2, AK);
1002 assert((CallType == ValueProfilingCallType::Default ||
1003 CallType == ValueProfilingCallType::MemOp) &&
1004 "Must be Default or MemOp");
1005 Type *ParamTypes[] = {
1006#define VALUE_PROF_FUNC_PARAM(ParamType, ParamName, ParamLLVMType) ParamLLVMType
1009 auto *ValueProfilingCallTy =
1011 StringRef FuncName = CallType == ValueProfilingCallType::Default
1014 return M.getOrInsertFunction(FuncName, ValueProfilingCallTy, AL);
1021 auto &
PD = ProfileDataMap[
Name];
1023 std::max(
PD.NumValueSites[ValueKind], (uint32_t)(Index + 1));
1031 !Opts.profile_correlate &&
1032 "Value profiling is not yet supported with lightweight instrumentation");
1034 auto It = ProfileDataMap.find(Name);
1035 assert(It != ProfileDataMap.end() && It->second.DataVar &&
1036 "value profiling detected in function with no counter increment");
1042 Index += It->second.NumValueSites[Kind];
1045 bool IsMemOpSize = (Ind->
getValueKind()->getZExtValue() ==
1046 llvm::InstrProfValueKind::IPVK_MemOPSize);
1070 if (
auto AK = TLI->getExtAttrForI32Param(
false))
1093 if (
TT.supportsCOMDAT())
1094 Bias->
setComdat(
M.getOrInsertComdat(VarName));
1100 auto *
Counters = getOrCreateRegionCounters(
I);
1109 if (!isRuntimeCounterRelocationEnabled())
1114 LoadInst *&BiasLI = FunctionToProfileBiasMap[Fn];
1118 BiasLI = EntryBuilder.CreateLoad(Int64Ty, Bias,
"profc_bias");
1120 BiasLI->
setMetadata(LLVMContext::MD_invariant_load,
1128 auto *Bitmaps = getOrCreateRegionBitmaps(
I);
1129 if (!isRuntimeCounterRelocationEnabled())
1137 auto *BiasLI = EntryBuilder.CreateLoad(Int64Ty, Bias,
"profbm_bias");
1139 BiasLI->
setMetadata(LLVMContext::MD_invariant_load,
1144 return Builder.
CreatePtrAdd(Bitmaps, BiasLI,
"profbm_addr");
1148 auto *Addr = getCounterAddress(CoverInstruction);
1150 if (Opts.conditional_counter_update) {
1152 auto &Ctx = CoverInstruction->
getParent()->getContext();
1166void InstrLowerer::lowerTimestamp(
1169 "timestamp probes are always the first probe for a function");
1170 auto &Ctx =
M.getContext();
1171 auto *TimestampAddr = getCounterAddress(TimestampInstruction);
1175 auto Callee =
M.getOrInsertFunction(
1181InstrLowerer::GPUPGOInvariants &
1182InstrLowerer::getOrCreateGPUInvariants(
Function *
F) {
1183 auto It = GPUInvariantsCache.find(
F);
1184 if (It != GPUInvariantsCache.end())
1194 if (Opts.offload_pgo_sampling > 0) {
1197 RTLIB::impl___llvm_profile_sampling_gpu),
1200 IsSampledFn, {ConstantInt::get(Int32Ty, Opts.offload_pgo_sampling)},
1202 Matched = Builder.
CreateICmpNE(SampledInt, ConstantInt::get(Int32Ty, 0),
1206 auto &Inv = GPUInvariantsCache[
F];
1207 Inv.Matched = Matched;
1215 auto &Inv = getOrCreateGPUInvariants(
F);
1221 auto *Addr = getCounterAddress(Inc);
1226 if (!Inv.WaveSizeStored) {
1227 Inv.WaveSizeStored =
true;
1229 auto &
PD = ProfileDataMap[NamePtr];
1231 IRBuilder<> EntryBuilder(&*
F->getEntryBlock().getFirstInsertionPt());
1232 Value *WaveSize16 =
nullptr;
1236 if (
TT.isAMDGPU()) {
1242 Value *WaveSize = EntryBuilder.CreateCall(WaveSizeFn);
1243 WaveSize16 = EntryBuilder.CreateTrunc(
1249 Value *WaveSizeAddr = EntryBuilder.CreateStructGEP(
1250 PD.DataVar->getValueType(),
PD.DataVar, 9,
"profd.wavesize");
1251 EntryBuilder.CreateStore(WaveSize16, WaveSizeAddr);
1255 GlobalVariable *UniformCounters = getOrCreateUniformCounters(Inc);
1257 if (UniformCounters) {
1260 UniformCounters->
getValueType(), UniformCounters, UniformIndices,
1270 {PtrTy, PtrTy, Int64Ty},
false);
1273 RTLIB::impl___llvm_profile_instrument_gpu),
1276 if (Opts.offload_pgo_sampling > 0) {
1284 HeadBuilder.CreateCondBr(Inv.Matched, ThenBB, ContBB);
1287 ThenBuilder.CreateCall(Callee, {CastAddr, UniformAddrArg, StepI64});
1288 ThenBuilder.CreateBr(ContBB);
1290 Builder.
CreateCall(Callee, {CastAddr, UniformAddrArg, StepI64});
1296 auto *Addr = getCounterAddress(Inc);
1299 if ((!isCounterPromotionEnabled() &&
isAtomic()) ||
1308 if (isCounterPromotionEnabled())
1314void InstrLowerer::lowerCoverageData(
GlobalVariable *CoverageNamesVar) {
1319 Value *
V =
NC->stripPointerCasts();
1324 ReferencedNames.push_back(Name);
1326 NC->dropAllReferences();
1331void InstrLowerer::lowerMCDCTestVectorBitmapUpdate(
1333 auto &Ctx =
M.getContext();
1338 auto *BitmapAddr = getBitmapAddress(Update);
1343 Builder.
CreateLoad(Int32Ty, MCDCCondBitmapAddr,
"mcdc.temp"),
1348 auto *BitmapByteOffset = Builder.
CreateLShr(Temp, 0x3);
1352 auto *BitmapByteAddr =
1366 auto *Bitmap = Builder.
CreateLoad(Int8Ty, BitmapByteAddr,
"mcdc.bits");
1408 return (Prefix + Name).str();
1414 return (Prefix + Name).str();
1423 if (!profDataReferencedByCode(*
F->getParent()))
1427 bool HasAvailableExternallyLinkage =
F->hasAvailableExternallyLinkage();
1428 if (!
F->hasLinkOnceLinkage() && !
F->hasLocalLinkage() &&
1429 !HasAvailableExternallyLinkage)
1435 if (HasAvailableExternallyLinkage &&
1436 F->hasFnAttribute(Attribute::AlwaysInline))
1442 if (
F->hasLocalLinkage() &&
F->hasComdat())
1452 return F->hasAddressTaken() ||
F->hasLinkOnceLinkage();
1505 Fn->
getName() +
".local", Fn);
1534 if (TT.isOSBinFormatELF() || TT.isOSBinFormatCOFF() ||
1535 TT.isOSBinFormatMachO() || TT.isOSBinFormatXCOFF() ||
1536 TT.isOSBinFormatWasm())
1549 bool UseComdat = (NeedComdat ||
TT.isOSBinFormatELF());
1564 StringRef GroupName =
TT.isOSBinFormatCOFF() && DataReferencedByCode
1567 Comdat *
C =
M.getOrInsertComdat(GroupName);
1587 if (!profDataReferencedByCode(*GV->
getParent()))
1612void InstrLowerer::getOrCreateVTableProfData(
GlobalVariable *GV) {
1614 "Value profiling is not supported with lightweight instrumentation");
1625 auto It = VTableDataMap.find(GV);
1626 if (It != VTableDataMap.end() && It->second)
1634 if (
TT.isOSBinFormatXCOFF()) {
1640 Type *DataTypes[] = {
1641#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Init) LLVMType,
1643#undef INSTR_PROF_VTABLE_DATA
1656#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Init) Init,
1658#undef INSTR_PROF_VTABLE_DATA
1666 Data->setVisibility(Visibility);
1670 maybeSetComdat(
Data, GV,
Data->getName());
1672 VTableDataMap[GV] =
Data;
1674 ReferencedVTables.push_back(GV);
1678 UsedVars.push_back(
Data);
1701 if (
TT.isOSBinFormatXCOFF()) {
1710 if (IPSK == IPSK_cnts) {
1714 Ptr = createRegionCounters(CntrIncrement, VarName,
Linkage);
1715 }
else if (IPSK == IPSK_bitmap) {
1720 Ptr = createRegionBitmaps(BitmapUpdate, VarName,
Linkage);
1729 Ptr->
setComdat(
M.getOrInsertComdat(VarName));
1733 maybeSetComdat(Ptr, Fn, VarName);
1753 auto &
PD = ProfileDataMap[NamePtr];
1754 if (
PD.RegionBitmaps)
1755 return PD.RegionBitmaps;
1759 auto *BitmapPtr = setupProfileSection(Inc, IPSK_bitmap);
1760 PD.RegionBitmaps = BitmapPtr;
1763 if (
PD.NumBitmapBytes &&
1769 Metadata *FunctionNameAnnotation[] = {
1773 Metadata *NumBitmapBitsAnnotation[] = {
1781 auto *DICounter =
DB.createGlobalVariableExpression(
1782 SP, BitmapPtr->getName(),
StringRef(),
SP->getFile(),
1783 0,
DB.createUnspecifiedType(
"Profile Bitmap Type"),
1784 BitmapPtr->hasLocalLinkage(),
true,
nullptr,
1785 nullptr,
nullptr, 0,
1787 BitmapPtr->addDebugInfo(DICounter);
1788 DB.finalizeSubprogram(SP);
1793 CompilerUsedVars.push_back(
PD.RegionBitmaps);
1796 return PD.RegionBitmaps;
1803 auto &Ctx =
M.getContext();
1809 std::vector<Constant *> InitialValues(NumCounters,
1827 auto &
PD = ProfileDataMap[NamePtr];
1828 if (
PD.RegionCounters)
1829 return PD.RegionCounters;
1833 auto *CounterPtr = setupProfileSection(Inc, IPSK_cnts);
1834 PD.RegionCounters = CounterPtr;
1841 Metadata *FunctionNameAnnotation[] = {
1849 Metadata *NumCountersAnnotation[] = {
1858 auto *DICounter =
DB.createGlobalVariableExpression(
1859 SP, CounterPtr->getName(),
StringRef(),
SP->getFile(),
1860 0,
DB.createUnspecifiedType(
"Profile Data Type"),
1861 CounterPtr->hasLocalLinkage(),
true,
nullptr,
1862 nullptr,
nullptr, 0,
1864 CounterPtr->addDebugInfo(DICounter);
1865 DB.finalizeSubprogram(SP);
1870 CompilerUsedVars.push_back(
PD.RegionCounters);
1875 getOrCreateUniformCounters(Inc);
1878 createDataVariable(Inc);
1880 return PD.RegionCounters;
1890 auto &
PD = ProfileDataMap[NamePtr];
1891 if (
PD.UniformCounters)
1892 return PD.UniformCounters;
1894 assert(
PD.RegionCounters &&
"region counters must be created first");
1914 PD.UniformCounters = GV;
1915 CompilerUsedVars.push_back(GV);
1917 return PD.UniformCounters;
1927 auto &
PD = ProfileDataMap[NamePtr];
1944 if (
TT.isOSBinFormatXCOFF()) {
1953 std::string CntsVarName =
1955 std::string DataVarName =
1963 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
1964 NS +=
PD.NumValueSites[Kind];
1965 if (NS > 0 && Opts.vp_static_alloc &&
1971 ValuesVar->setVisibility(Visibility);
1973 ValuesVar->setSection(
1975 ValuesVar->setAlignment(
Align(8));
1976 maybeSetComdat(ValuesVar, Fn, CntsVarName);
1989 auto *
IntPtrTy =
M.getDataLayout().getIntPtrType(
M.getContext());
1992 auto *DataTy = getProfileDataTy();
1996 Constant *Int16ArrayVals[IPVK_Last + 1];
1997 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
1998 Int16ArrayVals[Kind] = ConstantInt::get(Int16Ty,
PD.NumValueSites[Kind]);
2000 uint16_t OffloadDeviceWaveSizeVal = 0;
2023 !(DataReferencedByCode && NeedComdat && !Renamed) &&
2024 (
TT.isOSBinFormatELF() ||
2025 (!DataReferencedByCode &&
TT.isOSBinFormatCOFF()))) {
2032 if (
TT.isGPU() &&
TT.isOSBinFormatELF() &&
2046 DataSectionKind = IPSK_covdata;
2048 if (BitmapPtr !=
nullptr)
2051 RelativeUniformCounterPtr =
2053 }
else if (
TT.isNVPTX()) {
2057 DataSectionKind = IPSK_data;
2062 DataSectionKind = IPSK_data;
2063 RelativeCounterPtr =
2066 if (BitmapPtr !=
nullptr)
2077#define INSTR_PROF_DATA(Type, LLVMType, Name, Init) Init,
2082 Data->setVisibility(Visibility);
2087 Data->setComdat(
M.getOrInsertComdat(CntsVarName));
2090 maybeSetComdat(
Data, Fn, CntsVarName);
2096 CompilerUsedVars.push_back(
Data);
2102 ReferencedNames.push_back(NamePtr);
2105void InstrLowerer::emitVNodes() {
2106 if (!Opts.vp_static_alloc)
2116 for (
auto &PD : ProfileDataMap) {
2117 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
2118 TotalNS +=
PD.second.NumValueSites[Kind];
2124 uint64_t NumCounters = TotalNS * Opts.vp_counters_per_site;
2132#define INSTR_PROF_MIN_VAL_COUNTS 10
2136 auto &Ctx =
M.getContext();
2137 Type *VNodeTypes[] = {
2138#define INSTR_PROF_VALUE_NODE(Type, LLVMType, Name, Init) LLVMType,
2148 VNodesVar->setSection(
2150 VNodesVar->setAlignment(
M.getDataLayout().getABITypeAlign(VNodesTy));
2153 UsedVars.push_back(VNodesVar);
2161 std::string Name = (
"__llvm_profile_sections" + CUIDPostfix).str();
2162 if (M.getNamedValue(Name))
2166 unsigned AS = M.getDataLayout().getDefaultGlobalsAddressSpace();
2172 nullptr, Sym,
nullptr,
2181 Constant *Fields[] = {
Extern(
"__start___llvm_prf_names", I8,
false, Hidden),
2182 Extern(
"__stop___llvm_prf_names", I8,
false, Hidden),
2183 Extern(
"__start___llvm_prf_cnts", I8,
false, Hidden),
2184 Extern(
"__stop___llvm_prf_cnts", I8,
false, Hidden),
2185 Extern(
"__start___llvm_prf_data", I8,
false, Hidden),
2186 Extern(
"__stop___llvm_prf_data", I8,
false, Hidden),
2187 Extern(
"__start___llvm_prf_ucnts", I8,
false, Hidden),
2188 Extern(
"__stop___llvm_prf_ucnts", I8,
false, Hidden),
2189 Extern(
"__llvm_profile_raw_version",
2194 Ctx, {PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy});
2203void InstrLowerer::emitNameData() {
2204 if (ReferencedNames.empty())
2207 std::string CompressedNameStr;
2213 auto &Ctx =
M.getContext();
2219 std::string GPUCUIDPostfix;
2224 if (
Init->isCString()) {
2225 GPUCUIDPostfix =
Init->getAsCString().str();
2226 NamesVarName += GPUCUIDPostfix;
2230 M, [GV](
Constant *
C) {
return C->stripPointerCasts() == GV; });
2236 NamesVar =
new GlobalVariable(M, NamesVal->getType(),
true, NamesLinkage,
2237 NamesVal, NamesVarName);
2238 NamesVar->setVisibility(NamesVisibility);
2240 NamesSize = CompressedNameStr.size();
2242 std::string NamesSectionName =
2246 NamesVar->setSection(NamesSectionName);
2250 NamesVar->setAlignment(
Align(1));
2253 UsedVars.push_back(NamesVar);
2255 for (
auto *NamePtr : ReferencedNames)
2261 [](
const auto &KV) { return KV.second.DataVar; });
2262 if (!GPUCUIDPostfix.empty() && HasData)
2264 CompilerUsedVars.push_back(GV);
2267void InstrLowerer::emitVTableNames() {
2272 std::string CompressedVTableNames;
2278 auto &Ctx =
M.getContext();
2280 Ctx,
StringRef(CompressedVTableNames),
false );
2289 UsedVars.push_back(VTableNamesVar);
2292void InstrLowerer::emitRegistration() {
2305 RegisterF->addFnAttr(Attribute::NoRedZone);
2308 auto *RuntimeRegisterF =
2316 IRB.CreateCall(RuntimeRegisterF,
2317 IRB.CreatePointerBitCastOrAddrSpaceCast(
Data, VoidPtrTy));
2320 IRB.CreateCall(RuntimeRegisterF,
2321 IRB.CreatePointerBitCastOrAddrSpaceCast(
Data, VoidPtrTy));
2324 Type *ParamTypes[] = {VoidPtrTy, Int64Ty};
2325 auto *NamesRegisterTy =
2327 auto *NamesRegisterF =
2330 IRB.CreateCall(NamesRegisterF, {IRB.CreatePointerBitCastOrAddrSpaceCast(
2331 NamesVar, VoidPtrTy),
2332 IRB.getInt64(NamesSize)});
2335 IRB.CreateRetVoid();
2338bool InstrLowerer::emitRuntimeHook() {
2346 if (
TT.isOSLinux() ||
TT.isOSAIX())
2360 if (
TT.isOSBinFormatELF() && !
TT.isPS()) {
2362 CompilerUsedVars.push_back(Var);
2368 User->addFnAttr(Attribute::NoInline);
2370 User->addFnAttr(Attribute::NoRedZone);
2372 if (
TT.supportsCOMDAT())
2375 User->setEntryCount(0);
2378 auto *
Load = IRB.CreateLoad(Int32Ty, Var);
2379 IRB.CreateRet(
Load);
2382 CompilerUsedVars.push_back(
User);
2387void InstrLowerer::emitUses() {
2397 if (
TT.isOSBinFormatELF() ||
TT.isOSBinFormatMachO() ||
2398 (
TT.isOSBinFormatCOFF() && !DataReferencedByCode))
2409void InstrLowerer::emitInitialization() {
2426 F->addFnAttr(Attribute::NoInline);
2428 F->addFnAttr(Attribute::NoRedZone);
2432 IRB.CreateCall(RegisterF, {});
2433 IRB.CreateRetVoid();
2444 if (getSampledInstrumentationConfig(InstrumentationOptions::Global)
2455 SamplingVar->setThreadLocal(
true);
2456 Triple TT(M.getTargetTriple());
2457 if (TT.supportsCOMDAT()) {
2459 SamplingVar->setComdat(M.getOrInsertComdat(VarName));
2468StructType *InstrLowerer::getProfileDataTy() {
2470 return ProfileDataTy;
2472 auto &Ctx =
M.getContext();
2473 auto *
IntPtrTy =
M.getDataLayout().getIntPtrType(
M.getContext());
2476 Type *DataTypes[] = {
2477#define INSTR_PROF_DATA(Type, LLVMType, Name, Init) LLVMType,
2481 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")
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.
#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)
static std::string getVarName(const InstrumentationOptions &Opts, InstrProfInstBase *Inc, StringRef Prefix, bool &Renamed)
Get the name of a profiling variable for a particular function.
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...
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
LLVM_ABI bool isProfileCorrelationEnabled()
Return true if -profile-correlate is set.
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.
StringRef getInstrProfRegFuncName()
Return the name of the runtime interface that registers per-function control data for one instrumente...
constexpr bool valueOr(BoolOrDefault X, bool Default)
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.