74#define DEBUG_TYPE "globalopt"
76STATISTIC(NumMarked ,
"Number of globals marked constant");
77STATISTIC(NumUnnamed ,
"Number of globals marked unnamed_addr");
78STATISTIC(NumSRA ,
"Number of aggregate globals broken into scalars");
79STATISTIC(NumSubstitute,
"Number of globals with initializers stored into them");
81STATISTIC(NumGlobUses ,
"Number of global uses devirtualized");
82STATISTIC(NumLocalized ,
"Number of globals localized");
83STATISTIC(NumShrunkToBool ,
"Number of global vars shrunk to booleans");
84STATISTIC(NumFastCallFns ,
"Number of functions converted to fastcc");
85STATISTIC(NumCtorsEvaluated,
"Number of static ctors evaluated");
86STATISTIC(NumNestRemoved ,
"Number of nest attributes removed");
87STATISTIC(NumAliasesResolved,
"Number of global aliases resolved");
88STATISTIC(NumAliasesRemoved,
"Number of global aliases eliminated");
89STATISTIC(NumCXXDtorsRemoved,
"Number of global C++ destructors removed");
90STATISTIC(NumAtExitRemoved,
"Number of atexit handlers removed");
91STATISTIC(NumInternalFunc,
"Number of internal functions");
92STATISTIC(NumColdCC,
"Number of functions marked coldcc");
93STATISTIC(NumIFuncsResolved,
"Number of statically resolved IFuncs");
94STATISTIC(NumIFuncsDeleted,
"Number of IFuncs removed");
115 Type *Ty = Types.pop_back_val();
116 switch (Ty->getTypeID()) {
135 Types.push_back(InnerTy);
140 if (--Limit == 0)
return true;
141 }
while (!Types.empty());
162 if (
I->mayHaveSideEffects())
165 if (!
GEP->hasAllConstantIndices())
167 }
else if (
I->getNumOperands() != 1) {
171 V =
I->getOperand(0);
198 while (!Worklist.
empty()) {
204 SI->eraseFromParent();
207 Dead.push_back(std::make_pair(
I,
SI));
212 MSI->eraseFromParent();
215 Dead.push_back(std::make_pair(
I, MSI));
221 MTI->eraseFromParent();
224 Dead.push_back(std::make_pair(
I, MTI));
234 Store->eraseFromParent();
242 I->eraseFromParent();
245 I->eraseFromParent();
269 I->eraseFromParent();
272 while (!WorkList.
empty()) {
274 if (!Visited.
insert(U).second)
286 Type *Ty = LI->getType();
288 LI->replaceAllUsesWith(Res);
293 Value *PtrOp = LI->getPointerOperand();
298 if (
II->getIntrinsicID() == Intrinsic::threadlocal_address)
299 PtrOp =
II->getArgOperand(0);
303 LI->replaceAllUsesWith(
Value);
314 if (
II->getIntrinsicID() == Intrinsic::threadlocal_address)
340 auto AppendUses = [&](
Value *
V) {
341 for (
Use &U :
V->uses())
342 if (Visited.
insert(&U).second)
346 while (!Worklist.
empty()) {
348 User *
V = U->getUser();
352 (
GEP &&
GEP->hasAllConstantIndices())) {
364 Ptr = Ptr->stripAndAccumulateConstantOffsets(
DL,
Offset,
366 if (Ptr != GV ||
Offset.getActiveBits() >= 64)
372 const auto &[It, Inserted] =
374 if (Ty != It->second.Ty)
378 It->second.Initializer =
380 if (!It->second.Initializer) {
381 LLVM_DEBUG(
dbgs() <<
"Global SRA: Failed to evaluate initializer of "
382 << *GV <<
" with type " << *Ty <<
" at offset "
383 <<
Offset.getZExtValue());
389 if (Ty->isScalableTy())
402 return Initializer != StoredConst;
406 It->second.IsStored |= IsStored(
V, It->second.Initializer);
431 for (
auto *GVE : GVs) {
434 int64_t CurVarOffsetInBytes = 0;
436 uint64_t FragmentEndInBits = FragmentOffsetInBits + FragmentSizeInBits;
443 if (CurVarOffsetInBytes < 0)
447 CurVarOffsetInBits = CHAR_BIT * (
uint64_t)CurVarOffsetInBytes;
450 if (CurVarOffsetInBits >= FragmentEndInBits)
454 uint64_t CurVarEndInBits = CurVarOffsetInBits + CurVarSize;
456 if (CurVarSize != 0 &&
457 CurVarEndInBits <= FragmentOffsetInBits)
462 if (CurVarSize != 0 &&
463 CurVarOffsetInBits >= FragmentOffsetInBits &&
464 CurVarEndInBits <= FragmentEndInBits) {
466 (CurVarOffsetInBits - FragmentOffsetInBits) / 8;
467 if (CurVarOffsetInFragment != 0)
469 CurVarOffsetInFragment});
479 if (FragmentSizeInBits < VarSize) {
480 if (CurVarOffsetInBits > FragmentOffsetInBits)
482 uint64_t CurVarFragmentOffsetInBits =
483 FragmentOffsetInBits - CurVarOffsetInBits;
484 uint64_t CurVarFragmentSizeInBits = FragmentSizeInBits;
485 if (CurVarSize != 0 && CurVarEndInBits < FragmentEndInBits)
486 CurVarFragmentSizeInBits -= (FragmentEndInBits - CurVarEndInBits);
487 if (CurVarOffsetInBits)
490 Expr, CurVarFragmentOffsetInBits, CurVarFragmentSizeInBits))
521 return Pair.second.IsLoaded && Pair.second.IsStored;
528 for (
const auto &Pair : Parts) {
530 {Pair.first, Pair.second.Ty, Pair.second.Initializer});
536 for (
const auto &[OffsetForTy, Ty,
_] : TypesVector) {
541 Offset = OffsetForTy +
DL.getTypeAllocSize(Ty);
548 LLVM_DEBUG(
dbgs() <<
"PERFORMING GLOBAL SRA ON: " << *GV <<
"\n");
551 Align StartAlignment =
557 unsigned NameSuffix = 0;
558 for (
auto &[OffsetForTy, Ty, Initializer] : TypesVector) {
561 Initializer, GV->
getName() +
"." +
Twine(NameSuffix++), GV,
565 NewGlobals.
insert({OffsetForTy, NGV});
576 DL.getTypeAllocSizeInBits(Ty), VarSize);
583 auto AppendUsers = [&](
Value *
V) {
584 for (
User *U :
V->users())
585 if (Visited.
insert(U).second)
589 while (!Worklist.
empty()) {
601 Ptr = Ptr->stripAndAccumulateConstantOffsets(
DL,
Offset,
603 assert(Ptr == GV &&
"Load/store must be from/to global");
605 assert(NGV &&
"Must have replacement global for this offset");
613 LI->setOperand(0, NGV);
614 LI->setAlignment(NewAlign);
617 SI->setOperand(1, NGV);
618 SI->setAlignment(NewAlign);
624 "Other users can only be dead constants");
634 return NewGlobals.
begin()->second;
647 LI->setOperand(0, NewV);
650 if (
SI->getOperand(1) ==
V) {
651 SI->setOperand(1, NewV);
661 for (
unsigned i = 0, e = CB->
arg_size(); i != e; ++i)
668 if (CI->use_empty()) {
670 CI->eraseFromParent();
675 Idxs.
reserve(GEPI->getNumOperands()-1);
682 if (Idxs.
size() == GEPI->getNumOperands() - 1) {
684 V->getDataLayout(), GEPI->getSourceElementType(), NewV, Idxs))
687 if (GEPI->use_empty()) {
689 GEPI->eraseFromParent();
708 bool AllNonStoreUsesGone =
true;
715 if (LI->use_empty()) {
716 LI->eraseFromParent();
719 AllNonStoreUsesGone =
false;
723 assert(GlobalUser->getOperand(1) == GV &&
724 "Must be storing *to* the global");
726 AllNonStoreUsesGone =
false;
731 LLVM_DEBUG(
dbgs() <<
"OPTIMIZED LOADS FROM STORED ONCE POINTER: " << *GV
738 if (AllNonStoreUsesGone) {
822 "No reason to shrink to bool!");
829 bool IsOneZero =
false;
830 bool EmitOneOrZero =
true;
832 if (CI && CI->getValue().getActiveBits() <= 64) {
836 if (CIInit && CIInit->getValue().getActiveBits() <= 64) {
837 uint64_t ValInit = CIInit->getZExtValue();
838 uint64_t ValOther = CI->getZExtValue();
839 uint64_t ValMinus = ValOther - ValInit;
841 for(
auto *GVe : GVs){
856 dwarf::DW_OP_deref_size, SizeInOctets,
857 dwarf::DW_OP_constu, ValMinus,
858 dwarf::DW_OP_mul, dwarf::DW_OP_constu, ValInit,
860 bool WithStackValue =
true;
866 EmitOneOrZero =
false;
881 bool StoringOther =
SI->getOperand(0) == OtherVal;
884 if (StoringOther ||
SI->getOperand(0) == InitVal) {
897 assert(LI->getOperand(0) == GV &&
"Not a copy!");
901 false,
Align(1), LI->getOrdering(),
902 LI->getSyncScopeID(), LI->getIterator());
906 "This is not a form that we understand!");
913 SI->getSyncScopeID(),
SI->getIterator());
960 Dead = (
F->isDeclaration() &&
F->use_empty()) ||
F->isDefTriviallyDead();
968 if (DeleteFnCallback)
969 DeleteFnCallback(*
F);
993 for (
auto *U : GV->
users()) {
997 assert(
I->getParent()->getParent() ==
F);
1011 auto &DT = LookupDomTree(*
const_cast<Function *
>(
F));
1022 const unsigned Threshold = 100;
1023 if (Loads.
size() * Stores.
size() > Threshold)
1026 for (
auto *L : Loads) {
1027 auto *LTy = L->getType();
1033 return DT.dominates(S, L) &&
1034 DL.getTypeStoreSize(LTy).getFixedValue() <=
1035 DL.getTypeStoreSize(STy).getFixedValue();
1059 if (LI->getFunction() ==
F &&
1060 LI->getType() == StoredOnceValue->
getType() && LI->isSimple())
1065 bool MadeChange =
false;
1066 if (!Loads.
empty()) {
1067 auto &DT = LookupDomTree(*
const_cast<Function *
>(
F));
1068 for (
auto *LI : Loads) {
1069 if (DT.dominates(StoredOnceStore, LI)) {
1070 LI->replaceAllUsesWith(
const_cast<Value *
>(StoredOnceValue));
1071 LI->eraseFromParent();
1095 if (!GS.HasMultipleAccessingFunctions &&
1096 GS.AccessingFunction &&
1100 GS.AccessingFunction->doesNotRecurse() &&
1107 GS.AccessingFunction->getEntryBlock().begin().getNonConst();
1111 nullptr, GV->
getName(), FirstI);
1169 LLVM_DEBUG(
dbgs() <<
" *** Marking constant allowed us to simplify "
1170 <<
"all users and delete global!\n");
1184 Value *StoredOnceValue = GS.getStoredOnceValue();
1187 const_cast<Function &
>(*GS.StoredOnceStore->getFunction());
1188 bool CanHaveNonUndefGlobalInitializer =
1189 GetTTI(StoreFn).canHaveNonUndefGlobalInitializerInAddressSpace(
1200 DL.getTypeAllocSize(SOVConstant->getType()).getFixedValue() ==
1202 CanHaveNonUndefGlobalInitializer) {
1213 NGV->copyAttributesFrom(GV);
1223 LLVM_DEBUG(
dbgs() <<
" *** Substituting initializer allowed us to "
1224 <<
"simplify all users and delete global!\n");
1239 if (GS.NumStores == 1)
1247 CanHaveNonUndefGlobalInitializer)) {
1299 if (GVar->isConstant() || !GVar->hasInitializer())
1309 for (
User *U :
F->users())
1311 if (
Call->getCalledOperand() ==
F)
1318 if (Attrs.hasAttrSomewhere(
A, &AttrIndex))
1319 return Attrs.removeAttributeAtIndex(
C, AttrIndex,
A);
1324 F->setAttributes(
StripAttr(
F->getContext(),
F->getAttributes(),
A));
1325 for (
User *U :
F->users()) {
1342 if (!
F->canChangeSignature())
1352 for (
User *U :
F->users()) {
1362 if (BB.getTerminatingMustTailCall())
1365 return !
F->hasAddressTaken();
1374 return Res.first->second;
1383 auto CallSiteFreq = CallerBFI.
getBlockFreq(CallSiteBB);
1384 auto CallerEntryFreq =
1386 return CallSiteFreq < CallerEntryFreq * ColdProb;
1401 for (
User *U :
F.users()) {
1409 if (!HasOnlyColdCalls(*CallerFunc))
1416 for (
User *U :
F->users())
1418 if (
Call->getCalledOperand() ==
F)
1433 if (CI->isInlineAsm())
1435 Function *CalledFn = CI->getCalledFunction();
1459 for (
User *U :
F->users()) {
1468 for (
User *U :
F->users())
1477 auto *M =
F->getParent();
1485 !CB->isMustTailCall() &&
1486 "Shouldn't call RemotePreallocated() on a musttail preallocated call");
1489 CB->getOperandBundlesAsDefs(OpBundles);
1490 CallBase *PreallocatedSetup =
nullptr;
1491 for (
auto *It = OpBundles.
begin(); It != OpBundles.
end(); ++It) {
1492 if (It->getTag() ==
"preallocated") {
1494 OpBundles.
erase(It);
1498 assert(PreallocatedSetup &&
"Did not find preallocated bundle");
1503 "Unknown indirect call type");
1505 CB->replaceAllUsesWith(NewCB);
1507 CB->eraseFromParent();
1509 Builder.SetInsertPoint(PreallocatedSetup);
1510 auto *StackSave = Builder.CreateStackSave();
1512 Builder.CreateStackRestore(StackSave);
1523 for (
auto *
User : PreallocatedArgs) {
1525 assert(UseCall->getCalledFunction()->getIntrinsicID() ==
1526 Intrinsic::call_preallocated_arg &&
1527 "preallocated token use was not a llvm.call.preallocated.arg");
1530 Value *AllocaReplacement = ArgAllocas[AllocArgIndex];
1531 if (!AllocaReplacement) {
1532 auto AddressSpace = UseCall->getType()->getPointerAddressSpace();
1534 UseCall->getFnAttr(Attribute::Preallocated).getValueAsType();
1535 auto *InsertBefore = PreallocatedSetup->
getNextNode();
1536 Builder.SetInsertPoint(InsertBefore);
1538 Builder.CreateAlloca(ArgType,
AddressSpace,
nullptr,
"paarg");
1539 ArgAllocas[AllocArgIndex] = Alloca;
1540 AllocaReplacement = Alloca;
1543 UseCall->replaceAllUsesWith(AllocaReplacement);
1544 UseCall->eraseFromParent();
1568 auto HasOnlyColdCalls = [&](
Function &Caller) {
1569 auto Res = AllCallsColdCache.
try_emplace(&Caller,
false);
1573 return Res.first->second;
1580 if (
F.hasFnAttribute(Attribute::Naked))
1584 if (!
F.hasName() && !
F.isDeclaration() && !
F.hasLocalLinkage())
1587 if (
deleteIfDead(
F, NotDiscardableComdats, DeleteFnCallback)) {
1601 if (!
F.isDeclaration()) {
1604 ChangedCFGCallback(
F);
1610 if (!
F.hasLocalLinkage())
1614 if (!
F.isDefinitionExact())
1622 if (
F.getAttributes().hasAttrSomewhere(Attribute::InAlloca) &&
1630 if (
F.getAttributes().hasAttrSomewhere(Attribute::Preallocated)) {
1646 if (Opts.enable_coldcc_stress_test ||
1647 (
TTI.useColdCCForColdCall(
F) &&
1649 ChangeableCCCache.
erase(&
F);
1662 if (
TTI.useFastCCForInternalCall(
F)) {
1670 if (
F.getAttributes().hasAttrSomewhere(Attribute::Nest) &&
1671 !
F.hasAddressTaken()) {
1695 if (GV.hasInitializer()) {
1696 const Constant *
C = GV.getInitializer();
1697 auto &
DL = M.getDataLayout();
1703 GV.setInitializer(New);
1721 if (
F->isDeclaration())
1730 ++NumCtorsEvaluated;
1735 <<
F->getName() <<
"' to " << NewInitializers.size()
1737 for (
const auto &Pair : NewInitializers)
1738 Pair.first->setInitializer(Pair.second);
1740 GV->setConstant(
true);
1755 V.eraseFromParent();
1760 const Type *UsedArrayType =
V.getValueType();
1779 V.removeFromParent();
1785 NV->setSection(
"llvm.metadata");
1793 SmallPtrSet<GlobalValue *, 4> Used;
1794 SmallPtrSet<GlobalValue *, 4> CompilerUsed;
1795 GlobalVariable *UsedV;
1796 GlobalVariable *CompilerUsedV;
1808 using iterator = SmallPtrSet<GlobalValue *, 4>::iterator;
1809 using used_iterator_range = iterator_range<iterator>;
1811 iterator usedBegin() {
return Used.begin(); }
1812 iterator usedEnd() {
return Used.end(); }
1814 used_iterator_range
used() {
1815 return used_iterator_range(usedBegin(), usedEnd());
1818 iterator compilerUsedBegin() {
return CompilerUsed.begin(); }
1819 iterator compilerUsedEnd() {
return CompilerUsed.end(); }
1821 used_iterator_range compilerUsed() {
1822 return used_iterator_range(compilerUsedBegin(), compilerUsedEnd());
1825 bool usedCount(GlobalValue *GV)
const {
return Used.count(GV); }
1827 bool compilerUsedCount(GlobalValue *GV)
const {
1828 return CompilerUsed.count(GV);
1831 bool usedErase(GlobalValue *GV) {
return Used.erase(GV); }
1832 bool compilerUsedErase(GlobalValue *GV) {
return CompilerUsed.erase(GV); }
1833 bool usedInsert(GlobalValue *GV) {
return Used.insert(GV).second; }
1835 bool compilerUsedInsert(GlobalValue *GV) {
1836 return CompilerUsed.insert(GV).second;
1839 void syncVariablesAndSets() {
1853 assert((!U.usedCount(&GA) || !U.compilerUsedCount(&GA)) &&
1854 "We should have removed the duplicated "
1855 "element from llvm.compiler.used");
1862 return !U.usedCount(&GA) && !U.compilerUsedCount(&GA);
1869 return U.usedCount(&GV) || U.compilerUsedCount(&GV);
1873 bool &RenameTarget) {
1877 RenameTarget =
false;
1898 RenameTarget =
true;
1909 Used.compilerUsedErase(GV);
1920 if (!J.hasName() && !J.isDeclaration() && !J.hasLocalLinkage())
1929 if (!IsModuleLocal(J))
1932 Constant *Aliasee = J.getAliasee();
1943 Target->removeDeadConstantUsers();
1950 J.replaceAllUsesWith(Aliasee);
1951 ++NumAliasesResolved;
1957 Target->setLinkage(J.getLinkage());
1958 Target->setDSOLocal(J.isDSOLocal());
1959 Target->setVisibility(J.getVisibility());
1960 Target->setDLLStorageClass(J.getDLLStorageClass());
1962 if (Used.usedErase(&J))
1965 if (Used.compilerUsedErase(&J))
1966 Used.compilerUsedInsert(
Target);
1972 ++NumAliasesRemoved;
1976 Used.syncVariablesAndSets();
1986 auto FuncIter = M.
begin();
1987 if (FuncIter == M.end())
1989 auto *
TLI = &GetTLI(*FuncIter);
1991 if (!
TLI->has(Func))
2002 if (
TLI->getLibFunc(*Fn) != Func)
2063 ++NumCXXDtorsRemoved;
2107 if (!IF.use_empty() &&
2108 (!Callee->isDeclaration() ||
2109 none_of(IF.users(), [](
User *U) { return isa<GlobalAlias>(U); }))) {
2110 IF.replaceAllUsesWith(Callee);
2111 NumIFuncsResolved++;
2136 if (!GetTTI(*F).isMultiversionedFunction(*
F))
2145 for (
unsigned I = 0,
E = Phi->getNumIncomingValues();
I !=
E; ++
I)
2193 LLVM_DEBUG(
dbgs() <<
"Examining IFUNC " << IF.getName() <<
"\n");
2195 if (IF.isInterposable())
2215 if (Versions.
empty())
2220 auto [FeatIt, FeatInserted] = FeatureMask.
try_emplace(
V);
2222 FeatIt->second = GetTTI(*V).getFeatureMask(*
V);
2223 auto [PriorIt, PriorInserted] = PriorityMask.
try_emplace(
V);
2225 PriorIt->second = GetTTI(*V).getPriorityMask(*
V);
2230 return PriorityMask[
LHS].ugt(PriorityMask[
RHS]);
2234 VersionedFuncs.
try_emplace(&IF, std::move(Versions));
2245 if (CB->getCalledOperand() == CalleeIF) {
2246 Function *Caller = CB->getFunction();
2249 bool CallerIsFMV =
TTI.isMultiversionedFunction(*Caller);
2251 if (
auto It = VersionOf.
find(Caller); It != VersionOf.
end())
2252 CallerIF = It->second;
2253 else if (!CallerIsFMV && Opts.optimize_non_fmv_callers) {
2255 auto [It, Inserted] = FeatureMask.
try_emplace(Caller);
2257 It->second =
TTI.getFeatureMask(*Caller);
2261 auto [It, Inserted] = CallSites.
try_emplace(Caller);
2264 CallerIFuncs.
insert(CallerIF);
2268 It->second.push_back(CB);
2273 if (CallSites.
empty())
2277 << CalleeIF->getResolverFunction()->getName() <<
"\n");
2285 bool AllowExpensiveChecks = CallerIsFMV &&
2286 Callers.
size() <= Opts.max_ifunc_versions &&
2287 Callees.
size() <= Opts.max_ifunc_versions;
2291 for (
unsigned I = 0,
E = Callers.
size();
I <
E; ++
I) {
2293 if (J == Callees.
size())
2297 APInt CallerBits = FeatureMask[Caller];
2304 auto eliminateAvailableFeatures = [&](
unsigned BestCandidate) {
2306 while (
K <
I && BestCandidate < Callees.
size()) {
2307 APInt MissingBits = FeatureMask[Callers[
K]] & ~CallerBits;
2308 if (MissingBits.
isSubsetOf(FeatureMask[Callees[BestCandidate]])) {
2315 return BestCandidate;
2318 unsigned BestCandidate =
2319 AllowExpensiveChecks ? eliminateAvailableFeatures(J) : J;
2321 if (BestCandidate == Callees.
size())
2325 << (CallerIsFMV ?
"FMV" :
"regular") <<
" caller "
2326 << Caller->getName() <<
"\n");
2328 Function *Callee = Callees[BestCandidate];
2329 APInt CalleeBits = FeatureMask[Callee];
2336 if (
auto It = CallSites.
find(Caller); It != CallSites.
end()) {
2339 <<
" -> " << Callee->getName() <<
"\n");
2354 while (CallerBits.
isSubsetOf(FeatureMask[Callees[J]]) &&
2355 ++J < Callees.
size())
2360 auto &Callees = VersionedFuncs[CalleeIF];
2363 if (Opts.optimize_non_fmv_callers)
2364 staticallyResolveCalls(NonFMVCallers, Callees,
false);
2368 auto &Callers = VersionedFuncs[CallerIF];
2369 staticallyResolveCalls(Callers, Callees,
true);
2372 if (CalleeIF->use_empty() ||
2373 all_of(CalleeIF->users(), [](
User *U) { return isa<GlobalAlias>(U); }))
2374 NumIFuncsResolved++;
2389 bool LocalChange =
true;
2390 std::optional<uint32_t> FirstNotFullyEvaluatedPriority;
2392 while (LocalChange) {
2393 LocalChange =
false;
2395 NotDiscardableComdats.
clear();
2399 NotDiscardableComdats.
insert(
C);
2401 if (
const Comdat *
C =
F.getComdat())
2402 if (!
F.isDefTriviallyDead())
2403 NotDiscardableComdats.
insert(
C);
2405 if (
const Comdat *
C = GA.getComdat())
2406 if (!GA.isDiscardableIfUnused() || !GA.use_empty())
2407 NotDiscardableComdats.
insert(
C);
2411 NotDiscardableComdats, ChangedCFGCallback,
2417 if (FirstNotFullyEvaluatedPriority &&
2418 *FirstNotFullyEvaluatedPriority != Priority)
2422 FirstNotFullyEvaluatedPriority = Priority;
2428 NotDiscardableComdats);
2461 auto &
DL = M.getDataLayout();
2483 ChangedCFGCallback, DeleteFnCallback))
const TargetLowering & TLI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Atomic ordering constants.
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< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file contains constants used for implementing Dwarf debug support.
static bool IsSafeComputationToRemove(Value *V, function_ref< TargetLibraryInfo &(Function &)> GetTLI)
Given a value that is stored to a global but never read, determine whether it's safe to remove the st...
static bool isValidCandidateForColdCC(const IPOOptions &Opts, Function &F, function_ref< BlockFrequencyInfo &(Function &)> GetBFI, function_ref< bool(Function &)> HasOnlyColdCalls)
static Function * FindAtExitLibFunc(Module &M, function_ref< TargetLibraryInfo &(Function &)> GetTLI, LibFunc Func)
static bool optimizeOnceStoredGlobal(GlobalVariable *GV, Value *StoredOnceVal, const DataLayout &DL, function_ref< TargetLibraryInfo &(Function &)> GetTLI)
static Function * hasSideeffectFreeStaticResolution(GlobalIFunc &IF)
static bool OptimizeStaticIFuncs(Module &M)
Find IFuncs that have resolvers that always point at the same statically known callee,...
static bool hasChangeableCCImpl(Function *F)
Return true if this is a calling convention that we'd like to change.
static bool collectVersions(Value *V, SmallVectorImpl< Function * > &Versions, function_ref< TargetTransformInfo &(Function &)> GetTTI)
static bool IsEmptyAtExitFunction(const Function &Fn)
Returns whether the given function is an empty C++ destructor or atexit handler and can therefore be ...
static bool collectSRATypes(DenseMap< uint64_t, GlobalPart > &Parts, GlobalVariable *GV, const DataLayout &DL)
Look at all uses of the global and determine which (offset, type) pairs it can be split into.
static bool OptimizeFunctions(Module &M, function_ref< TargetLibraryInfo &(Function &)> GetTLI, function_ref< TargetTransformInfo &(Function &)> GetTTI, function_ref< BlockFrequencyInfo &(Function &)> GetBFI, function_ref< DominatorTree &(Function &)> LookupDomTree, SmallPtrSetImpl< const Comdat * > &NotDiscardableComdats, function_ref< void(Function &F)> ChangedCFGCallback, function_ref< void(Function &F)> DeleteFnCallback)
static bool DeleteDeadIFuncs(Module &M, SmallPtrSetImpl< const Comdat * > &NotDiscardableComdats)
static bool hasOnlyColdCalls(const IPOOptions &Opts, Function &F, function_ref< BlockFrequencyInfo &(Function &)> GetBFI, ChangeableCCCacheTy &ChangeableCCCache)
static void RemoveAttribute(Function *F, Attribute::AttrKind A)
static bool hasChangeableCC(Function *F, ChangeableCCCacheTy &ChangeableCCCache)
static bool deleteIfDead(GlobalValue &GV, SmallPtrSetImpl< const Comdat * > &NotDiscardableComdats, function_ref< void(Function &)> DeleteFnCallback=nullptr)
static void RemovePreallocated(Function *F)
static bool processGlobal(GlobalValue &GV, function_ref< TargetTransformInfo &(Function &)> GetTTI, function_ref< TargetLibraryInfo &(Function &)> GetTLI, function_ref< DominatorTree &(Function &)> LookupDomTree)
Analyze the specified global variable and optimize it if possible.
static bool isColdCallSite(const IPOOptions &Opts, CallBase &CB, BlockFrequencyInfo &CallerBFI)
Return true if the block containing the call site has a BlockFrequency of less than -coldcc-rel-freq ...
static void transferSRADebugInfo(GlobalVariable *GV, GlobalVariable *NGV, uint64_t FragmentOffsetInBits, uint64_t FragmentSizeInBits, uint64_t VarSize)
Copy over the debug info for a variable to its SRA replacements.
static bool OptimizeGlobalAliases(Module &M, SmallPtrSetImpl< const Comdat * > &NotDiscardableComdats)
static bool TryToShrinkGlobalToBoolean(GlobalVariable *GV, Constant *OtherVal)
At this point, we have learned that the only two values ever stored into GV are its initializer and O...
static void ChangeCalleesToFastCall(Function *F)
Walk all of the direct calls of the specified function, changing them to FastCC.
static bool hasMustTailCallers(Function *F)
static bool OptimizeNonTrivialIFuncs(Module &M, function_ref< TargetTransformInfo &(Function &)> GetTTI)
static bool OptimizeGlobalVars(Module &M, function_ref< TargetTransformInfo &(Function &)> GetTTI, function_ref< TargetLibraryInfo &(Function &)> GetTLI, function_ref< DominatorTree &(Function &)> LookupDomTree, SmallPtrSetImpl< const Comdat * > &NotDiscardableComdats)
static bool OptimizeEmptyGlobalAtExitDtors(Function *CXAAtExitFn, bool isCXX)
static bool mayHaveOtherReferences(GlobalValue &GV, const LLVMUsed &U)
static void changeCallSitesToColdCC(Function *F)
static AttributeList StripAttr(LLVMContext &C, AttributeList Attrs, Attribute::AttrKind A)
static bool hasInvokeCallers(Function *F)
static bool OptimizeAwayTrappingUsesOfValue(Instruction *V, Constant *NewV)
static void setUsedInitializer(GlobalVariable &V, const SmallPtrSetImpl< GlobalValue * > &Init)
static bool OptimizeAwayTrappingUsesOfLoads(GlobalVariable *GV, Constant *LV, const DataLayout &DL, function_ref< TargetLibraryInfo &(Function &)> GetTLI)
The specified global has only one non-null value stored into it.
static bool optimizeGlobalsInModule(Module &M, const DataLayout &DL, function_ref< TargetLibraryInfo &(Function &)> GetTLI, function_ref< TargetTransformInfo &(Function &)> GetTTI, function_ref< BlockFrequencyInfo &(Function &)> GetBFI, function_ref< DominatorTree &(Function &)> LookupDomTree, function_ref< void(Function &F)> ChangedCFGCallback, function_ref< void(Function &F)> DeleteFnCallback)
static bool EvaluateStaticConstructor(Function *F, const DataLayout &DL, TargetLibraryInfo *TLI)
Evaluate static constructors in the function, if we can.
static bool CleanupConstantGlobalUsers(GlobalVariable *GV, const DataLayout &DL)
We just marked GV constant.
SmallDenseMap< Function *, bool, 8 > ChangeableCCCacheTy
static bool isLeakCheckerRoot(GlobalVariable *GV)
Is this global variable possibly used by a leak checker as a root?
static bool forwardStoredOnceStore(GlobalVariable *GV, const StoreInst *StoredOnceStore, function_ref< DominatorTree &(Function &)> LookupDomTree)
static int compareNames(Constant *const *A, Constant *const *B)
static bool CleanupPointerRootUsers(GlobalVariable *GV, function_ref< TargetLibraryInfo &(Function &)> GetTLI)
This GV is a pointer root.
static bool isPointerValueDeadOnEntryToFunction(const Function *F, GlobalValue *GV, function_ref< DominatorTree &(Function &)> LookupDomTree)
static bool processInternalGlobal(GlobalVariable *GV, const GlobalStatus &GS, function_ref< TargetTransformInfo &(Function &)> GetTTI, function_ref< TargetLibraryInfo &(Function &)> GetTLI, function_ref< DominatorTree &(Function &)> LookupDomTree)
Analyze the specified global variable and optimize it if possible.
static bool hasUsesToReplace(GlobalAlias &GA, const LLVMUsed &U, bool &RenameTarget)
static GlobalVariable * SRAGlobal(GlobalVariable *GV, const DataLayout &DL)
Perform scalar replacement of aggregates on the specified global variable.
static bool hasUseOtherThanLLVMUsed(GlobalAlias &GA, const LLVMUsed &U)
Module.h This file contains the declarations for the Module class.
This defines the Use class.
iv Induction Variable Users
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
uint64_t IntrinsicInst * II
FunctionAnalysisManager FAM
This file contains the declarations for profiling metadata utility functions.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Class for arbitrary precision integers.
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
This class represents a conversion between pointers from one address space to another.
an instruction to allocate memory on the stack
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
LLVM Basic Block Representation.
InstListType::iterator iterator
Instruction iterators...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
LLVM_ABI BlockFrequency getBlockFreq(const BasicBlock *BB) const
getblockFreq - Return block frequency.
Represents analyses that only rely on functions' control flow.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
LLVM_ABI bool isMustTailCall() const
Tests if this call site must be tail call optimized.
bool isCallee(Value::const_user_iterator UI) const
Determine whether the passed iterator points to the callee operand's Use.
Value * getCalledOperand() const
void setAttributes(AttributeList A)
Set the attributes for this call.
Value * getArgOperand(unsigned i) const
void setArgOperand(unsigned i, Value *v)
static LLVM_ABI CallBase * Create(CallBase *CB, ArrayRef< OperandBundleDef > Bundles, InsertPosition InsertPt=nullptr)
Create a clone of CB with a different set of operand bundles and insert it before InsertPt.
void setCalledOperand(Value *V)
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
LLVM_ABI Function * getCaller()
Helper to get the caller (the parent function).
This class represents a function call, abstracting a target machine's calling convention.
bool isMustTailCall() const
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
A constant value that is initialized with an expression using other constant values.
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_SUPPRESS_DEPRECATED_DECLARATIONS_PUSH Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
static LLVM_ABI Constant * getAddrSpaceCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
This is an important base class in LLVM.
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
const Constant * stripPointerCasts() const
LLVM_ABI void removeDeadConstantUsers() const
If there are any dead constant users dangling off of this constant, remove them.
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI bool extractIfOffset(int64_t &Offset) const
If this is a constant offset, extract it.
static LLVM_ABI std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
static LLVM_ABI DIExpression * prependOpcodes(const DIExpression *Expr, SmallVectorImpl< uint64_t > &Ops, bool StackValue=false, bool EntryValue=false)
Prepend DIExpr with the given opcodes and optionally turn it into a stack value.
A pair of DIGlobalVariable and DIExpression.
uint64_t getSizeInBits() const
Base class for variables.
A parsed version of the target data layout string in and methods for querying it.
static DebugLoc getCompilerGenerated()
iterator find(const_arg_type_t< KeyT > Val)
bool erase(const KeyT &Val)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Implements a dense probed hash-table based set.
Analysis pass which computes a DominatorTree.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
This class evaluates LLVM IR, producing the Constant representing each SSA instruction.
DenseMap< GlobalVariable *, Constant * > getMutatedInitializers() const
LLVM_ABI bool EvaluateFunction(Function *F, Constant *&RetVal, const SmallVectorImpl< Constant * > &ActualArgs)
Evaluate a call to function F, returning true if successful, false if we can't evaluate it.
const SmallPtrSetImpl< GlobalVariable * > & getInvariants() const
const BasicBlock & getEntryBlock() const
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
const Function & getFunction() const
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
const Constant * getAliasee() const
LLVM_ABI const Function * getResolverFunction() const
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
bool isImplicitDSOLocal() const
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
void setUnnamedAddr(UnnamedAddr Val)
bool hasLocalLinkage() const
bool hasPrivateLinkage() const
LLVM_ABI const Comdat * getComdat() const
ThreadLocalMode getThreadLocalMode() const
void setLinkage(LinkageTypes LT)
unsigned getAddressSpace() const
Module * getParent()
Get the module that this global value is contained inside of...
LLVM_ABI void eraseFromParent()
This method unlinks 'this' from the containing module and deletes it.
PointerType * getType() const
Global values are always pointers.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this global belongs to.
static bool isInterposableLinkage(LinkageTypes Linkage)
Whether the definition of this global may be replaced by something non-equivalent at link time.
bool hasAtLeastLocalUnnamedAddr() const
Returns true if this value's address is not significant in this module.
bool hasGlobalUnnamedAddr() const
UnnamedAddr getUnnamedAddr() const
static bool isWeakForLinker(LinkageTypes Linkage)
Whether the definition of this global may be replaced at link time.
static bool isDiscardableIfUnused(LinkageTypes Linkage)
Whether the definition of this global may be discarded if it is not used in its compilation unit.
@ InternalLinkage
Rename collisions when linking (static functions).
@ AppendingLinkage
Special purpose, only applies to global arrays.
Type * getValueType() const
LLVM_ABI bool isInterposable(bool CheckNoIPA=true) const
Return true if this global's definition can be substituted with an arbitrary definition at link time ...
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
LLVM_ABI void setInitializer(Constant *InitVal)
setInitializer - Sets the initializer for this global variable, removing any existing initializer if ...
bool isExternallyInitialized() const
MaybeAlign getAlign() const
Returns the alignment of the given variable.
void setConstant(bool Val)
LLVM_ABI void copyAttributesFrom(const GlobalVariable *Src)
copyAttributesFrom - copy all additional attributes (those not needed to create a GlobalVariable) fro...
LLVM_ABI void getDebugInfo(SmallVectorImpl< DIGlobalVariableExpression * > &GVs) const
Fill the vector with all debug info attachements.
LLVM_ABI uint64_t getGlobalSize(const DataLayout &DL) const
Get the size of this global variable in bytes.
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
LLVM_ABI void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
LLVM_ABI void addDebugInfo(DIGlobalVariableExpression *GV)
Attach a DIGlobalVariableExpression.
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalVariable.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
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.
iterator_range< user_iterator > users()
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
A wrapper class for inspecting calls to intrinsic functions.
This is an important class for using LLVM in a threaded context.
An instruction for reading from memory.
AtomicOrdering getOrdering() const
Returns the ordering constraint of this load instruction.
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID of this load instruction.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
LLVMContext & getContext() const
This is the common base class for memset/memcpy/memmove.
This class wraps the llvm.memset and llvm.memset.inline intrinsics.
This class wraps the llvm.memcpy/memmove intrinsics.
A Module instance is used to store all the information related to an LLVM module.
void insertGlobalVariable(GlobalVariable *GV)
Insert global variable GV at the end of the global variable list and take ownership.
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object in a numbered address space.
unsigned getAddressSpace() const
Return the address space of the Pointer type.
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.
PreservedAnalyses & preserveSet()
Mark an analysis set as preserved.
PreservedAnalyses & preserve()
Mark an analysis as preserved.
static LLVM_ABI void SalvageDebugInfo(const Constant &C)
Replace all uses of the constant with Undef in debug info metadata.
Interface for looking up the initializer for a variable name, used by Init::resolveReferences.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
iterator erase(const_iterator CI)
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.
Value * getValueOperand()
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
int compare(StringRef RHS) const
Compare two strings; the result is negative, zero, or positive if this string is lexicographically le...
Class to represent struct types.
ArrayRef< Type * > elements() const
bool isOpaque() const
Return true if this is a type with an identity that has no body specified yet.
Analysis pass providing the TargetTransformInfo.
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
Target - Wrapper for Target specific information.
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.
bool isVectorTy() const
True if this is an instance of VectorType.
bool isPointerTy() const
True if this is an instance of PointerType.
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
@ ScalableVectorTyID
Scalable SIMD vector type.
@ FixedVectorTyID
Fixed width SIMD vector type.
bool isSingleValueType() const
Return true if the type is a valid type for a register in codegen.
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
A Use represents the edge between a Value definition and its users.
Value * getOperand(unsigned i) const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
bool hasOneUse() const
Return true if there is exactly one use 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.
iterator_range< user_iterator > users()
LLVM_ABI const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr, bool LookThroughIntToPtr=false) const
Accumulate the constant offset this value has compared to a base pointer.
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
iterator_range< use_iterator > uses()
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
This class represents zero extension of integer types.
std::pair< iterator, bool > insert(const ValueT &V)
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
self_iterator getIterator()
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ Cold
Attempts to make code in the caller as efficient as possible under the assumption that the call is no...
@ X86_ThisCall
Similar to X86_StdCall.
@ Fast
Attempts to make calls as fast as possible (e.g.
@ C
The default llvm calling convention, compatible with C.
bool used(const UsedT *U, size_t I)
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI bool RecursivelyDeleteTriviallyDeadInstructions(Value *V, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr, std::function< void(Value *)> AboutToDeleteCallback=std::function< void(Value *)>())
If the specified value is a trivially dead instruction, delete it.
LLVM_ABI Align getOrEnforceKnownAlignment(Value *V, MaybeAlign PrefAlign, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr)
Try to ensure that the alignment of V is at least PrefAlign bytes.
LLVM_ABI void setExplicitlyUnknownBranchWeightsIfProfiled(Instruction &I, StringRef PassName, const Function *F=nullptr)
Like setExplicitlyUnknownBranchWeights(...), but only sets unknown branch weights in the new instruct...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
const Value * getLoadStorePointerOperand(const Value *V)
A helper function that returns the pointer operand of a load or store instruction.
@ Store
The extracted value is stored (ExtractElement only).
constexpr from_range_t from_range
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
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.
auto make_isa_range(RangeT &&Range)
Return a range over Range containing only elements for which isa<T> holds, casting each of them to T.
LLVM_ABI bool removeUnreachableBlocks(Function &F, DomTreeUpdater *DTU=nullptr, MemorySSAUpdater *MSSAU=nullptr, bool FoldInstsToUnreachable=true)
Remove all blocks that can not be reached from the function's entry.
LLVM_ABI Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
const IPOOptions & getIPOOptions(const LLVMContext &C)
LLVM_ABI Constant * ConstantFoldLoadFromUniformValue(Constant *C, Type *Ty, const DataLayout &DL)
If C is a uniform value where all bits are the same (either all zero, all ones, all undef or all pois...
LLVM_ABI bool isSafeToDestroyConstant(const Constant *C)
It is safe to destroy a constant iff it is only used by constants itself.
LLVM_ABI bool optimizeGlobalCtorsList(Module &M, function_ref< bool(uint32_t, Function *)> ShouldRemove)
Call "ShouldRemove" for every entry in M's global_ctor list and remove the entries for which it retur...
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool isPointerTy(const Type *T)
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI Constant * ConstantFoldLoadFromConst(Constant *C, Type *Ty, const APInt &Offset, const DataLayout &DL)
Extract value of C at the given Offset reinterpreted as Ty.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth, bool MustPreserveProvenance=false)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
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...
DWARFExpression::Operation Op
LLVM_ABI bool RecursivelyDeleteTriviallyDeadInstructionsPermissive(SmallVectorImpl< WeakTrackingVH > &DeadInsts, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr, std::function< void(Value *)> AboutToDeleteCallback=std::function< void(Value *)>())
Same functionality as RecursivelyDeleteTriviallyDeadInstructions, but allow instructions that are not...
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI bool isAllocationFn(const Value *V, const TargetLibraryInfo *TLI)
Tests if a value is a call or invoke to a library function that allocates or reallocates memory (eith...
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Type * getLoadStoreType(const Value *I)
A helper function that returns the type of a load or store instruction.
void array_pod_sort(IteratorTy Start, IteratorTy End)
array_pod_sort - This sorts an array with the specified start and end extent.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
LLVM_ABI GlobalVariable * collectUsedGlobalVariables(const Module &M, SmallVectorImpl< GlobalValue * > &Vec, bool CompilerUsed)
Given "llvm.used" or "llvm.compiler.used" as a global name, collect the initializer elements of that ...
Part of the global at a specific offset, which is only accessed through loads and stores with the giv...
This struct is a compact representation of a valid (non-zero power of two) alignment.
As we analyze each global or thread-local variable, keep track of some information about it.
@ InitializerStored
This global is stored to, but the only thing stored is the constant it was initialized with.
@ StoredOnce
This global is stored to, but only its initializer and one other value is ever stored to it.
static LLVM_ABI bool analyzeGlobal(const Value *V, GlobalStatus &GS)
Look at all uses of the global and fill in the GlobalStatus structure.
Function object to check whether the first component of a container supported by std::get (like std::...