26using namespace PatternMatch;
28#define DEBUG_TYPE "instcombine"
30STATISTIC(NumDeadStore,
"Number of dead stores eliminated");
31STATISTIC(NumGlobalCopies,
"Number of allocas copied from constant global");
34 "instcombine-max-copied-from-constant-users",
cl::init(300),
35 cl::desc(
"Maximum users to visit in copy from constant transform"),
57 while (!Worklist.
empty()) {
59 if (!Visited.
insert(Elem).second)
64 const auto [
Value, IsOffset] = Elem;
66 auto *
I = cast<Instruction>(U.getUser());
68 if (
auto *LI = dyn_cast<LoadInst>(
I)) {
70 if (!LI->isSimple())
return false;
74 if (isa<PHINode, SelectInst>(
I)) {
81 if (isa<BitCastInst, AddrSpaceCastInst>(
I)) {
86 if (
auto *
GEP = dyn_cast<GetElementPtrInst>(
I)) {
93 if (
auto *Call = dyn_cast<CallBase>(
I)) {
96 if (Call->isCallee(&U))
99 unsigned DataOpNo = Call->getDataOperandNo(&U);
100 bool IsArgOperand = Call->isArgOperand(&U);
103 if (IsArgOperand && Call->isInAllocaArgument(DataOpNo))
109 bool NoCapture = Call->doesNotCapture(DataOpNo);
110 if ((Call->onlyReadsMemory() && (Call->use_empty() || NoCapture)) ||
111 (Call->onlyReadsMemory(DataOpNo) && NoCapture))
116 if (
I->isLifetimeStartOrEnd()) {
117 assert(
I->use_empty() &&
"Lifetime markers have no result to use!");
129 if (
MI->isVolatile())
134 if (U.getOperandNo() == 1)
138 if (TheCopy)
return false;
142 if (IsOffset)
return false;
145 if (U.getOperandNo() != 0)
return false;
198 if (
C->getValue().getActiveBits() <= 64) {
236class PointerReplacer {
239 : IC(IC), Root(Root), FromAS(SrcAS) {}
242 void replacePointer(
Value *V);
246 Value *getReplacement(
Value *V)
const {
return WorkMap.lookup(V); }
248 return I == &Root || UsersToReplace.contains(
I);
252 unsigned FromAS)
const {
253 const auto *ASC = dyn_cast<AddrSpaceCastInst>(
I);
256 unsigned ToAS = ASC->getDestAddressSpace();
257 return (FromAS == ToAS) || IC.isValidAddrSpaceCast(FromAS, ToAS);
268bool PointerReplacer::collectUsers() {
272 auto PushUsersToWorklist = [&](
Instruction *Inst) {
273 for (
auto *U : Inst->users())
274 if (
auto *
I = dyn_cast<Instruction>(U))
279 auto TryPushInstOperand = [&](
Instruction *InstOp) {
280 if (!UsersToReplace.contains(InstOp)) {
281 if (!ValuesToRevisit.
insert(InstOp))
288 PushUsersToWorklist(&Root);
289 while (!Worklist.
empty()) {
291 if (
auto *Load = dyn_cast<LoadInst>(Inst)) {
292 if (
Load->isVolatile())
294 UsersToReplace.insert(Load);
295 }
else if (
auto *
PHI = dyn_cast<PHINode>(Inst)) {
299 bool IsReplaceable =
true;
301 if (!isa<Instruction>(V))
302 return IsReplaceable = false;
303 return isAvailable(cast<Instruction>(V));
305 UsersToReplace.insert(
PHI);
306 PushUsersToWorklist(
PHI);
313 if (!IsReplaceable || !ValuesToRevisit.
insert(
PHI))
319 for (
unsigned Idx = 0;
Idx <
PHI->getNumIncomingValues(); ++
Idx) {
320 if (!TryPushInstOperand(cast<Instruction>(
PHI->getIncomingValue(
Idx))))
323 }
else if (
auto *SI = dyn_cast<SelectInst>(Inst)) {
324 auto *TrueInst = dyn_cast<Instruction>(
SI->getTrueValue());
325 auto *FalseInst = dyn_cast<Instruction>(
SI->getFalseValue());
326 if (!TrueInst || !FalseInst)
330 UsersToReplace.insert(SI);
331 PushUsersToWorklist(SI);
338 if (!TryPushInstOperand(TrueInst) || !TryPushInstOperand(FalseInst))
340 }
else if (
auto *
GEP = dyn_cast<GetElementPtrInst>(Inst)) {
341 UsersToReplace.insert(
GEP);
342 PushUsersToWorklist(
GEP);
343 }
else if (
auto *
MI = dyn_cast<MemTransferInst>(Inst)) {
344 if (
MI->isVolatile())
346 UsersToReplace.insert(Inst);
347 }
else if (isEqualOrValidAddrSpaceCast(Inst, FromAS)) {
348 UsersToReplace.insert(Inst);
349 PushUsersToWorklist(Inst);
355 LLVM_DEBUG(
dbgs() <<
"Cannot handle pointer user: " << *Inst <<
'\n');
363void PointerReplacer::replacePointer(
Value *V) {
364 assert(cast<PointerType>(Root.getType()) != cast<PointerType>(
V->getType()) &&
373 while (!Worklist.
empty()) {
378 if (Visited.
insert(
I).second) {
379 for (
auto *U :
I->users()) {
380 auto *UserInst = cast<Instruction>(U);
381 if (UsersToReplace.contains(UserInst) && !Visited.
contains(UserInst))
398 if (getReplacement(
I))
401 if (
auto *LT = dyn_cast<LoadInst>(
I)) {
402 auto *
V = getReplacement(
LT->getPointerOperand());
403 assert(V &&
"Operand not replaced");
404 auto *NewI =
new LoadInst(
LT->getType(), V,
"",
LT->isVolatile(),
405 LT->getAlign(),
LT->getOrdering(),
406 LT->getSyncScopeID());
410 IC.InsertNewInstWith(NewI,
LT->getIterator());
411 IC.replaceInstUsesWith(*LT, NewI);
415 WorkMap[NewI] = NewI;
416 }
else if (
auto *
PHI = dyn_cast<PHINode>(
I)) {
419 Value *
V = WorkMap.lookup(
PHI->getIncomingValue(0));
420 PHI->mutateType(V ?
V->getType() :
PHI->getIncomingValue(0)->getType());
421 for (
unsigned int I = 0;
I <
PHI->getNumIncomingValues(); ++
I) {
422 Value *
V = WorkMap.lookup(
PHI->getIncomingValue(
I));
423 PHI->setIncomingValue(
I, V ? V :
PHI->getIncomingValue(
I));
426 }
else if (
auto *
GEP = dyn_cast<GetElementPtrInst>(
I)) {
427 auto *
V = getReplacement(
GEP->getPointerOperand());
428 assert(V &&
"Operand not replaced");
432 IC.InsertNewInstWith(NewI,
GEP->getIterator());
434 NewI->setNoWrapFlags(
GEP->getNoWrapFlags());
436 }
else if (
auto *SI = dyn_cast<SelectInst>(
I)) {
437 Value *TrueValue =
SI->getTrueValue();
438 Value *FalseValue =
SI->getFalseValue();
439 if (
Value *Replacement = getReplacement(TrueValue))
440 TrueValue = Replacement;
441 if (
Value *Replacement = getReplacement(FalseValue))
442 FalseValue = Replacement;
444 SI->getName(),
nullptr, SI);
445 IC.InsertNewInstWith(NewSI,
SI->getIterator());
448 }
else if (
auto *MemCpy = dyn_cast<MemTransferInst>(
I)) {
449 auto *DestV = MemCpy->getRawDest();
450 auto *SrcV = MemCpy->getRawSource();
452 if (
auto *DestReplace = getReplacement(DestV))
454 if (
auto *SrcReplace = getReplacement(SrcV))
457 IC.Builder.SetInsertPoint(MemCpy);
458 auto *NewI = IC.Builder.CreateMemTransferInst(
459 MemCpy->getIntrinsicID(), DestV, MemCpy->getDestAlign(), SrcV,
460 MemCpy->getSourceAlign(), MemCpy->getLength(), MemCpy->isVolatile());
461 AAMDNodes AAMD = MemCpy->getAAMetadata();
463 NewI->setAAMetadata(AAMD);
465 IC.eraseInstFromFunction(*MemCpy);
466 WorkMap[MemCpy] = NewI;
467 }
else if (
auto *ASC = dyn_cast<AddrSpaceCastInst>(
I)) {
468 auto *
V = getReplacement(ASC->getPointerOperand());
469 assert(V &&
"Operand not replaced");
470 assert(isEqualOrValidAddrSpaceCast(
471 ASC,
V->getType()->getPointerAddressSpace()) &&
472 "Invalid address space cast!");
474 if (
V->getType()->getPointerAddressSpace() !=
475 ASC->getType()->getPointerAddressSpace()) {
478 IC.InsertNewInstWith(NewI, ASC->getIterator());
508 if (&*FirstInst != &AI) {
512 AllocaInst *EntryAI = dyn_cast<AllocaInst>(FirstInst);
538 Value *TheSrc = Copy->getSource();
541 TheSrc, AllocaAlign,
DL, &AI, &
AC, &
DT);
542 if (AllocaAlign <= SourceAlign &&
544 !isa<Instruction>(TheSrc)) {
547 LLVM_DEBUG(
dbgs() <<
"Found alloca equal to global: " << AI <<
'\n');
560 PointerReplacer PtrReplacer(*
this, AI, SrcAddrSpace);
561 if (PtrReplacer.collectUsers()) {
565 PtrReplacer.replacePointer(TheSrc);
591 const Twine &Suffix) {
593 "can't fold an atomic load to requested type");
609 "can't fold an atomic store of requested type");
611 Value *
Ptr = SI.getPointerOperand();
613 SI.getAllMetadata(MD);
617 NewStore->
setAtomic(SI.getOrdering(), SI.getSyncScopeID());
618 for (
const auto &MDPair : MD) {
619 unsigned ID = MDPair.first;
630 case LLVMContext::MD_dbg:
631 case LLVMContext::MD_DIAssignID:
632 case LLVMContext::MD_tbaa:
633 case LLVMContext::MD_prof:
634 case LLVMContext::MD_fpmath:
635 case LLVMContext::MD_tbaa_struct:
636 case LLVMContext::MD_alias_scope:
637 case LLVMContext::MD_noalias:
638 case LLVMContext::MD_nontemporal:
639 case LLVMContext::MD_mem_parallel_loop_access:
640 case LLVMContext::MD_access_group:
644 case LLVMContext::MD_invariant_load:
645 case LLVMContext::MD_nonnull:
646 case LLVMContext::MD_noundef:
647 case LLVMContext::MD_range:
648 case LLVMContext::MD_align:
649 case LLVMContext::MD_dereferenceable:
650 case LLVMContext::MD_dereferenceable_or_null:
680 if (!Load.isUnordered())
683 if (Load.use_empty())
687 if (Load.getPointerOperand()->isSwiftError())
693 if (Load.hasOneUse()) {
696 Type *LoadTy = Load.getType();
697 if (
auto *BC = dyn_cast<BitCastInst>(Load.user_back())) {
699 if (BC->getType()->isX86_AMXTy())
703 if (
auto *CastUser = dyn_cast<CastInst>(Load.user_back())) {
704 Type *DestTy = CastUser->getDestTy();
728 if (!
T->isAggregateType())
733 if (
auto *ST = dyn_cast<StructType>(
T)) {
735 auto NumElements = ST->getNumElements();
736 if (NumElements == 1) {
741 NewLoad->
copyMetadata(LI, LLVMContext::MD_invariant_load);
749 auto *SL =
DL.getStructLayout(ST);
751 if (SL->hasPadding())
756 auto *IdxType =
DL.getIndexType(
Addr->getType());
759 for (
unsigned i = 0; i < NumElements; i++) {
764 ST->getElementType(i),
Ptr,
770 L->copyMetadata(LI, LLVMContext::MD_invariant_load);
778 if (
auto *AT = dyn_cast<ArrayType>(
T)) {
779 auto *ET = AT->getElementType();
780 auto NumElements = AT->getNumElements();
781 if (NumElements == 1) {
801 auto *Zero = ConstantInt::get(IdxType, 0);
805 for (
uint64_t i = 0; i < NumElements; i++) {
806 Value *Indices[2] = {
808 ConstantInt::get(IdxType, i),
814 EltAlign,
Name +
".unpack");
840 P =
P->stripPointerCasts();
851 if (
PHINode *PN = dyn_cast<PHINode>(
P)) {
857 if (GA->isInterposable())
866 if (!AI->getAllocatedType()->isSized())
869 ConstantInt *CS = dyn_cast<ConstantInt>(AI->getArraySize());
873 TypeSize TS =
DL.getTypeAllocSize(AI->getAllocatedType());
885 if (!GV->hasDefinitiveInitializer() || !GV->isConstant())
888 uint64_t InitSize =
DL.getTypeAllocSize(GV->getValueType());
889 if (InitSize > MaxSize)
895 }
while (!Worklist.
empty());
927 if (
const ConstantInt *CI = dyn_cast<ConstantInt>(V))
939 Idx = FirstNZIdx(GEPI);
953 if (!AllocTy || !AllocTy->
isSized())
956 uint64_t TyAllocSize =
DL.getTypeAllocSize(AllocTy).getFixedValue();
962 auto IsAllNonNegative = [&]() {
997 ConstantInt::get(GEPI->getOperand(
Idx)->getType(), 0));
1010 auto *
Ptr = SI.getPointerOperand();
1012 Ptr = GEPI->getOperand(0);
1013 return (isa<ConstantPointerNull>(
Ptr) &&
1019 const Value *GEPI0 = GEPI->getOperand(0);
1020 if (isa<ConstantPointerNull>(GEPI0) &&
1024 if (isa<UndefValue>(
Op) ||
1025 (isa<ConstantPointerNull>(
Op) &&
1031Value *InstCombinerImpl::simplifyNonNullOperand(
Value *V,
1032 bool HasDereferenceable,
1034 if (
auto *Sel = dyn_cast<SelectInst>(V)) {
1035 if (isa<ConstantPointerNull>(Sel->getOperand(1)))
1036 return Sel->getOperand(2);
1038 if (isa<ConstantPointerNull>(Sel->getOperand(2)))
1039 return Sel->getOperand(1);
1042 if (!
V->hasOneUse())
1049 if (
auto *
GEP = dyn_cast<GetElementPtrInst>(V)) {
1050 if (HasDereferenceable ||
GEP->isInBounds()) {
1051 if (
auto *Res = simplifyNonNullOperand(
GEP->getPointerOperand(),
1052 HasDereferenceable,
Depth + 1)) {
1060 if (
auto *
PHI = dyn_cast<PHINode>(V)) {
1061 bool Changed =
false;
1062 for (
Use &U :
PHI->incoming_values()) {
1064 if (
auto *Res = simplifyNonNullOperand(
U.get(), HasDereferenceable,
1097 bool IsLoadCSE =
false;
1120 if (
Op->hasOneUse()) {
1135 Alignment,
DL, SI) &&
1137 Alignment,
DL, SI)) {
1140 SI->getOperand(1)->getName() +
".val");
1143 SI->getOperand(2)->getName() +
".val");
1159 if (
Value *V = simplifyNonNullOperand(
Op,
true))
1181 while (
auto *
IV = dyn_cast<InsertValueInst>(V)) {
1182 auto *E = dyn_cast<ExtractElementInst>(
IV->getInsertedValueOperand());
1185 auto *W = E->getVectorOperand();
1190 auto *CI = dyn_cast<ConstantInt>(E->getIndexOperand());
1191 if (!CI ||
IV->getNumIndices() != 1 || CI->getZExtValue() != *
IV->idx_begin())
1193 V =
IV->getAggregateOperand();
1198 auto *UT = cast<VectorType>(U->getType());
1199 auto *VT = V->getType();
1202 if (
DL.getTypeStoreSizeInBits(UT) !=
DL.getTypeStoreSizeInBits(VT)) {
1205 if (
auto *AT = dyn_cast<ArrayType>(VT)) {
1206 if (AT->getNumElements() != cast<FixedVectorType>(UT)->getNumElements())
1209 auto *ST = cast<StructType>(VT);
1210 if (ST->getNumElements() != cast<FixedVectorType>(UT)->getNumElements())
1212 for (
const auto *EltT : ST->elements()) {
1213 if (EltT != UT->getElementType())
1243 if (!SI.isUnordered())
1247 if (SI.getPointerOperand()->isSwiftError())
1250 Value *V = SI.getValueOperand();
1253 if (
auto *BC = dyn_cast<BitCastInst>(V)) {
1254 assert(!BC->getType()->isX86_AMXTy() &&
1255 "store to x86_amx* should not happen!");
1256 V = BC->getOperand(0);
1259 if (V->getType()->isX86_AMXTy())
1284 Value *V = SI.getValueOperand();
1285 Type *
T = V->getType();
1287 if (!
T->isAggregateType())
1290 if (
auto *ST = dyn_cast<StructType>(
T)) {
1292 unsigned Count = ST->getNumElements();
1302 auto *SL =
DL.getStructLayout(ST);
1304 if (SL->hasPadding())
1307 const auto Align = SI.getAlign();
1311 auto *
Addr = SI.getPointerOperand();
1313 AddrName +=
".repack";
1315 auto *IdxType =
DL.getIndexType(
Addr->getType());
1316 for (
unsigned i = 0; i < Count; i++) {
1330 if (
auto *AT = dyn_cast<ArrayType>(
T)) {
1332 auto NumElements = AT->getNumElements();
1333 if (NumElements == 1) {
1347 TypeSize EltSize =
DL.getTypeAllocSize(AT->getElementType());
1348 const auto Align = SI.getAlign();
1352 auto *
Addr = SI.getPointerOperand();
1354 AddrName +=
".repack";
1357 auto *Zero = ConstantInt::get(IdxType, 0);
1360 for (
uint64_t i = 0; i < NumElements; i++) {
1361 Value *Indices[2] = {
1363 ConstantInt::get(IdxType, i),
1390 if (
A ==
B)
return true;
1397 if (isa<BinaryOperator>(
A) ||
1400 isa<GetElementPtrInst>(
A))
1402 if (cast<Instruction>(
A)->isIdenticalToWhenDefined(BI))
1410 Value *Val = SI.getOperand(0);
1427 if (!SI.isUnordered())
return nullptr;
1431 if (
Ptr->hasOneUse()) {
1432 if (isa<AllocaInst>(
Ptr))
1435 if (isa<AllocaInst>(
GEP->getOperand(0))) {
1436 if (
GEP->getOperand(0)->hasOneUse())
1452 for (
unsigned ScanInsts = 6; BBI != SI.getParent()->begin() && ScanInsts;
1457 if (BBI->isDebugOrPseudoInst()) {
1462 if (
StoreInst *PrevSI = dyn_cast<StoreInst>(BBI)) {
1464 if (PrevSI->isUnordered() &&
1466 PrevSI->getValueOperand()->getType() ==
1467 SI.getValueOperand()->getType()) {
1482 if (
LoadInst *LI = dyn_cast<LoadInst>(BBI)) {
1484 assert(SI.isUnordered() &&
"can't eliminate ordering operation");
1494 if (BBI->mayWriteToMemory() || BBI->mayReadFromMemory() || BBI->mayThrow())
1501 if (!isa<PoisonValue>(Val))
1507 if (isa<UndefValue>(
Ptr)) {
1522 if (isa<UndefValue>(Val))
1526 if (
Value *V = simplifyNonNullOperand(
Ptr,
true))
1538 if (!SI.isUnordered())
1549 if (*PredIter == StoreBB)
1555 if (StoreBB == DestBB || OtherBB == DestBB)
1560 BranchInst *OtherBr = dyn_cast<BranchInst>(BBI);
1561 if (!OtherBr || BBI == OtherBB->
begin())
1564 auto OtherStoreIsMergeable = [&](
StoreInst *OtherStore) ->
bool {
1566 OtherStore->getPointerOperand() != SI.getPointerOperand())
1569 auto *SIVTy = SI.getValueOperand()->getType();
1570 auto *OSVTy = OtherStore->getValueOperand()->getType();
1572 SI.hasSameSpecialState(OtherStore);
1581 while (BBI->isDebugOrPseudoInst()) {
1582 if (BBI==OtherBB->
begin())
1588 OtherStore = dyn_cast<StoreInst>(BBI);
1589 if (!OtherStoreIsMergeable(OtherStore))
1603 OtherStore = dyn_cast<StoreInst>(BBI);
1604 if (OtherStoreIsMergeable(OtherStore))
1609 if (BBI->mayReadFromMemory() || BBI->mayThrow() ||
1610 BBI->mayWriteToMemory() || BBI == OtherBB->
begin())
1618 if (
I->mayReadFromMemory() ||
I->mayThrow() ||
I->mayWriteToMemory())
1628 if (MergedVal != SI.getValueOperand()) {
1631 PN->
addIncoming(SI.getValueOperand(), SI.getParent());
1642 new StoreInst(MergedVal, SI.getOperand(1), SI.isVolatile(), SI.getAlign(),
1643 SI.getOrdering(), SI.getSyncScopeID());
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file provides internal interfaces used to implement the InstCombine.
static StoreInst * combineStoreToNewValue(InstCombinerImpl &IC, StoreInst &SI, Value *V)
Combine a store to a new type.
static Instruction * combineLoadToOperationType(InstCombinerImpl &IC, LoadInst &Load)
Combine loads to match the type of their uses' value after looking through intervening bitcasts.
static Instruction * replaceGEPIdxWithZero(InstCombinerImpl &IC, Value *Ptr, Instruction &MemI)
static Instruction * simplifyAllocaArraySize(InstCombinerImpl &IC, AllocaInst &AI, DominatorTree &DT)
static bool canSimplifyNullStoreOrGEP(StoreInst &SI)
static bool equivalentAddressValues(Value *A, Value *B)
equivalentAddressValues - Test if A and B will obviously have the same value.
static bool canReplaceGEPIdxWithZero(InstCombinerImpl &IC, GetElementPtrInst *GEPI, Instruction *MemI, unsigned &Idx)
static bool canSimplifyNullLoadOrGEP(LoadInst &LI, Value *Op)
static bool isSupportedAtomicType(Type *Ty)
static bool isDereferenceableForAllocaSize(const Value *V, const AllocaInst *AI, const DataLayout &DL)
Returns true if V is dereferenceable for size of alloca.
static Instruction * unpackLoadToAggregate(InstCombinerImpl &IC, LoadInst &LI)
static cl::opt< unsigned > MaxCopiedFromConstantUsers("instcombine-max-copied-from-constant-users", cl::init(300), cl::desc("Maximum users to visit in copy from constant transform"), cl::Hidden)
static bool combineStoreToValueType(InstCombinerImpl &IC, StoreInst &SI)
Combine stores to match the type of value being stored.
static bool unpackStoreToAggregate(InstCombinerImpl &IC, StoreInst &SI)
static Value * likeBitCastFromVector(InstCombinerImpl &IC, Value *V)
Look for extractelement/insertvalue sequence that acts like a bitcast.
static bool isOnlyCopiedFromConstantMemory(AAResults *AA, AllocaInst *V, MemTransferInst *&TheCopy, SmallVectorImpl< Instruction * > &ToDelete)
isOnlyCopiedFromConstantMemory - Recursively walk the uses of a (derived) pointer to an alloca.
static bool isObjectSizeLessThanOrEq(Value *V, uint64_t MaxSize, const DataLayout &DL)
This file provides the interface for the instcombine pass implementation.
This file implements a map that provides insertion order iteration.
This file defines the SmallString class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
static const uint32_t IV[8]
A private abstract base class describing the concept of an individual alias analysis implementation.
LLVM_ABI ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, bool IgnoreLocals=false)
Returns a bitmask that should be unconditionally applied to the ModRef info of a memory location.
Class for arbitrary precision integers.
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
This class represents a conversion between pointers from one address space to another.
an instruction to allocate memory on the stack
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
PointerType * getType() const
Overload to return most specific pointer type.
Type * getAllocatedType() const
Return the type that is being allocated by the instruction.
bool isUsedWithInAlloca() const
Return true if this alloca is used as an inalloca argument to a call.
unsigned getAddressSpace() const
Return the address space for the allocation.
LLVM_ABI bool isArrayAllocation() const
Return true if there is an allocation size parameter to the allocation instruction that is not 1.
void setAlignment(Align Align)
const Value * getArraySize() const
Get the number of elements allocated.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
LLVM_ABI bool hasNPredecessors(unsigned N) const
Return true if this block has exactly N predecessors.
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...
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
Conditional or Unconditional Branch instruction.
BasicBlock * getSuccessor(unsigned i) const
bool isUnconditional() const
static LLVM_ABI bool isBitOrNoopPointerCastable(Type *SrcTy, Type *DestTy, const DataLayout &DL)
Check whether a bitcast, inttoptr, or ptrtoint cast between these types is valid and a no-op.
This is the shared class of boolean and integer constants.
const APInt & getValue() const
Return the constant as an APInt value reference.
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
LLVM_ABI IntegerType * getIndexType(LLVMContext &C, unsigned AddressSpace) const
Returns the type of a GEP index in AddressSpace.
TypeSize getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
static LLVM_ABI DebugLoc getMergedLocation(DebugLoc LocA, DebugLoc LocB)
When two instructions are combined into a single instruction we also need to combine the original loc...
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
LLVM_ABI bool isInBounds() const
Determine whether the GEP has the inbounds flag.
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI Type * getIndexedType(Type *Ty, ArrayRef< Value * > IdxList)
Returns the result type of a getelementptr with the given source element type and indexes.
Type * getSourceElementType() const
AllocaInst * CreateAlloca(Type *Ty, unsigned AddrSpace, Value *ArraySize=nullptr, const Twine &Name="")
Value * CreateInsertValue(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Twine &Name="")
LoadInst * CreateAlignedLoad(Type *Ty, Value *Ptr, MaybeAlign Align, const char *Name)
Value * CreateExtractValue(Value *Agg, ArrayRef< unsigned > Idxs, const Twine &Name="")
Value * CreateInBoundsGEP(Type *Ty, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &Name="")
ConstantInt * getInt32(uint32_t C)
Get a constant 32-bit value.
Value * CreateBitOrPointerCast(Value *V, Type *DestTy, const Twine &Name="")
LoadInst * CreateLoad(Type *Ty, Value *Ptr, const char *Name)
Provided to resolve 'CreateLoad(Ty, Ptr, "...")' correctly, instead of converting the string to 'bool...
LLVM_ABI Value * CreateTypeSize(Type *Ty, TypeSize Size)
Create an expression which evaluates to the number of units in Size at runtime.
Value * CreateIntCast(Value *V, Type *DestTy, bool isSigned, const Twine &Name="")
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
StoreInst * CreateAlignedStore(Value *Val, Value *Ptr, MaybeAlign Align, bool isVolatile=false)
Value * CreateInBoundsPtrAdd(Value *Ptr, Value *Offset, const Twine &Name="")
void handleUnreachableFrom(Instruction *I, SmallVectorImpl< BasicBlock * > &Worklist)
Instruction * visitLoadInst(LoadInst &LI)
void handlePotentiallyDeadBlocks(SmallVectorImpl< BasicBlock * > &Worklist)
Instruction * eraseInstFromFunction(Instruction &I) override
Combiner aware instruction erasure.
Instruction * visitStoreInst(StoreInst &SI)
bool mergeStoreIntoSuccessor(StoreInst &SI)
Try to transform: if () { *P = v1; } else { *P = v2 } or: *P = v1; if () { *P = v2; } into a phi node...
void CreateNonTerminatorUnreachable(Instruction *InsertAt)
Create and insert the idiom we use to indicate a block is unreachable without having to rewrite the C...
bool removeInstructionsBeforeUnreachable(Instruction &I)
LoadInst * combineLoadToNewType(LoadInst &LI, Type *NewTy, const Twine &Suffix="")
Helper to combine a load to a new type.
Instruction * visitAllocSite(Instruction &FI)
Instruction * visitAllocaInst(AllocaInst &AI)
const DataLayout & getDataLayout() const
Instruction * InsertNewInstBefore(Instruction *New, BasicBlock::iterator Old)
Inserts an instruction New before instruction Old.
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
uint64_t MaxArraySizeForCombine
Maximum size of array considered when transforming.
void replaceUse(Use &U, Value *NewValue)
Replace use and add the previously used value to the worklist.
InstructionWorklist & Worklist
A worklist of the instructions that need to be simplified.
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CxtI, unsigned Depth=0) const
void addToWorklist(Instruction *I)
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
void push(Instruction *I)
Push the instruction onto the worklist stack.
LLVM_ABI Instruction * clone() const
Create a copy of 'this' instruction that is identical in all ways except the following:
LLVM_ABI bool isLifetimeStartOrEnd() const LLVM_READONLY
Return true if the instruction is a llvm.lifetime.start or llvm.lifetime.end marker.
LLVM_ABI void mergeDIAssignID(ArrayRef< const Instruction * > SourceInstructions)
Merge the DIAssignID metadata from this instruction and those attached to instructions in SourceInstr...
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI void setAAMetadata(const AAMDNodes &N)
Sets the AA metadata on this instruction from the AAMDNodes structure.
LLVM_ABI void moveBefore(InstListType::iterator InsertPos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
LLVM_ABI bool isAtomic() const LLVM_READONLY
Return true if this instruction has an AtomicOrdering of unordered or higher.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
LLVM_ABI BasicBlock * getSuccessor(unsigned Idx) const LLVM_READONLY
Return the specified successor. This instruction must be a terminator.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
LLVM_ABI AAMDNodes getAAMetadata() const
Returns the AA metadata for this instruction.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM_ABI void copyMetadata(const Instruction &SrcInst, ArrayRef< unsigned > WL=ArrayRef< unsigned >())
Copy metadata from SrcInst to this instruction.
An instruction for reading from memory.
unsigned getPointerAddressSpace() const
Returns the address space of the pointer operand.
void setAlignment(Align Align)
Value * getPointerOperand()
bool isVolatile() const
Return true if this is a load from a volatile memory location.
void setAtomic(AtomicOrdering Ordering, SyncScope::ID SSID=SyncScope::System)
Sets the ordering constraint and the synchronization scope ID of this load instruction.
AtomicOrdering getOrdering() const
Returns the ordering constraint of this load instruction.
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID of this load instruction.
Align getAlign() const
Return the alignment of the access that is being performed.
This class implements a map that also provides access to all stored values in a deterministic order.
This class wraps the llvm.memcpy/memmove intrinsics.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
PointerIntPair - This class implements a pair of a pointer and small integer.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
This class represents the LLVM 'select' instruction.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, Instruction *MDFrom=nullptr)
A vector that has set insertion semantics.
bool insert(const value_type &X)
Insert a new element into the SetVector.
bool contains(const key_type &key) const
Check if the SetVector contains the given key.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
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()
void setAtomic(AtomicOrdering Ordering, SyncScope::ID SSID=SyncScope::System)
Sets the ordering constraint and the synchronization scope ID of this store instruction.
StringRef - Represent a constant reference to a string, i.e.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
static constexpr TypeSize getZero()
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI IntegerType * getInt64Ty(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 isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
bool isX86_AMXTy() const
Return true if this is X86 AMX.
bool isIntOrPtrTy() const
Return true if this is an integer type or a pointer type.
bool isIntegerTy() const
True if this is an instance of IntegerType.
A Use represents the edge between a Value definition and its users.
void setOperand(unsigned i, Value *Val)
Value * getOperand(unsigned i) const
unsigned getNumOperands() const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
iterator_range< use_iterator > uses()
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
constexpr ScalarTy getFixedValue() const
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
const ParentTy * getParent() const
self_iterator getIterator()
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
bool match(Val *V, const Pattern &P)
auto m_Undef()
Match an arbitrary undef constant.
initializer< Ty > init(const Ty &Val)
LLVM_ABI bool isAvailable()
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 isDereferenceableAndAlignedPointer(const Value *V, Type *Ty, Align Alignment, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Returns true if V is always a dereferenceable pointer with alignment greater or equal than requested.
LLVM_ABI void copyMetadataForLoad(LoadInst &Dest, const LoadInst &Source)
Copy the metadata from the source instruction to the destination (the replacement for the source inst...
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
LLVM_ABI Value * FindAvailableLoadedValue(LoadInst *Load, BasicBlock *ScanBB, BasicBlock::iterator &ScanFrom, unsigned MaxInstsToScan=DefMaxInstsToScan, BatchAAResults *AA=nullptr, bool *IsLoadCSE=nullptr, unsigned *NumScanedInst=nullptr)
Scan backwards to see if we have the value of the given load available locally within a small number ...
auto reverse(ContainerTy &&C)
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 isModSet(const ModRefInfo MRI)
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 bool isSafeToLoadUnconditionally(Value *V, Align Alignment, const APInt &Size, const DataLayout &DL, Instruction *ScanFrom, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Return true if we know that executing a load from this value cannot trap.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI bool replaceAllDbgUsesWith(Instruction &From, Value &To, Instruction &DomPoint, DominatorTree &DT)
Point debug users of From to To or salvage them.
LLVM_ABI Value * simplifyLoadInst(LoadInst *LI, Value *PtrOp, const SimplifyQuery &Q)
Given a load instruction and its pointer operand, fold the result or return null.
LLVM_ABI void combineMetadataForCSE(Instruction *K, const Instruction *J, bool DoesKMove)
Combine the metadata of two instructions so that K can replace J.
void replace(R &&Range, const T &OldValue, const T &NewValue)
Provide wrappers to std::replace which take ranges instead of having to pass begin/end explicitly.
auto pred_begin(const MachineBasicBlock *BB)
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
LLVM_ABI AAMDNodes merge(const AAMDNodes &Other) const
Given two sets of AAMDNodes applying to potentially different locations, determine the best AAMDNodes...
This struct is a compact representation of a valid (non-zero power of two) alignment.
bool isNonNegative() const
Returns true if this value is known to be non-negative.
SimplifyQuery getWithInstruction(const Instruction *I) const