71#define DEBUG_TYPE "instrprof"
81 return LibraryOptions.
get<InstrumentationOptions>()
82 .profile_correlate.has_value();
87struct SampledInstrumentationConfig {
88 unsigned BurstDuration;
91 bool IsSimpleSampling;
95static SampledInstrumentationConfig
96getSampledInstrumentationConfig(
const InstrumentationOptions &Opts) {
97 SampledInstrumentationConfig config;
98 config.BurstDuration = Opts.sampled_instr_burst_duration;
99 config.Period = Opts.sampled_instr_period;
100 if (config.BurstDuration > config.Period)
102 "SampledBurstDuration must be less than or equal to SampledPeriod");
103 if (config.Period == 0 || config.BurstDuration == 0)
105 "SampledPeriod and SampledBurstDuration must be greater than 0");
106 config.IsSimpleSampling = (config.BurstDuration == 1);
109 config.IsFastSampling =
110 (!config.IsSimpleSampling && config.Period == USHRT_MAX + 1);
111 config.UseShort = (config.Period <= USHRT_MAX) || config.IsFastSampling;
115using LoadStorePair = std::pair<Instruction *, Instruction *>;
119 assert(Addition && Addition->getOpcode() == Instruction::BinaryOps::Add);
120 auto *Addend = Addition->getOperand(1);
125 Store->eraseFromParent();
126 Addition->eraseFromParent();
127 Load->eraseFromParent();
140static bool enablesValueProfiling(
const Module &M) {
142 getIntModuleFlagOrZero(M,
"EnableValueProfiling") != 0;
146static bool profDataReferencedByCode(
const Module &M) {
147 return enablesValueProfiling(M);
150class InstrLowerer final {
152 InstrLowerer(
const InstrumentationOptions &Opts,
Module &M,
153 const InstrProfOptions &Options,
154 std::function<
const TargetLibraryInfo &(
Function &
F)> GetTLI,
156 : Opts(Opts), M(M), Options(Options), TT(M.getTargetTriple()), IsCS(IsCS),
157 GetTLI(GetTLI), DataReferencedByCode(profDataReferencedByCode(M)) {}
162 const InstrumentationOptions &Opts;
164 const InstrProfOptions Options;
169 std::function<
const TargetLibraryInfo &(
Function &
F)> GetTLI;
171 const bool DataReferencedByCode;
173 struct PerFunctionProfileData {
174 uint32_t NumValueSites[IPVK_Last + 1] = {};
175 GlobalVariable *RegionCounters =
nullptr;
176 GlobalVariable *UniformCounters =
178 GlobalVariable *DataVar =
nullptr;
179 GlobalVariable *RegionBitmaps =
nullptr;
180 uint32_t NumBitmapBytes = 0;
182 PerFunctionProfileData() =
default;
184 DenseMap<GlobalVariable *, PerFunctionProfileData> ProfileDataMap;
187 DenseMap<GlobalVariable *, GlobalVariable *> VTableDataMap;
190 DenseMap<const Function *, LoadInst *> FunctionToProfileBiasMap;
191 std::vector<GlobalValue *> CompilerUsedVars;
192 std::vector<GlobalValue *> UsedVars;
193 std::vector<GlobalVariable *> ReferencedNames;
196 std::vector<GlobalVariable *> ReferencedVTables;
197 GlobalVariable *NamesVar =
nullptr;
198 size_t NamesSize = 0;
200 StructType *ProfileDataTy =
nullptr;
203 std::vector<LoadStorePair> PromotionCandidates;
205 int64_t TotalCountersPromoted = 0;
210 struct GPUPGOInvariants {
211 Value *Matched =
nullptr;
212 bool WaveSizeStored =
false;
214 DenseMap<Function *, GPUPGOInvariants> GPUInvariantsCache;
217 GPUPGOInvariants &getOrCreateGPUInvariants(
Function *
F);
224 void promoteCounterLoadStores(
Function *
F);
227 bool isRuntimeCounterRelocationEnabled()
const;
230 bool isCounterPromotionEnabled()
const;
236 bool isSamplingEnabled()
const;
239 void computeNumValueSiteCounts(InstrProfValueProfileInst *Ins);
242 void lowerValueProfileInst(InstrProfValueProfileInst *Ins);
245 void lowerCover(InstrProfCoverInst *Inc);
249 void lowerTimestamp(InstrProfTimestampInst *TimestampInstruction);
252 void lowerIncrement(InstrProfIncrementInst *Inc);
255 void lowerCoverageData(GlobalVariable *CoverageNamesVar);
259 void lowerMCDCTestVectorBitmapUpdate(InstrProfMCDCTVBitmapUpdate *Ins);
263 GlobalVariable *getOrCreateBiasVar(StringRef VarName);
267 Value *getCounterAddress(InstrProfCntrInstBase *
I);
270 void doSampling(Instruction *
I);
276 GlobalVariable *getOrCreateRegionCounters(InstrProfCntrInstBase *Inc);
280 GlobalVariable *getOrCreateUniformCounters(InstrProfCntrInstBase *Inc);
283 GlobalVariable *createRegionCounters(InstrProfCntrInstBase *Inc,
289 Value *getBitmapAddress(InstrProfMCDCTVBitmapUpdate *
I);
295 GlobalVariable *getOrCreateRegionBitmaps(InstrProfMCDCBitmapInstBase *Inc);
302 GlobalVariable *createRegionBitmaps(InstrProfMCDCBitmapInstBase *Inc,
307 void maybeSetComdat(GlobalVariable *GV, GlobalObject *GO, StringRef VarName);
310 GlobalVariable *setupProfileSection(InstrProfInstBase *Inc,
314 void createDataVariable(InstrProfCntrInstBase *Inc);
317 void getOrCreateVTableProfData(GlobalVariable *GV);
323 void emitVTableNames();
329 void emitRegistration();
333 bool emitRuntimeHook();
340 void emitInitialization();
343 StructType *getProfileDataTy();
355 PGOCounterPromoterHelper(
356 const InstrumentationOptions &Opts, Instruction *L, Instruction *S,
357 SSAUpdater &
SSA,
Value *Init, BasicBlock *PH,
360 LoopInfo &LI,
bool IsAtomic)
361 : LoadAndStorePromoter({
L, S},
SSA), Opts(Opts),
Store(S),
362 ExitBlocks(ExitBlocks), InsertPts(InsertPts),
363 LoopToCandidates(LoopToCands), LI(LI), IsAtomic(IsAtomic) {
366 SSA.AddAvailableValue(PH, Init);
369 void doExtraRewritesBeforeFinalDeletion()
override {
370 for (
unsigned i = 0, e = ExitBlocks.size(); i != e; ++i) {
376 Value *LiveInValue =
SSA.GetValueInMiddleOfBlock(ExitBlock);
388 assert(OrigBiasInst->getOpcode() == Instruction::BinaryOps::Add);
389 Value *BiasInst = Builder.Insert(OrigBiasInst->clone());
390 Addr = Builder.CreateIntToPtr(BiasInst,
394 Opts.iterative_counter_promotion ? LI.getLoopFor(ExitBlock) :
nullptr;
397 if ((IsAtomic && !TargetLoop) || Opts.atomic_counter_update_promoted)
399 MaybeAlign(), AtomicOrdering::Monotonic);
401 LoadInst *OldVal = Builder.CreateLoad(Ty, Addr,
"pgocount.promoted");
402 auto *NewVal = Builder.CreateAdd(OldVal, LiveInValue);
403 auto *NewStore = Builder.CreateStore(NewVal, Addr);
407 LoopToCandidates[TargetLoop].emplace_back(OldVal, NewStore);
413 const InstrumentationOptions &Opts;
416 ArrayRef<Instruction *> InsertPts;
417 DenseMap<Loop *, SmallVector<LoadStorePair, 8>> &LoopToCandidates;
425class PGOCounterPromoter {
428 const InstrumentationOptions &Opts,
430 Loop &CurLoop, LoopInfo &LI, BlockFrequencyInfo *BFI,
bool IsAtomic)
431 : Opts(Opts), LoopToCandidates(LoopToCands), L(CurLoop), LI(LI), BFI(BFI),
436 SmallVector<BasicBlock *, 8> LoopExitBlocks;
437 SmallPtrSet<BasicBlock *, 8>
BlockSet;
439 L.getExitBlocks(LoopExitBlocks);
440 if (!isPromotionPossible(&L, LoopExitBlocks))
443 for (BasicBlock *ExitBlock : LoopExitBlocks) {
448 ExitBlocks.push_back(ExitBlock);
454 bool run(int64_t *NumPromoted) {
458 auto &OrigCandidates = LoopToCandidates[&L];
460 OrigCandidates.clear();
461 bool RC = promoteCandidates(Candidates, NumPromoted);
463 "Did not expect new candidates to be added to current loop");
474 for (
auto &Cand : Candidates)
475 if (Cand.first !=
nullptr && Cand.second !=
nullptr)
476 makeAtomic(Cand.first, Cand.second);
481 bool promoteCandidates(SmallVectorImpl<LoadStorePair> &Candidates,
482 int64_t *NumPromoted) {
484 if (ExitBlocks.size() == 0)
492 if (Opts.skip_ret_exit_block) {
493 for (
auto *BB : ExitBlocks)
498 unsigned MaxProm = getMaxNumOfPromotionsInLoop(&L);
502 unsigned Promoted = 0;
503 for (
auto &Cand : Candidates) {
505 SSAUpdater
SSA(&NewPHIs);
506 Value *InitVal = ConstantInt::get(Cand.first->getType(), 0);
510 auto *BB = Cand.first->getParent();
511 auto InstrCount = BFI->getBlockProfileCount(BB);
514 auto PreheaderCount = BFI->getBlockProfileCount(L.getLoopPreheader());
517 if (PreheaderCount && (*PreheaderCount * 3) >= (*
InstrCount * 2))
521 PGOCounterPromoterHelper Promoter(
522 Opts, Cand.first, Cand.second,
SSA, InitVal, L.getLoopPreheader(),
523 ExitBlocks, InsertPts, LoopToCandidates, LI, IsAtomic);
524 Promoter.run(SmallVector<Instruction *, 2>({Cand.first, Cand.second}));
526 Cand = {
nullptr,
nullptr};
529 if (Promoted >= MaxProm)
533 if (Opts.max_counter_promotions != -1 &&
534 *NumPromoted >= Opts.max_counter_promotions)
538 LLVM_DEBUG(
dbgs() << Promoted <<
" counters promoted for loop (depth="
539 << L.getLoopDepth() <<
")\n");
540 return Promoted != 0;
544 bool allowSpeculativeCounterPromotion(
Loop *LP) {
545 SmallVector<BasicBlock *, 8> ExitingBlocks;
546 L.getExitingBlocks(ExitingBlocks);
548 if (ExitingBlocks.
size() == 1)
550 if (ExitingBlocks.
size() > Opts.speculative_counter_promotion_max_exiting)
558 isPromotionPossible(
Loop *LP,
559 const SmallVectorImpl<BasicBlock *> &LoopExitBlocks) {
577 unsigned getMaxNumOfPromotionsInLoop(
Loop *LP) {
578 SmallVector<BasicBlock *, 8> LoopExitBlocks;
580 if (!isPromotionPossible(LP, LoopExitBlocks))
583 SmallVector<BasicBlock *, 8> ExitingBlocks;
591 if (ExitingBlocks.
size() == 1)
592 return Opts.max_counter_promotions_per_loop;
594 if (ExitingBlocks.
size() > Opts.speculative_counter_promotion_max_exiting)
598 if (Opts.speculative_counter_promotion_to_loop)
599 return Opts.max_counter_promotions_per_loop;
602 unsigned MaxProm = Opts.max_counter_promotions_per_loop;
603 for (
auto *TargetBlock : LoopExitBlocks) {
604 auto *TargetLoop = LI.getLoopFor(TargetBlock);
607 unsigned MaxPromForTarget = getMaxNumOfPromotionsInLoop(TargetLoop);
608 unsigned PendingCandsInTarget = LoopToCandidates[TargetLoop].size();
610 std::min(MaxProm, std::max(MaxPromForTarget, PendingCandsInTarget) -
611 PendingCandsInTarget);
616 const InstrumentationOptions &Opts;
617 DenseMap<Loop *, SmallVector<LoadStorePair, 8>> &LoopToCandidates;
618 SmallVector<BasicBlock *, 8> ExitBlocks;
619 SmallVector<Instruction *, 8> InsertPts;
622 BlockFrequencyInfo *BFI;
626enum class ValueProfilingCallType {
644 const InstrumentationOptions &Opts =
645 M.getContext().getLibraryOptions().get<InstrumentationOptions>();
646 InstrLowerer Lowerer(Opts, M, Options, GetTLI, IsCS);
647 if (!Lowerer.lower())
698 if (!isSamplingEnabled())
701 SampledInstrumentationConfig config = getSampledInstrumentationConfig(Opts);
704 return Builder.getInt16(
C);
706 return Builder.getInt32(
C);
716 assert(SamplingVar &&
"SamplingVar not set properly");
720 Value *NewSamplingVarVal;
724 auto *LoadSamplingVar = CondBuilder.CreateLoad(SamplingVarTy, SamplingVar);
725 if (config.IsSimpleSampling) {
729 IncBuilder.CreateAdd(LoadSamplingVar, GetConstant(IncBuilder, 1));
730 SamplingVarIncr = IncBuilder.CreateStore(NewSamplingVarVal, SamplingVar);
733 auto *DurationCond = CondBuilder.CreateICmpULE(
734 LoadSamplingVar, GetConstant(CondBuilder, config.BurstDuration - 1));
735 BranchWeight = MDB.createBranchWeights(
736 config.BurstDuration, config.Period - config.BurstDuration);
738 DurationCond,
I,
false, BranchWeight);
741 IncBuilder.CreateAdd(LoadSamplingVar, GetConstant(IncBuilder, 1));
742 SamplingVarIncr = IncBuilder.CreateStore(NewSamplingVarVal, SamplingVar);
746 if (config.IsFastSampling)
752 auto *PeriodCond = PeriodCondBuilder.CreateICmpUGE(
753 NewSamplingVarVal, GetConstant(PeriodCondBuilder, config.Period));
754 BranchWeight = MDB.createBranchWeights(1, config.Period - 1);
756 &ElseTerm, BranchWeight);
759 if (config.IsSimpleSampling)
763 ResetBuilder.CreateStore(GetConstant(ResetBuilder, 0), SamplingVar);
767bool InstrLowerer::lowerIntrinsics(
Function *
F) {
768 bool MadeChange =
false;
769 PromotionCandidates.clear();
782 for (
auto *Instr : InstrProfInsts) {
785 lowerIncrement(IPIS);
797 lowerValueProfileInst(IPVP);
800 IPMP->eraseFromParent();
803 lowerMCDCTestVectorBitmapUpdate(IPBU);
811 promoteCounterLoadStores(
F);
815bool InstrLowerer::isRuntimeCounterRelocationEnabled()
const {
817 if (
TT.isOSBinFormatMachO())
821 return valueOr(Opts.runtime_counter_relocation,
TT.isOSFuchsia());
824bool InstrLowerer::isSamplingEnabled()
const {
828bool InstrLowerer::isCounterPromotionEnabled()
const {
829 return valueOr(Opts.do_counter_promotion,
Options.DoCounterPromotion);
832bool InstrLowerer::isAtomic()
const {
833 return Options.Atomic || Opts.instrprof_atomic_counter_update_all;
838 const Value *Addr =
nullptr;
840 Addr = LI->getOperand(0);
842 Addr = LI->getOperand(1);
852void InstrLowerer::promoteCounterLoadStores(
Function *
F) {
853 if (!isCounterPromotionEnabled())
862 std::unique_ptr<BlockFrequencyInfo> BFI;
863 if (
Options.UseBFIInPromotion) {
864 std::unique_ptr<BranchProbabilityInfo> BPI;
869 for (
const auto &LoadStore : PromotionCandidates) {
876 makeAtomic(CounterLoad, CounterStore);
879 LoopPromotionCandidates[ParentLoop].emplace_back(CounterLoad, CounterStore);
887 PGOCounterPromoter Promoter(Opts, LoopPromotionCandidates, *
Loop, LI,
889 Promoter.run(&TotalCountersPromoted);
892 if (
isAtomic() && Opts.verify_atomic_counter_promoted)
898 if (TT.isOSFuchsia())
906 auto containsIntrinsic = [&](
int ID) {
908 return !
F->use_empty();
911 return containsIntrinsic(Intrinsic::instrprof_cover) ||
912 containsIntrinsic(Intrinsic::instrprof_increment) ||
913 containsIntrinsic(Intrinsic::instrprof_increment_step) ||
914 containsIntrinsic(Intrinsic::instrprof_timestamp) ||
915 containsIntrinsic(Intrinsic::instrprof_value_profile);
918bool InstrLowerer::lower() {
919 bool MadeChange =
false;
921 if (NeedsRuntimeHook)
922 MadeChange = emitRuntimeHook();
924 if (!IsCS && isSamplingEnabled())
931 if (!ContainsProfiling && !CoverageNamesVar)
942 computeNumValueSiteCounts(Ind);
944 if (FirstProfInst ==
nullptr &&
949 static_cast<void>(getOrCreateRegionBitmaps(Params));
956 if (FirstProfInst !=
nullptr) {
957 static_cast<void>(getOrCreateRegionCounters(FirstProfInst));
964 if (GV.hasMetadata(LLVMContext::MD_type))
965 getOrCreateVTableProfData(&GV);
968 MadeChange |= lowerIntrinsics(&
F);
970 if (CoverageNamesVar) {
971 lowerCoverageData(CoverageNamesVar);
986 if (!NeedsRuntimeHook && ContainsProfiling)
991 emitInitialization();
997 ValueProfilingCallType CallType = ValueProfilingCallType::Default) {
1002 if (
auto AK = TLI.getExtAttrForI32Param(
false))
1003 AL = AL.addParamAttribute(M.getContext(), 2, AK);
1005 assert((CallType == ValueProfilingCallType::Default ||
1006 CallType == ValueProfilingCallType::MemOp) &&
1007 "Must be Default or MemOp");
1008 Type *ParamTypes[] = {
1009#define VALUE_PROF_FUNC_PARAM(ParamType, ParamName, ParamLLVMType) ParamLLVMType
1012 auto *ValueProfilingCallTy =
1014 StringRef FuncName = CallType == ValueProfilingCallType::Default
1017 return M.getOrInsertFunction(FuncName, ValueProfilingCallTy, AL);
1024 auto &
PD = ProfileDataMap[
Name];
1026 std::max(
PD.NumValueSites[ValueKind], (uint32_t)(Index + 1));
1034 !Opts.profile_correlate &&
1035 "Value profiling is not yet supported with lightweight instrumentation");
1037 auto It = ProfileDataMap.find(Name);
1038 assert(It != ProfileDataMap.end() && It->second.DataVar &&
1039 "value profiling detected in function with no counter increment");
1045 Index += It->second.NumValueSites[Kind];
1048 bool IsMemOpSize = (Ind->
getValueKind()->getZExtValue() ==
1049 llvm::InstrProfValueKind::IPVK_MemOPSize);
1073 if (
auto AK = TLI->getExtAttrForI32Param(
false))
1096 if (
TT.supportsCOMDAT())
1097 Bias->
setComdat(
M.getOrInsertComdat(VarName));
1103 auto *
Counters = getOrCreateRegionCounters(
I);
1112 if (!isRuntimeCounterRelocationEnabled())
1117 LoadInst *&BiasLI = FunctionToProfileBiasMap[Fn];
1121 BiasLI = EntryBuilder.CreateLoad(Int64Ty, Bias,
"profc_bias");
1123 BiasLI->
setMetadata(LLVMContext::MD_invariant_load,
1131 auto *Bitmaps = getOrCreateRegionBitmaps(
I);
1132 if (!isRuntimeCounterRelocationEnabled())
1140 auto *BiasLI = EntryBuilder.CreateLoad(Int64Ty, Bias,
"profbm_bias");
1142 BiasLI->
setMetadata(LLVMContext::MD_invariant_load,
1147 return Builder.
CreatePtrAdd(Bitmaps, BiasLI,
"profbm_addr");
1151 auto *Addr = getCounterAddress(CoverInstruction);
1153 if (Opts.conditional_counter_update) {
1155 auto &Ctx = CoverInstruction->
getParent()->getContext();
1169void InstrLowerer::lowerTimestamp(
1172 "timestamp probes are always the first probe for a function");
1173 auto &Ctx =
M.getContext();
1174 auto *TimestampAddr = getCounterAddress(TimestampInstruction);
1178 auto Callee =
M.getOrInsertFunction(
1184InstrLowerer::GPUPGOInvariants &
1185InstrLowerer::getOrCreateGPUInvariants(
Function *
F) {
1186 auto It = GPUInvariantsCache.find(
F);
1187 if (It != GPUInvariantsCache.end())
1197 if (Opts.offload_pgo_sampling > 0) {
1200 RTLIB::impl___llvm_profile_sampling_gpu),
1203 IsSampledFn, {ConstantInt::get(Int32Ty, Opts.offload_pgo_sampling)},
1205 Matched = Builder.
CreateICmpNE(SampledInt, ConstantInt::get(Int32Ty, 0),
1209 auto &Inv = GPUInvariantsCache[
F];
1210 Inv.Matched = Matched;
1218 auto &Inv = getOrCreateGPUInvariants(
F);
1224 auto *Addr = getCounterAddress(Inc);
1229 if (!Inv.WaveSizeStored) {
1230 Inv.WaveSizeStored =
true;
1232 auto &
PD = ProfileDataMap[NamePtr];
1234 IRBuilder<> EntryBuilder(&*
F->getEntryBlock().getFirstInsertionPt());
1235 Value *WaveSize16 =
nullptr;
1239 if (
TT.isAMDGPU()) {
1245 Value *WaveSize = EntryBuilder.CreateCall(WaveSizeFn);
1246 WaveSize16 = EntryBuilder.CreateTrunc(
1252 Value *WaveSizeAddr = EntryBuilder.CreateStructGEP(
1253 PD.DataVar->getValueType(),
PD.DataVar, 9,
"profd.wavesize");
1254 EntryBuilder.CreateStore(WaveSize16, WaveSizeAddr);
1258 GlobalVariable *UniformCounters = getOrCreateUniformCounters(Inc);
1260 if (UniformCounters) {
1263 UniformCounters->
getValueType(), UniformCounters, UniformIndices,
1273 {PtrTy, PtrTy, Int64Ty},
false);
1276 RTLIB::impl___llvm_profile_instrument_gpu),
1279 if (Opts.offload_pgo_sampling > 0) {
1287 HeadBuilder.CreateCondBr(Inv.Matched, ThenBB, ContBB);
1290 ThenBuilder.CreateCall(Callee, {CastAddr, UniformAddrArg, StepI64});
1291 ThenBuilder.CreateBr(ContBB);
1293 Builder.
CreateCall(Callee, {CastAddr, UniformAddrArg, StepI64});
1299 auto *Addr = getCounterAddress(Inc);
1302 if ((!isCounterPromotionEnabled() &&
isAtomic()) ||
1311 if (isCounterPromotionEnabled())
1317void InstrLowerer::lowerCoverageData(
GlobalVariable *CoverageNamesVar) {
1322 Value *
V =
NC->stripPointerCasts();
1327 ReferencedNames.push_back(Name);
1329 NC->dropAllReferences();
1334void InstrLowerer::lowerMCDCTestVectorBitmapUpdate(
1336 auto &Ctx =
M.getContext();
1341 auto *BitmapAddr = getBitmapAddress(Update);
1346 Builder.
CreateLoad(Int32Ty, MCDCCondBitmapAddr,
"mcdc.temp"),
1351 auto *BitmapByteOffset = Builder.
CreateLShr(Temp, 0x3);
1355 auto *BitmapByteAddr =
1369 auto *Bitmap = Builder.
CreateLoad(Int8Ty, BitmapByteAddr,
"mcdc.bits");
1411 return (Prefix + Name).str();
1417 return (Prefix + Name).str();
1426 if (!profDataReferencedByCode(*
F->getParent()))
1430 bool HasAvailableExternallyLinkage =
F->hasAvailableExternallyLinkage();
1431 if (!
F->hasLinkOnceLinkage() && !
F->hasLocalLinkage() &&
1432 !HasAvailableExternallyLinkage)
1438 if (HasAvailableExternallyLinkage &&
1439 F->hasFnAttribute(Attribute::AlwaysInline))
1445 if (
F->hasLocalLinkage() &&
F->hasComdat())
1455 return F->hasAddressTaken() ||
F->hasLinkOnceLinkage();
1508 Fn->
getName() +
".local", Fn);
1537 if (TT.isOSBinFormatELF() || TT.isOSBinFormatCOFF() ||
1538 TT.isOSBinFormatMachO() || TT.isOSBinFormatXCOFF() ||
1539 TT.isOSBinFormatWasm())
1552 bool UseComdat = (NeedComdat ||
TT.isOSBinFormatELF());
1567 StringRef GroupName =
TT.isOSBinFormatCOFF() && DataReferencedByCode
1570 Comdat *
C =
M.getOrInsertComdat(GroupName);
1590 if (!profDataReferencedByCode(*GV->
getParent()))
1615void InstrLowerer::getOrCreateVTableProfData(
GlobalVariable *GV) {
1617 "Value profiling is not supported with lightweight instrumentation");
1628 auto It = VTableDataMap.find(GV);
1629 if (It != VTableDataMap.end() && It->second)
1637 if (
TT.isOSBinFormatXCOFF()) {
1643 Type *DataTypes[] = {
1644#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Init) LLVMType,
1646#undef INSTR_PROF_VTABLE_DATA
1659#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Init) Init,
1661#undef INSTR_PROF_VTABLE_DATA
1669 Data->setVisibility(Visibility);
1673 maybeSetComdat(
Data, GV,
Data->getName());
1675 VTableDataMap[GV] =
Data;
1677 ReferencedVTables.push_back(GV);
1681 UsedVars.push_back(
Data);
1704 if (
TT.isOSBinFormatXCOFF()) {
1713 if (IPSK == IPSK_cnts) {
1717 Ptr = createRegionCounters(CntrIncrement, VarName,
Linkage);
1718 }
else if (IPSK == IPSK_bitmap) {
1723 Ptr = createRegionBitmaps(BitmapUpdate, VarName,
Linkage);
1732 Ptr->
setComdat(
M.getOrInsertComdat(VarName));
1736 maybeSetComdat(Ptr, Fn, VarName);
1756 auto &
PD = ProfileDataMap[NamePtr];
1757 if (
PD.RegionBitmaps)
1758 return PD.RegionBitmaps;
1762 auto *BitmapPtr = setupProfileSection(Inc, IPSK_bitmap);
1763 PD.RegionBitmaps = BitmapPtr;
1766 if (
PD.NumBitmapBytes &&
1772 Metadata *FunctionNameAnnotation[] = {
1776 Metadata *NumBitmapBitsAnnotation[] = {
1784 auto *DICounter =
DB.createGlobalVariableExpression(
1785 SP, BitmapPtr->getName(),
StringRef(),
SP->getFile(),
1786 0,
DB.createUnspecifiedType(
"Profile Bitmap Type"),
1787 BitmapPtr->hasLocalLinkage(),
true,
nullptr,
1788 nullptr,
nullptr, 0,
1790 BitmapPtr->addDebugInfo(DICounter);
1791 DB.finalizeSubprogram(SP);
1796 CompilerUsedVars.push_back(
PD.RegionBitmaps);
1799 return PD.RegionBitmaps;
1806 auto &Ctx =
M.getContext();
1812 std::vector<Constant *> InitialValues(NumCounters,
1830 auto &
PD = ProfileDataMap[NamePtr];
1831 if (
PD.RegionCounters)
1832 return PD.RegionCounters;
1836 auto *CounterPtr = setupProfileSection(Inc, IPSK_cnts);
1837 PD.RegionCounters = CounterPtr;
1844 Metadata *FunctionNameAnnotation[] = {
1852 Metadata *NumCountersAnnotation[] = {
1861 auto *DICounter =
DB.createGlobalVariableExpression(
1862 SP, CounterPtr->getName(),
StringRef(),
SP->getFile(),
1863 0,
DB.createUnspecifiedType(
"Profile Data Type"),
1864 CounterPtr->hasLocalLinkage(),
true,
nullptr,
1865 nullptr,
nullptr, 0,
1867 CounterPtr->addDebugInfo(DICounter);
1868 DB.finalizeSubprogram(SP);
1873 CompilerUsedVars.push_back(
PD.RegionCounters);
1878 getOrCreateUniformCounters(Inc);
1881 createDataVariable(Inc);
1883 return PD.RegionCounters;
1893 auto &
PD = ProfileDataMap[NamePtr];
1894 if (
PD.UniformCounters)
1895 return PD.UniformCounters;
1897 assert(
PD.RegionCounters &&
"region counters must be created first");
1917 PD.UniformCounters = GV;
1918 CompilerUsedVars.push_back(GV);
1920 return PD.UniformCounters;
1930 auto &
PD = ProfileDataMap[NamePtr];
1947 if (
TT.isOSBinFormatXCOFF()) {
1956 std::string CntsVarName =
1958 std::string DataVarName =
1966 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
1967 NS +=
PD.NumValueSites[Kind];
1968 if (NS > 0 && Opts.vp_static_alloc &&
1974 ValuesVar->setVisibility(Visibility);
1976 ValuesVar->setSection(
1978 ValuesVar->setAlignment(
Align(8));
1979 maybeSetComdat(ValuesVar, Fn, CntsVarName);
1992 auto *
IntPtrTy =
M.getDataLayout().getIntPtrType(
M.getContext());
1995 auto *DataTy = getProfileDataTy();
1999 Constant *Int16ArrayVals[IPVK_Last + 1];
2000 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
2001 Int16ArrayVals[Kind] = ConstantInt::get(Int16Ty,
PD.NumValueSites[Kind]);
2003 uint16_t OffloadDeviceWaveSizeVal = 0;
2026 !(DataReferencedByCode && NeedComdat && !Renamed) &&
2027 (
TT.isOSBinFormatELF() ||
2028 (!DataReferencedByCode &&
TT.isOSBinFormatCOFF()))) {
2035 if (
TT.isGPU() &&
TT.isOSBinFormatELF() &&
2049 DataSectionKind = IPSK_covdata;
2051 if (BitmapPtr !=
nullptr)
2054 RelativeUniformCounterPtr =
2056 }
else if (
TT.isNVPTX()) {
2060 DataSectionKind = IPSK_data;
2065 DataSectionKind = IPSK_data;
2066 RelativeCounterPtr =
2069 if (BitmapPtr !=
nullptr)
2080#define INSTR_PROF_DATA(Type, LLVMType, Name, Init) Init,
2085 Data->setVisibility(Visibility);
2090 Data->setComdat(
M.getOrInsertComdat(CntsVarName));
2093 maybeSetComdat(
Data, Fn, CntsVarName);
2099 CompilerUsedVars.push_back(
Data);
2105 ReferencedNames.push_back(NamePtr);
2108void InstrLowerer::emitVNodes() {
2109 if (!Opts.vp_static_alloc)
2119 for (
auto &PD : ProfileDataMap) {
2120 for (uint32_t Kind = IPVK_First;
Kind <= IPVK_Last; ++
Kind)
2121 TotalNS +=
PD.second.NumValueSites[Kind];
2127 uint64_t NumCounters = TotalNS * Opts.vp_counters_per_site;
2135#define INSTR_PROF_MIN_VAL_COUNTS 10
2139 auto &Ctx =
M.getContext();
2140 Type *VNodeTypes[] = {
2141#define INSTR_PROF_VALUE_NODE(Type, LLVMType, Name, Init) LLVMType,
2151 VNodesVar->setSection(
2153 VNodesVar->setAlignment(
M.getDataLayout().getABITypeAlign(VNodesTy));
2156 UsedVars.push_back(VNodesVar);
2164 std::string Name = (
"__llvm_profile_sections" + CUIDPostfix).str();
2165 if (M.getNamedValue(Name))
2169 unsigned AS = M.getDataLayout().getDefaultGlobalsAddressSpace();
2175 nullptr, Sym,
nullptr,
2184 Constant *Fields[] = {
Extern(
"__start___llvm_prf_names", I8,
false, Hidden),
2185 Extern(
"__stop___llvm_prf_names", I8,
false, Hidden),
2186 Extern(
"__start___llvm_prf_cnts", I8,
false, Hidden),
2187 Extern(
"__stop___llvm_prf_cnts", I8,
false, Hidden),
2188 Extern(
"__start___llvm_prf_data", I8,
false, Hidden),
2189 Extern(
"__stop___llvm_prf_data", I8,
false, Hidden),
2190 Extern(
"__start___llvm_prf_ucnts", I8,
false, Hidden),
2191 Extern(
"__stop___llvm_prf_ucnts", I8,
false, Hidden),
2192 Extern(
"__llvm_profile_raw_version",
2197 Ctx, {PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy, PtrTy});
2206void InstrLowerer::emitNameData() {
2207 if (ReferencedNames.empty())
2210 std::string CompressedNameStr;
2216 auto &Ctx =
M.getContext();
2222 std::string GPUCUIDPostfix;
2227 if (
Init->isCString()) {
2228 GPUCUIDPostfix =
Init->getAsCString().str();
2229 NamesVarName += GPUCUIDPostfix;
2233 M, [GV](
Constant *
C) {
return C->stripPointerCasts() == GV; });
2239 NamesVar =
new GlobalVariable(M, NamesVal->getType(),
true, NamesLinkage,
2240 NamesVal, NamesVarName);
2241 NamesVar->setVisibility(NamesVisibility);
2243 NamesSize = CompressedNameStr.size();
2245 std::string NamesSectionName =
2249 NamesVar->setSection(NamesSectionName);
2253 NamesVar->setAlignment(
Align(1));
2256 UsedVars.push_back(NamesVar);
2258 for (
auto *NamePtr : ReferencedNames)
2264 [](
const auto &KV) { return KV.second.DataVar; });
2265 if (!GPUCUIDPostfix.empty() && HasData)
2267 CompilerUsedVars.push_back(GV);
2270void InstrLowerer::emitVTableNames() {
2275 std::string CompressedVTableNames;
2281 auto &Ctx =
M.getContext();
2283 Ctx,
StringRef(CompressedVTableNames),
false );
2292 UsedVars.push_back(VTableNamesVar);
2295void InstrLowerer::emitRegistration() {
2308 RegisterF->addFnAttr(Attribute::NoRedZone);
2311 auto *RuntimeRegisterF =
2319 IRB.CreateCall(RuntimeRegisterF,
2320 IRB.CreatePointerBitCastOrAddrSpaceCast(
Data, VoidPtrTy));
2323 IRB.CreateCall(RuntimeRegisterF,
2324 IRB.CreatePointerBitCastOrAddrSpaceCast(
Data, VoidPtrTy));
2327 Type *ParamTypes[] = {VoidPtrTy, Int64Ty};
2328 auto *NamesRegisterTy =
2330 auto *NamesRegisterF =
2333 IRB.CreateCall(NamesRegisterF, {IRB.CreatePointerBitCastOrAddrSpaceCast(
2334 NamesVar, VoidPtrTy),
2335 IRB.getInt64(NamesSize)});
2338 IRB.CreateRetVoid();
2341bool InstrLowerer::emitRuntimeHook() {
2349 if (
TT.isOSLinux() ||
TT.isOSAIX())
2363 if (
TT.isOSBinFormatELF() && !
TT.isPS()) {
2365 CompilerUsedVars.push_back(Var);
2371 User->addFnAttr(Attribute::NoInline);
2373 User->addFnAttr(Attribute::NoRedZone);
2375 if (
TT.supportsCOMDAT())
2378 User->setEntryCount(0);
2381 auto *
Load = IRB.CreateLoad(Int32Ty, Var);
2382 IRB.CreateRet(
Load);
2385 CompilerUsedVars.push_back(
User);
2390void InstrLowerer::emitUses() {
2400 if (
TT.isOSBinFormatELF() ||
TT.isOSBinFormatMachO() ||
2401 (
TT.isOSBinFormatCOFF() && !DataReferencedByCode))
2412void InstrLowerer::emitInitialization() {
2429 F->addFnAttr(Attribute::NoInline);
2431 F->addFnAttr(Attribute::NoRedZone);
2435 IRB.CreateCall(RegisterF, {});
2436 IRB.CreateRetVoid();
2447 const InstrumentationOptions &Opts =
2448 M.getContext().getLibraryOptions().get<InstrumentationOptions>();
2449 if (getSampledInstrumentationConfig(Opts).UseShort) {
2459 SamplingVar->setThreadLocal(
true);
2460 Triple TT(M.getTargetTriple());
2461 if (TT.supportsCOMDAT()) {
2463 SamplingVar->setComdat(M.getOrInsertComdat(VarName));
2472StructType *InstrLowerer::getProfileDataTy() {
2474 return ProfileDataTy;
2476 auto &Ctx =
M.getContext();
2477 auto *
IntPtrTy =
M.getDataLayout().getIntPtrType(
M.getContext());
2480 Type *DataTypes[] = {
2481#define INSTR_PROF_DATA(Type, LLVMType, Name, Init) LLVMType,
2485 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.
LLVM_ABI bool isProfileCorrelationEnabled(const cl::LibraryOptionsContext &LibraryOptions)
Return true if -profile-correlate is set.
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.
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.