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");
98 cl::desc(
"Statically resolve calls to versioned "
99 "functions from non-versioned callers."),
104 cl::desc(
"Enable stress test of coldcc by adding "
105 "calling conv to all internal functions."),
111 "Maximum block frequency, expressed as a percentage of caller's "
112 "entry frequency, for a call site to be considered cold for enabling "
134 Type *Ty = Types.pop_back_val();
141 if (cast<VectorType>(Ty)->getElementType()->
isPointerTy())
145 Types.push_back(cast<ArrayType>(Ty)->getElementType());
151 if (isa<PointerType>(InnerTy))
return true;
152 if (isa<StructType>(InnerTy) || isa<ArrayType>(InnerTy) ||
153 isa<VectorType>(InnerTy))
154 Types.push_back(InnerTy);
159 if (--Limit == 0)
return true;
160 }
while (!Types.empty());
170 if (isa<Constant>(V))
174 if (isa<LoadInst>(V) || isa<InvokeInst>(V) || isa<Argument>(V) ||
181 if (
I->mayHaveSideEffects())
184 if (!
GEP->hasAllConstantIndices())
186 }
else if (
I->getNumOperands() != 1) {
190 V =
I->getOperand(0);
209 bool Changed =
false;
217 while (!Worklist.
empty()) {
219 if (
StoreInst *SI = dyn_cast<StoreInst>(U)) {
220 Value *V = SI->getValueOperand();
221 if (isa<Constant>(V)) {
223 SI->eraseFromParent();
226 Dead.push_back(std::make_pair(
I, SI));
228 }
else if (
MemSetInst *MSI = dyn_cast<MemSetInst>(U)) {
229 if (isa<Constant>(MSI->getValue())) {
231 MSI->eraseFromParent();
232 }
else if (
Instruction *
I = dyn_cast<Instruction>(MSI->getValue())) {
234 Dead.push_back(std::make_pair(
I, MSI));
237 GlobalVariable *MemSrc = dyn_cast<GlobalVariable>(MTI->getSource());
240 MTI->eraseFromParent();
241 }
else if (
Instruction *
I = dyn_cast<Instruction>(MTI->getSource())) {
243 Dead.push_back(std::make_pair(
I, MTI));
245 }
else if (
ConstantExpr *CE = dyn_cast<ConstantExpr>(U)) {
246 if (isa<GEPOperator>(CE))
251 for (
const auto &[Inst, Store] : Dead) {
253 Store->eraseFromParent();
258 Instruction *J = dyn_cast<Instruction>(
I->getOperand(0));
261 I->eraseFromParent();
264 I->eraseFromParent();
281 bool Changed =
false;
286 if (
auto *OpI = dyn_cast<Instruction>(
Op))
288 I->eraseFromParent();
291 while (!WorkList.
empty()) {
293 if (!Visited.
insert(U).second)
296 if (
auto *BO = dyn_cast<BitCastOperator>(U))
298 if (
auto *ASC = dyn_cast<AddrSpaceCastOperator>(U))
300 else if (
auto *
GEP = dyn_cast<GEPOperator>(U))
302 else if (
auto *LI = dyn_cast<LoadInst>(U)) {
305 Type *Ty = LI->getType();
307 LI->replaceAllUsesWith(Res);
312 Value *PtrOp = LI->getPointerOperand();
317 if (
II->getIntrinsicID() == Intrinsic::threadlocal_address)
318 PtrOp =
II->getArgOperand(0);
322 LI->replaceAllUsesWith(
Value);
326 }
else if (
StoreInst *SI = dyn_cast<StoreInst>(U)) {
333 if (
II->getIntrinsicID() == Intrinsic::threadlocal_address)
359 auto AppendUses = [&](
Value *V) {
360 for (
Use &U : V->uses())
361 if (Visited.
insert(&U).second)
365 while (!Worklist.
empty()) {
367 User *V = U->getUser();
369 auto *
GEP = dyn_cast<GEPOperator>(V);
370 if (isa<BitCastOperator>(V) || isa<AddrSpaceCastOperator>(V) ||
371 (
GEP &&
GEP->hasAllConstantIndices())) {
379 if (isa<StoreInst>(V) && U->getOperandNo() == 0)
385 if (
Ptr != GV ||
Offset.getActiveBits() >= 64)
391 const auto &[It, Inserted] =
393 if (Ty != It->second.Ty)
397 It->second.Initializer =
399 if (!It->second.Initializer) {
400 LLVM_DEBUG(
dbgs() <<
"Global SRA: Failed to evaluate initializer of "
401 << *GV <<
" with type " << *Ty <<
" at offset "
402 <<
Offset.getZExtValue());
412 auto *SI = dyn_cast<StoreInst>(V);
416 Constant *StoredConst = dyn_cast<Constant>(SI->getOperand(0));
421 return Initializer != StoredConst;
424 It->second.IsLoaded |= isa<LoadInst>(V);
425 It->second.IsStored |= IsStored(V, It->second.Initializer);
430 if (
auto *
C = dyn_cast<Constant>(V)) {
450 for (
auto *GVE : GVs) {
453 int64_t CurVarOffsetInBytes = 0;
455 uint64_t FragmentEndInBits = FragmentOffsetInBits + FragmentSizeInBits;
462 if (CurVarOffsetInBytes < 0)
466 CurVarOffsetInBits = CHAR_BIT * (
uint64_t)CurVarOffsetInBytes;
469 if (CurVarOffsetInBits >= FragmentEndInBits)
473 uint64_t CurVarEndInBits = CurVarOffsetInBits + CurVarSize;
475 if (CurVarSize != 0 &&
476 CurVarEndInBits <= FragmentOffsetInBits)
481 if (CurVarSize != 0 &&
482 CurVarOffsetInBits >= FragmentOffsetInBits &&
483 CurVarEndInBits <= FragmentEndInBits) {
485 (CurVarOffsetInBits - FragmentOffsetInBits) / 8;
486 if (CurVarOffsetInFragment != 0)
487 Expr = DIExpression::get(Expr->
getContext(), {dwarf::DW_OP_plus_uconst,
488 CurVarOffsetInFragment});
490 Expr = DIExpression::get(Expr->
getContext(), {});
492 DIGlobalVariableExpression::get(GVE->getContext(), Var, Expr);
498 if (FragmentSizeInBits < VarSize) {
499 if (CurVarOffsetInBits > FragmentOffsetInBits)
501 uint64_t CurVarFragmentOffsetInBits =
502 FragmentOffsetInBits - CurVarOffsetInBits;
503 uint64_t CurVarFragmentSizeInBits = FragmentSizeInBits;
504 if (CurVarSize != 0 && CurVarEndInBits < FragmentEndInBits)
505 CurVarFragmentSizeInBits -= (FragmentEndInBits - CurVarEndInBits);
506 if (CurVarOffsetInBits)
507 Expr = DIExpression::get(Expr->
getContext(), {});
509 Expr, CurVarFragmentOffsetInBits, CurVarFragmentSizeInBits))
514 auto *NGVE = DIGlobalVariableExpression::get(GVE->getContext(), Var, Expr);
539 unsigned NumParts =
count_if(Parts, [](
const auto &Pair) {
540 return Pair.second.IsLoaded && Pair.second.IsStored;
547 for (
const auto &Pair : Parts) {
549 {Pair.first, Pair.second.Ty, Pair.second.Initializer});
555 for (
const auto &[OffsetForTy, Ty,
_] : TypesVector) {
560 Offset = OffsetForTy +
DL.getTypeAllocSize(Ty);
567 LLVM_DEBUG(
dbgs() <<
"PERFORMING GLOBAL SRA ON: " << *GV <<
"\n");
570 Align StartAlignment =
576 unsigned NameSuffix = 0;
577 for (
auto &[OffsetForTy, Ty, Initializer] : TypesVector) {
579 *GV->
getParent(), Ty,
false, GlobalVariable::InternalLinkage,
580 Initializer, GV->
getName() +
"." +
Twine(NameSuffix++), GV,
584 NewGlobals.
insert({OffsetForTy, NGV});
595 DL.getTypeAllocSizeInBits(Ty), VarSize);
602 auto AppendUsers = [&](
Value *V) {
603 for (
User *U : V->users())
604 if (Visited.
insert(U).second)
608 while (!Worklist.
empty()) {
610 if (isa<BitCastOperator>(V) || isa<AddrSpaceCastOperator>(V) ||
611 isa<GEPOperator>(V)) {
613 if (isa<Instruction>(V))
622 assert(
Ptr == GV &&
"Load/store must be from/to global");
624 assert(NGV &&
"Must have replacement global for this offset");
631 if (
auto *LI = dyn_cast<LoadInst>(V)) {
632 LI->setOperand(0, NGV);
633 LI->setAlignment(NewAlign);
635 auto *SI = cast<StoreInst>(V);
636 SI->setOperand(1, NGV);
637 SI->setAlignment(NewAlign);
643 "Other users can only be dead constants");
653 return NewGlobals.
begin()->second;
661 for (
const User *U : V->users()) {
668 if (isa<LoadInst>(U)) {
670 }
else if (
const StoreInst *SI = dyn_cast<StoreInst>(U)) {
671 if (SI->getOperand(0) == V) {
674 }
else if (
const CallInst *CI = dyn_cast<CallInst>(U)) {
675 if (CI->getCalledOperand() != V) {
678 }
else if (
const InvokeInst *
II = dyn_cast<InvokeInst>(U)) {
679 if (
II->getCalledOperand() != V) {
687 }
else if (
const PHINode *PN = dyn_cast<PHINode>(U)) {
692 }
else if (isa<ICmpInst>(U) &&
693 !ICmpInst::isSigned(cast<ICmpInst>(U)->getPredicate()) &&
694 isa<LoadInst>(U->getOperand(0)) &&
695 isa<ConstantPointerNull>(U->getOperand(1))) {
696 assert(isa<GlobalValue>(cast<LoadInst>(U->getOperand(0))
697 ->getPointerOperand()
698 ->stripPointerCasts()) &&
699 "Should be GlobalVariable");
716 while (!Worklist.
empty()) {
718 for (
const auto *U :
P->users()) {
719 if (
auto *LI = dyn_cast<LoadInst>(U)) {
725 }
else if (
auto *SI = dyn_cast<StoreInst>(U)) {
729 if (SI->getPointerOperand() !=
P)
731 }
else if (
auto *CE = dyn_cast<ConstantExpr>(U)) {
732 if (CE->stripPointerCasts() != GV)
751 while (!Worklist.
empty()) {
753 for (
auto *U :
P->users()) {
754 if (
auto *CE = dyn_cast<ConstantExpr>(U)) {
759 assert((isa<LoadInst>(U) || isa<StoreInst>(U)) &&
760 "Expect only load or store instructions");
767 bool Changed =
false;
768 for (
auto UI = V->user_begin(), E = V->user_end(); UI != E; ) {
774 if (
LoadInst *LI = dyn_cast<LoadInst>(
I)) {
775 LI->setOperand(0, NewV);
777 }
else if (
StoreInst *SI = dyn_cast<StoreInst>(
I)) {
778 if (SI->getOperand(1) == V) {
779 SI->setOperand(1, NewV);
782 }
else if (isa<CallInst>(
I) || isa<InvokeInst>(
I)) {
789 bool PassedAsArg =
false;
790 for (
unsigned i = 0, e = CB->
arg_size(); i != e; ++i)
798 UI = V->user_begin();
804 if (CI->use_empty()) {
806 CI->eraseFromParent();
811 Idxs.
reserve(GEPI->getNumOperands()-1);
814 if (
Constant *
C = dyn_cast<Constant>(*i))
818 if (Idxs.
size() == GEPI->getNumOperands()-1)
822 if (GEPI->use_empty()) {
824 GEPI->eraseFromParent();
839 bool Changed =
false;
843 bool AllNonStoreUsesGone =
true;
847 if (
LoadInst *LI = dyn_cast<LoadInst>(GlobalUser)) {
850 if (LI->use_empty()) {
851 LI->eraseFromParent();
854 AllNonStoreUsesGone =
false;
856 }
else if (isa<StoreInst>(GlobalUser)) {
858 assert(GlobalUser->getOperand(1) == GV &&
859 "Must be storing *to* the global");
861 AllNonStoreUsesGone =
false;
865 assert((isa<PHINode>(GlobalUser) || isa<SelectInst>(GlobalUser) ||
866 isa<ConstantExpr>(GlobalUser) || isa<CmpInst>(GlobalUser) ||
867 isa<BitCastInst>(GlobalUser) ||
868 isa<GetElementPtrInst>(GlobalUser) ||
869 isa<AddrSpaceCastInst>(GlobalUser)) &&
870 "Only expect load and stores!");
875 LLVM_DEBUG(
dbgs() <<
"OPTIMIZED LOADS FROM STORED ONCE POINTER: " << *GV
882 if (AllNonStoreUsesGone) {
906 I->replaceAllUsesWith(NewC);
910 while (UI != E && *UI ==
I)
913 I->eraseFromParent();
927 LLVM_DEBUG(
errs() <<
"PROMOTING GLOBAL: " << *GV <<
" CALL = " << *CI
946 if (!isa<UndefValue>(InitVal)) {
949 Builder.
CreateMemSet(NewGV, InitVal, AllocSize, std::nullopt);
961 bool InitBoolUsed =
false;
966 for (
auto *U : Guses) {
967 if (
StoreInst *SI = dyn_cast<StoreInst>(U)) {
972 SI->getValueOperand())),
973 InitBool,
false,
Align(1), SI->getOrdering(), SI->getSyncScopeID(),
975 NewSI->setDebugLoc(SI->getDebugLoc());
976 SI->eraseFromParent();
998 cast<LoadInst>(LV)->setDebugLoc(LI->
getDebugLoc());
1002 case ICmpInst::ICMP_ULT:
1005 case ICmpInst::ICMP_UGE:
1008 case ICmpInst::ICMP_ULE:
1009 case ICmpInst::ICMP_EQ:
1011 cast<BinaryOperator>(LV)->setDebugLoc(ICI->
getDebugLoc());
1013 case ICmpInst::ICMP_NE:
1014 case ICmpInst::ICMP_UGT:
1024 if (!InitBoolUsed) {
1026 cast<StoreInst>(InitBool->
user_back())->eraseFromParent();
1053 while (!Worklist.
empty()) {
1055 if (!Visited.
insert(V).second)
1058 for (
const Use &VUse : V->uses()) {
1059 const User *U = VUse.getUser();
1060 if (isa<LoadInst>(U) || isa<CmpInst>(U))
1063 if (
auto *SI = dyn_cast<StoreInst>(U)) {
1064 if (SI->getValueOperand() == V &&
1065 SI->getPointerOperand()->stripPointerCasts() != GV)
1070 if (
auto *GEPI = dyn_cast<GetElementPtrInst>(U)) {
1107 if (AllocSize >= 2048)
1146 if (
Constant *SOVC = dyn_cast<Constant>(StoredOnceVal)) {
1151 if (
auto *CI = dyn_cast<CallInst>(StoredOnceVal)) {
1152 auto *TLI = &GetTLI(*CI->getFunction());
1182 if (!isa<LoadInst>(U) && !isa<StoreInst>(U))
1203 "No reason to shrink to bool!");
1210 bool IsOneZero =
false;
1211 bool EmitOneOrZero =
true;
1212 auto *CI = dyn_cast<ConstantInt>(OtherVal);
1213 if (CI && CI->getValue().getActiveBits() <= 64) {
1214 IsOneZero = InitVal->
isNullValue() && CI->isOne();
1217 if (CIInit && CIInit->getValue().getActiveBits() <= 64) {
1218 uint64_t ValInit = CIInit->getZExtValue();
1219 uint64_t ValOther = CI->getZExtValue();
1220 uint64_t ValMinus = ValOther - ValInit;
1222 for(
auto *GVe : GVs){
1226 unsigned SizeInOctets =
1238 dwarf::DW_OP_deref_size, SizeInOctets,
1239 dwarf::DW_OP_constu, ValMinus,
1240 dwarf::DW_OP_mul, dwarf::DW_OP_constu, ValInit,
1242 bool WithStackValue =
true;
1245 DIGlobalVariableExpression::get(NewGV->
getContext(), DGV, E);
1248 EmitOneOrZero =
false;
1252 if (EmitOneOrZero) {
1261 if (
StoreInst *SI = dyn_cast<StoreInst>(UI)) {
1263 bool StoringOther = SI->getOperand(0) == OtherVal;
1266 if (StoringOther || SI->getOperand(0) == InitVal) {
1273 Instruction *StoredVal = cast<Instruction>(SI->getOperand(0));
1278 if (
LoadInst *LI = dyn_cast<LoadInst>(StoredVal)) {
1279 assert(LI->getOperand(0) == GV &&
"Not a copy!");
1283 false,
Align(1), LI->getOrdering(),
1284 LI->getSyncScopeID(), LI->getIterator());
1285 cast<LoadInst>(StoreVal)->setDebugLoc(LI->getDebugLoc());
1287 assert((isa<CastInst>(StoredVal) || isa<SelectInst>(StoredVal)) &&
1288 "This is not a form that we understand!");
1290 assert(isa<LoadInst>(StoreVal) &&
"Not a load of NewGV!");
1294 new StoreInst(StoreVal, NewGV,
false,
Align(1), SI->getOrdering(),
1295 SI->getSyncScopeID(), SI->getIterator());
1339 if (
auto *
F = dyn_cast<Function>(&GV))
1340 Dead = (
F->isDeclaration() &&
F->use_empty()) ||
F->isDefTriviallyDead();
1347 if (
auto *
F = dyn_cast<Function>(&GV)) {
1348 if (DeleteFnCallback)
1349 DeleteFnCallback(*
F);
1373 for (
auto *U : GV->
users()) {
1377 assert(
I->getParent()->getParent() ==
F);
1379 if (
auto *LI = dyn_cast<LoadInst>(
I))
1381 else if (
auto *SI = dyn_cast<StoreInst>(
I))
1391 auto &DT = LookupDomTree(*
const_cast<Function *
>(
F));
1402 const unsigned Threshold = 100;
1403 if (Loads.
size() * Stores.
size() > Threshold)
1406 for (
auto *L : Loads) {
1407 auto *LTy = L->getType();
1414 DL.getTypeStoreSize(LTy).getFixedValue() <=
1415 DL.getTypeStoreSize(STy).getFixedValue();
1433 if (!isa<Constant>(StoredOnceValue))
1438 if (
auto *LI = dyn_cast<LoadInst>(U)) {
1439 if (LI->getFunction() ==
F &&
1440 LI->getType() == StoredOnceValue->
getType() && LI->isSimple())
1445 bool MadeChange =
false;
1446 if (!Loads.
empty()) {
1447 auto &DT = LookupDomTree(*
const_cast<Function *
>(
F));
1448 for (
auto *LI : Loads) {
1449 if (DT.
dominates(StoredOnceStore, LI)) {
1450 LI->replaceAllUsesWith(
const_cast<Value *
>(StoredOnceValue));
1451 LI->eraseFromParent();
1475 if (!GS.HasMultipleAccessingFunctions &&
1476 GS.AccessingFunction &&
1480 GS.AccessingFunction->doesNotRecurse() &&
1487 GS.AccessingFunction->getEntryBlock().begin().getNonConst();
1491 nullptr, GV->
getName(), FirstI);
1507 bool Changed =
false;
1538 if (GS.Ordering == AtomicOrdering::NotAtomic) {
1549 LLVM_DEBUG(
dbgs() <<
" *** Marking constant allowed us to simplify "
1550 <<
"all users and delete global!\n");
1564 Value *StoredOnceValue = GS.getStoredOnceValue();
1567 const_cast<Function &
>(*GS.StoredOnceStore->getFunction());
1568 bool CanHaveNonUndefGlobalInitializer =
1569 GetTTI(StoreFn).canHaveNonUndefGlobalInitializerInAddressSpace(
1578 auto *SOVConstant = dyn_cast<Constant>(StoredOnceValue);
1580 DL.getTypeAllocSize(SOVConstant->getType()) ==
1582 CanHaveNonUndefGlobalInitializer) {
1593 NGV->copyAttributesFrom(GV);
1603 LLVM_DEBUG(
dbgs() <<
" *** Substituting initializer allowed us to "
1604 <<
"simplify all users and delete global!\n");
1619 if (GS.NumStores == 1)
1625 if (SOVConstant && GS.Ordering == AtomicOrdering::NotAtomic &&
1627 CanHaveNonUndefGlobalInitializer)) {
1653 bool Changed =
false;
1655 auto NewUnnamedAddr = GV.
hasLocalLinkage() ? GlobalValue::UnnamedAddr::Global
1656 : GlobalValue::UnnamedAddr::Local;
1668 auto *GVar = dyn_cast<GlobalVariable>(&GV);
1672 if (GVar->isConstant() || !GVar->hasInitializer())
1682 for (
User *U :
F->users())
1689 if (Attrs.hasAttrSomewhere(
A, &AttrIndex))
1690 return Attrs.removeAttributeAtIndex(
C, AttrIndex,
A);
1695 F->setAttributes(
StripAttr(
F->getContext(),
F->getAttributes(),
A));
1696 for (
User *U :
F->users()) {
1720 for (
User *U :
F->users()) {
1721 CallInst* CI = dyn_cast<CallInst>(U);
1730 if (BB.getTerminatingMustTailCall())
1733 return !
F->hasAddressTaken();
1742 return Res.first->second;
1750 auto CallSiteFreq = CallerBFI.
getBlockFreq(CallSiteBB);
1751 auto CallerEntryFreq =
1753 return CallSiteFreq < CallerEntryFreq * ColdProb;
1763 const std::vector<Function *> &AllCallsCold) {
1768 for (
User *U :
F.users()) {
1781 for (
User *U :
F->users())
1794 if (
CallInst *CI = dyn_cast<CallInst>(&
I)) {
1796 if (CI->isInlineAsm())
1798 Function *CalledFn = CI->getCalledFunction();
1822 for (
User *U :
F->users()) {
1831 for (
User *U :
F->users())
1832 if (isa<InvokeInst>(U))
1840 auto *M =
F->getParent();
1846 for (
User *U : PreallocatedCalls) {
1847 CallBase *CB = dyn_cast<CallBase>(U);
1853 "Shouldn't call RemotePreallocated() on a musttail preallocated call");
1857 CallBase *PreallocatedSetup =
nullptr;
1858 for (
auto *It = OpBundles.
begin(); It != OpBundles.
end(); ++It) {
1859 if (It->getTag() ==
"preallocated") {
1860 PreallocatedSetup = cast<CallBase>(*It->input_begin());
1861 OpBundles.
erase(It);
1865 assert(PreallocatedSetup &&
"Did not find preallocated bundle");
1867 cast<ConstantInt>(PreallocatedSetup->
getArgOperand(0))->getZExtValue();
1869 assert((isa<CallInst>(CB) || isa<InvokeInst>(CB)) &&
1870 "Unknown indirect call type");
1890 for (
auto *
User : PreallocatedArgs) {
1891 auto *UseCall = cast<CallBase>(
User);
1892 assert(UseCall->getCalledFunction()->getIntrinsicID() ==
1893 Intrinsic::call_preallocated_arg &&
1894 "preallocated token use was not a llvm.call.preallocated.arg");
1896 cast<ConstantInt>(UseCall->getArgOperand(1))->getZExtValue();
1897 Value *AllocaReplacement = ArgAllocas[AllocArgIndex];
1898 if (!AllocaReplacement) {
1899 auto AddressSpace = UseCall->getType()->getPointerAddressSpace();
1901 UseCall->getFnAttr(Attribute::Preallocated).getValueAsType();
1902 auto *InsertBefore = PreallocatedSetup->
getNextNode();
1906 ArgAllocas[AllocArgIndex] = Alloca;
1907 AllocaReplacement = Alloca;
1911 UseCall->eraseFromParent();
1914 cast<Instruction>(PreallocatedSetup)->eraseFromParent();
1928 bool Changed =
false;
1931 std::vector<Function *> AllCallsCold;
1934 AllCallsCold.push_back(&
F);
1940 if (
F.hasFnAttribute(Attribute::Naked))
1944 if (!
F.hasName() && !
F.isDeclaration() && !
F.hasLocalLinkage())
1947 if (
deleteIfDead(
F, NotDiscardableComdats, DeleteFnCallback)) {
1961 if (!
F.isDeclaration()) {
1964 ChangedCFGCallback(
F);
1970 if (!
F.hasLocalLinkage())
1978 if (
F.getAttributes().hasAttrSomewhere(Attribute::InAlloca) &&
1986 if (
F.getAttributes().hasAttrSomewhere(Attribute::Preallocated)) {
2005 ChangeableCCCache.
erase(&
F);
2023 if (
F.getAttributes().hasAttrSomewhere(Attribute::Nest) &&
2024 !
F.hasAddressTaken()) {
2041 bool Changed =
false;
2048 if (GV.hasInitializer())
2049 if (
auto *
C = dyn_cast<Constant>(GV.getInitializer())) {
2050 auto &
DL = M.getDataLayout();
2056 GV.setInitializer(New);
2064 Changed |=
processGlobal(GV, GetTTI, GetTLI, LookupDomTree);
2074 if (
F->isDeclaration())
2083 ++NumCtorsEvaluated;
2088 <<
F->getName() <<
"' to " << NewInitializers.size()
2090 for (
const auto &Pair : NewInitializers)
2091 Pair.first->setInitializer(Pair.second);
2093 GV->setConstant(
true);
2108 V.eraseFromParent();
2113 const Type *UsedArrayType = V.getValueType();
2114 const auto *VAT = cast<ArrayType>(UsedArrayType);
2115 const auto *VEPT = cast<PointerType>(VAT->getArrayElementType());
2119 PointerType::get(V.getContext(), VEPT->getAddressSpace());
2131 Module *M = V.getParent();
2132 V.removeFromParent();
2137 NV->setSection(
"llvm.metadata");
2163 iterator usedBegin() {
return Used.begin(); }
2164 iterator usedEnd() {
return Used.end(); }
2166 used_iterator_range used() {
2167 return used_iterator_range(usedBegin(), usedEnd());
2170 iterator compilerUsedBegin() {
return CompilerUsed.
begin(); }
2171 iterator compilerUsedEnd() {
return CompilerUsed.
end(); }
2173 used_iterator_range compilerUsed() {
2174 return used_iterator_range(compilerUsedBegin(), compilerUsedEnd());
2180 return CompilerUsed.
count(GV);
2188 return CompilerUsed.
insert(GV).second;
2191 void syncVariablesAndSets() {
2205 assert((!U.usedCount(&GA) || !U.compilerUsedCount(&GA)) &&
2206 "We should have removed the duplicated "
2207 "element from llvm.compiler.used");
2214 return !U.usedCount(&GA) && !U.compilerUsedCount(&GA);
2221 return U.usedCount(&GV) || U.compilerUsedCount(&GV);
2225 bool &RenameTarget) {
2229 RenameTarget =
false;
2250 RenameTarget =
true;
2257 bool Changed =
false;
2261 Used.compilerUsedErase(GV);
2272 if (!J.hasName() && !J.isDeclaration() && !J.hasLocalLinkage())
2281 if (!IsModuleLocal(J))
2284 Constant *Aliasee = J.getAliasee();
2295 Target->removeDeadConstantUsers();
2302 J.replaceAllUsesWith(Aliasee);
2303 ++NumAliasesResolved;
2309 Target->setLinkage(J.getLinkage());
2310 Target->setDSOLocal(J.isDSOLocal());
2311 Target->setVisibility(J.getVisibility());
2312 Target->setDLLStorageClass(J.getDLLStorageClass());
2314 if (Used.usedErase(&J))
2317 if (Used.compilerUsedErase(&J))
2318 Used.compilerUsedInsert(
Target);
2324 ++NumAliasesRemoved;
2328 Used.syncVariablesAndSets();
2338 auto FuncIter = M.begin();
2339 if (FuncIter == M.end())
2341 auto *TLI = &GetTLI(*FuncIter);
2343 if (!TLI->has(Func))
2346 Function *Fn = M.getFunction(TLI->getName(Func));
2355 if (!TLI->getLibFunc(*Fn,
F) ||
F != Func)
2372 if (
I.isDebugOrPseudoInst())
2374 if (isa<ReturnInst>(
I))
2396 bool Changed =
false;
2402 CallInst *CI = dyn_cast<CallInst>(U);
2416 ++NumCXXDtorsRemoved;
2427 if (IF.isInterposable())
2451 return dyn_cast<Function>(Ret->getReturnValue());
2457 bool Changed =
false;
2460 if (!IF.use_empty() &&
2461 (!Callee->isDeclaration() ||
2462 none_of(IF.users(), [](
User *U) { return isa<GlobalAlias>(U); }))) {
2463 IF.replaceAllUsesWith(Callee);
2464 NumIFuncsResolved++;
2473 bool Changed =
false;
2487 if (
auto *
F = dyn_cast<Function>(V)) {
2491 }
else if (
auto *Sel = dyn_cast<SelectInst>(V)) {
2496 }
else if (
auto *Phi = dyn_cast<PHINode>(V)) {
2497 for (
unsigned I = 0, E = Phi->getNumIncomingValues();
I != E; ++
I)
2526 bool Changed =
false;
2532 if (IF.isInterposable())
2547 if (
auto *Ret = dyn_cast_or_null<ReturnInst>(BB.
getTerminator()))
2554 assert(!Callees.
empty() &&
"Expecting successful collection of versions");
2561 auto [It, Inserted] = FeatureMask.
try_emplace(Callee);
2568 return FeatureMask[
LHS].ugt(FeatureMask[
RHS]);
2574 for (
User *U : IF.users()) {
2575 if (
auto *CB = dyn_cast<CallBase>(U)) {
2576 if (CB->getCalledOperand() == &IF) {
2577 Function *Caller = CB->getFunction();
2578 auto [FeatIt, FeatInserted] = FeatureMask.
try_emplace(Caller);
2581 auto [CallIt, CallInserted] = CallSites.
try_emplace(Caller);
2583 Callers.push_back(Caller);
2584 CallIt->second.push_back(CB);
2591 return FeatureMask[
LHS].ugt(FeatureMask[
RHS]);
2600 assert(
I < Callees.
size() &&
"Found callers of equal priority");
2603 APInt CallerBits = FeatureMask[Caller];
2604 APInt CalleeBits = FeatureMask[Callee];
2614 if (CallerBits == CalleeBits)
2616 else if (!implies(CallerBits, CalleeBits)) {
2619 while (implies(CalleeBits, CallerBits)) {
2620 if (++
I == Callees.
size())
2622 CalleeBits = FeatureMask[Callees[
I]];
2632 auto &Calls = CallSites[Caller];
2634 LLVM_DEBUG(
dbgs() <<
"Redirecting call " << Caller->getName() <<
" -> "
2635 << Callee->getName() <<
"\n");
2636 CS->setCalledOperand(Callee);
2640 if (IF.use_empty() ||
2641 all_of(IF.users(), [](
User *U) { return isa<GlobalAlias>(U); }))
2642 NumIFuncsResolved++;
2656 bool Changed =
false;
2657 bool LocalChange =
true;
2658 std::optional<uint32_t> FirstNotFullyEvaluatedPriority;
2660 while (LocalChange) {
2661 LocalChange =
false;
2663 NotDiscardableComdats.
clear();
2667 NotDiscardableComdats.
insert(
C);
2669 if (
const Comdat *
C =
F.getComdat())
2670 if (!
F.isDefTriviallyDead())
2671 NotDiscardableComdats.
insert(
C);
2673 if (
const Comdat *
C = GA.getComdat())
2674 if (!GA.isDiscardableIfUnused() || !GA.use_empty())
2675 NotDiscardableComdats.
insert(
C);
2679 NotDiscardableComdats, ChangedCFGCallback,
2685 if (FirstNotFullyEvaluatedPriority &&
2686 *FirstNotFullyEvaluatedPriority != Priority)
2690 FirstNotFullyEvaluatedPriority = Priority;
2696 NotDiscardableComdats);
2719 Changed |= LocalChange;
2729 auto &
DL = M.getDataLayout();
2751 ChangedCFGCallback, DeleteFnCallback))
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< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
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 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 tryToOptimizeStoreOfAllocationToGlobal(GlobalVariable *GV, CallInst *CI, const DataLayout &DL, TargetLibraryInfo *TLI)
If we have a global that is only initialized with a fixed size allocation try to transform the progra...
static void ConstantPropUsersOf(Value *V, const DataLayout &DL, TargetLibraryInfo *TLI)
Walk the use list of V, constant folding all of the instructions that are foldable.
static bool hasOnlyColdCalls(Function &F, function_ref< BlockFrequencyInfo &(Function &)> GetBFI, ChangeableCCCacheTy &ChangeableCCCache)
static bool allUsesOfLoadedValueWillTrapIfNull(const GlobalVariable *GV)
Return true if all uses of any loads from GV will trap if the loaded value is null.
static bool hasChangeableCCImpl(Function *F)
Return true if this is a calling convention that we'd like to change.
static bool AllUsesOfValueWillTrapIfNull(const Value *V, SmallPtrSetImpl< const PHINode * > &PHIs)
Return true if all users of the specified value will trap if the value is dynamically null.
static GlobalVariable * OptimizeGlobalAddressOfAllocation(GlobalVariable *GV, CallInst *CI, uint64_t AllocSize, Constant *InitVal, const DataLayout &DL, TargetLibraryInfo *TLI)
This function takes the specified global variable, and transforms the program as if it always contain...
Returns whether the given function is an empty C destructor or atexit handler and can therefore be eliminated Note that we assume that other optimization passes have already simplified the code so we simply check for static ret bool IsEmptyAtExitFunction(const Function &Fn)
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 valueIsOnlyUsedLocallyOrStoredToOneGlobal(const CallInst *CI, const GlobalVariable *GV)
Scan the use-list of GV checking to make sure that there are no complex uses of GV.
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 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 cl::opt< bool > OptimizeNonFMVCallers("optimize-non-fmv-callers", cl::desc("Statically resolve calls to versioned " "functions from non-versioned callers."), cl::init(true), cl::Hidden)
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(CallBase &CB, BlockFrequencyInfo &CallerBFI)
Return true if the block containing the call site has a BlockFrequency of less than ColdCCRelFreq% of...
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 cl::opt< bool > EnableColdCCStressTest("enable-coldcc-stress-test", cl::desc("Enable stress test of coldcc by adding " "calling conv to all internal functions."), cl::init(false), cl::Hidden)
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 void allUsesOfLoadAndStores(GlobalVariable *GV, SmallVector< Value *, 4 > &Uses)
Get all the loads/store uses for global variable GV.
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 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 isValidCandidateForColdCC(Function &F, function_ref< BlockFrequencyInfo &(Function &)> GetBFI, const std::vector< Function * > &AllCallsCold)
static cl::opt< int > ColdCCRelFreq("coldcc-rel-freq", cl::Hidden, cl::init(2), cl::desc("Maximum block frequency, expressed as a percentage of caller's " "entry frequency, for a call site to be considered cold for enabling " "coldcc"))
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.
Find IFuncs that have resolvers that always point at the same statically known and replace their callers with a direct static call bool OptimizeStaticIFuncs(Module &M)
static bool isLeakCheckerRoot(GlobalVariable *GV)
Is this global variable possibly used by a leak checker as a root? If so, we might not really want to...
static bool forwardStoredOnceStore(GlobalVariable *GV, const StoreInst *StoredOnceStore, function_ref< DominatorTree &(Function &)> LookupDomTree)
static int compareNames(Constant *const *A, Constant *const *B)
static bool collectVersions(TargetTransformInfo &TTI, Value *V, SmallVectorImpl< Function * > &Versions)
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 bool OptimizeAwayTrappingUsesOfValue(Value *V, Constant *NewV)
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.
uint64_t IntrinsicInst * II
FunctionAnalysisManager FAM
Remove Loads Into Fake Uses
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)
static SymbolRef::Type getType(const Symbol *Sym)
Class for arbitrary precision integers.
This class represents a conversion between pointers from one address space to another.
an instruction to allocate memory on the stack
A container for analyses that lazily runs them and caches their results.
void clear(IRUnitT &IR, llvm::StringRef Name)
Clear any cached analysis results for a single unit of IR.
void invalidate(IRUnitT &IR, const PreservedAnalyses &PA)
Invalidate cached analyses for an IR unit.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
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 if the block is well formed or null if the block is not well forme...
static LLVM_ABI BinaryOperator * CreateNot(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
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 void getOperandBundlesAsDefs(SmallVectorImpl< OperandBundleDef > &Defs) const
Return the list of operand bundles attached to this instruction as a vector of OperandBundleDefs.
LLVM_ABI bool isMustTailCall() const
Tests if this call site must be tail call optimized.
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
Predicate getPredicate() const
Return the predicate for this instruction.
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_ABI Constant * getAddrSpaceCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static 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 ConstantInt * getTrue(LLVMContext &Context)
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
static LLVM_ABI ConstantInt * getBool(LLVMContext &Context, bool V)
This is an important base class in LLVM.
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 isNullValue() const
Return true if this is the value that would be returned by getNullValue.
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.
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
static DebugLoc getCompilerGenerated()
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
bool erase(const KeyT &Val)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Analysis pass which computes a DominatorTree.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
This class evaluates LLVM IR, producing the Constant representing each SSA instruction.
DenseMap< GlobalVariable *, Constant * > getMutatedInitializers() const
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...
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
const Constant * getAliasee() const
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 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
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.
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 instruction compares its operands according to the predicate given to the constructor.
AllocaInst * CreateAlloca(Type *Ty, unsigned AddrSpace, Value *ArraySize=nullptr, const Twine &Name="")
CallInst * CreateStackSave(const Twine &Name="")
Create a call to llvm.stacksave.
CallInst * CreateMemSet(Value *Ptr, Value *Val, uint64_t Size, MaybeAlign Align, bool isVolatile=false, const AAMDNodes &AAInfo=AAMDNodes())
Create and insert a memset to the specified pointer and the specified value.
CallInst * CreateStackRestore(Value *Ptr, const Twine &Name="")
Create a call to llvm.stackrestore.
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
An analysis over an "outer" IR unit that provides access to an analysis manager over an "inner" IR un...
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.
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.
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.
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.
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, Instruction *MDFrom=nullptr)
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
bool erase(PtrType Ptr)
Remove pointer from the set.
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 - Compare two strings; the result is negative, zero, or positive if this string is lexicograp...
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.
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
bool isPointerTy() const
True if this is an instance of PointerType.
@ 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)
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
LLVM_ABI bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this is a type whose size is a known multiple of vscale.
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
TypeID getTypeID() const
Return the type id for the type.
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
A Use represents the edge between a Value definition and its users.
LLVM_ABI void set(Value *Val)
User * getUser() const
Returns the User that contains this Use.
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.
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.
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
user_iterator_impl< User > user_iterator
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.
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.
A range adaptor for a pair of iterators.
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ 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.
initializer< Ty > init(const Ty &Val)
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 Constant * getInitialValueOfAllocation(const Value *V, const TargetLibraryInfo *TLI, Type *Ty)
If this is a call to an allocation function that initializes memory to a fixed value,...
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 Constant * ConstantFoldInstruction(const Instruction *I, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldInstruction - Try to constant fold the specified instruction.
LLVM_ABI bool isRemovableAlloc(const CallBase *V, const TargetLibraryInfo *TLI)
Return true if this is a call to an allocation function that does not have side effects that we are r...
const Value * getLoadStorePointerOperand(const Value *V)
A helper function that returns the pointer operand of a load or store instruction.
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...
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.
LLVM_ABI bool isInstructionTriviallyDead(Instruction *I, const TargetLibraryInfo *TLI=nullptr)
Return true if the result produced by the instruction is not used, and the instruction will return.
LLVM_ABI bool getObjectSize(const Value *Ptr, uint64_t &Size, const DataLayout &DL, const TargetLibraryInfo *TLI, ObjectSizeOpts Opts={})
Compute the size of the object pointed by Ptr.
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...
bool isSafeToDestroyConstant(const Constant *C)
It is safe to destroy a constant iff it is only used by constants itself.
LLVM_ABI Align getOrEnforceKnownAlignment(Value *V, MaybeAlign PrefAlign, const DataLayout &DL, const Instruction *CxtI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr)
Try to ensure that the alignment of V is at least PrefAlign bytes.
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.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
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...
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...
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
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.
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
LLVM_ABI bool removeUnreachableBlocks(Function &F, DomTreeUpdater *DTU=nullptr, MemorySSAUpdater *MSSAU=nullptr)
Remove all blocks that can not be reached from the function's entry.
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 bool analyzeGlobal(const Value *V, GlobalStatus &GS)
Look at all uses of the global and fill in the GlobalStatus structure.
Various options to control the behavior of getObjectSize.
Function object to check whether the first component of a container supported by std::get (like std::...