29#define DEBUG_TYPE "instcombine"
31STATISTIC(NumDeadStore,
"Number of dead stores eliminated");
32STATISTIC(NumGlobalCopies,
"Number of allocas copied from constant global");
52 while (!Worklist.
empty()) {
54 if (!Visited.
insert(Elem).second)
56 if (Visited.
size() > MaxUsers)
59 const auto [
Value, IsOffset] = Elem;
65 if (!LI->isSimple())
return false;
91 if (
Call->isCallee(&U))
94 unsigned DataOpNo =
Call->getDataOperandNo(&U);
95 bool IsArgOperand =
Call->isArgOperand(&U);
98 if (IsArgOperand &&
Call->isInAllocaArgument(DataOpNo))
104 bool NoCapture =
Call->doesNotCapture(DataOpNo);
106 (
Call->onlyReadsMemory() ||
Call->onlyReadsMemory(DataOpNo)))
111 if (
I->isLifetimeStartOrEnd()) {
112 assert(
I->use_empty() &&
"Lifetime markers have no result to use!");
124 if (
MI->isVolatile())
129 if (U.getOperandNo() == 1)
133 if (TheCopy)
return false;
137 if (IsOffset)
return false;
140 if (U.getOperandNo() != 0)
return false;
171 if (!AllocaSize || AllocaSize->isScalable())
191 if (
C->getValue().getActiveBits() <= 64) {
197 New->copyMetadata(AI);
230class PointerReplacer {
232 PointerReplacer(InstCombinerImpl &IC, Instruction &Root,
unsigned SrcAS)
233 : IC(IC), Root(Root), FromAS(SrcAS) {}
236 void replacePointer(
Value *V);
240 Value *getReplacement(
Value *V)
const {
return WorkMap.lookup(V); }
242 return I == &Root || UsersToReplace.contains(
I);
245 bool isEqualOrValidAddrSpaceCast(
const Instruction *
I,
246 unsigned FromAS)
const {
250 unsigned ToAS = ASC->getDestAddressSpace();
251 return (FromAS == ToAS) || IC.isValidAddrSpaceCast(FromAS, ToAS);
254 SmallSetVector<Instruction *, 32> UsersToReplace;
255 DenseMap<Value *, Value *> WorkMap;
256 InstCombinerImpl &IC;
262bool PointerReplacer::collectUsers() {
263 SmallVector<Instruction *> Worklist;
264 SmallSetVector<Instruction *, 32> ValuesToRevisit;
266 auto PushUsersToWorklist = [&](
Instruction *Inst) {
267 for (
auto *U : Inst->users())
273 auto TryPushInstOperand = [&](
Instruction *InstOp) {
274 if (!UsersToReplace.contains(InstOp)) {
275 if (!ValuesToRevisit.
insert(InstOp))
282 PushUsersToWorklist(&Root);
283 while (!Worklist.
empty()) {
286 if (
Load->isVolatile())
288 UsersToReplace.insert(
Load);
293 bool IsReplaceable =
all_of(
PHI->incoming_values(),
294 [](
Value *V) { return isa<Instruction>(V); });
295 if (IsReplaceable &&
all_of(
PHI->incoming_values(), [&](
Value *V) {
296 return isAvailable(cast<Instruction>(V));
298 UsersToReplace.insert(
PHI);
299 PushUsersToWorklist(
PHI);
306 if (!IsReplaceable || !ValuesToRevisit.
insert(
PHI))
312 for (
unsigned Idx = 0;
Idx <
PHI->getNumIncomingValues(); ++
Idx) {
319 if (!TrueInst || !FalseInst)
323 UsersToReplace.insert(SI);
324 PushUsersToWorklist(SI);
331 if (!TryPushInstOperand(TrueInst) || !TryPushInstOperand(FalseInst))
338 UsersToReplace.insert(
GEP);
339 PushUsersToWorklist(
GEP);
344 if (!TryPushInstOperand(PtrOp))
347 if (
MI->isVolatile())
349 UsersToReplace.insert(Inst);
350 }
else if (isEqualOrValidAddrSpaceCast(Inst, FromAS)) {
351 UsersToReplace.insert(Inst);
352 PushUsersToWorklist(Inst);
358 LLVM_DEBUG(
dbgs() <<
"Cannot handle pointer user: " << *Inst <<
'\n');
366void PointerReplacer::replacePointer(
Value *V) {
370 SmallVector<Instruction *> Worklist;
371 SetVector<Instruction *> PostOrderWorklist;
372 SmallPtrSet<Instruction *, 32> Visited;
376 while (!Worklist.
empty()) {
381 if (Visited.
insert(
I).second) {
382 for (
auto *U :
I->users()) {
384 if (UsersToReplace.contains(UserInst) && !Visited.
contains(UserInst))
396 for (Instruction *
I :
reverse(PostOrderWorklist))
400void PointerReplacer::replace(Instruction *
I) {
401 if (getReplacement(
I))
405 auto *
V = getReplacement(
LT->getPointerOperand());
406 assert(V &&
"Operand not replaced");
407 auto *NewI =
new LoadInst(
LT->getType(), V,
"",
LT->getProperties());
409 NewI->copyMetadata(*LT);
416 WorkMap[NewI] = NewI;
418 Value *FirstIncoming =
PHI->getIncomingValue(0);
421 if (
PHI->getType() == NewType) {
422 for (
unsigned I = 0;
I <
PHI->getNumIncomingValues(); ++
I) {
424 PHI->setIncomingValue(
I, V ? V :
PHI->getIncomingValue(
I));
433 NewPHI->copyMetadata(*
PHI);
434 WorkMap[
PHI] = NewPHI;
435 for (
auto [IncomingValue, IncomingBlock] :
438 assert(V &&
V->getType() == NewType &&
439 "Type-changing PHI incoming value was not replaced");
440 NewPHI->addIncoming(V, IncomingBlock);
443 auto *
V = getReplacement(
GEP->getPointerOperand());
444 assert(V &&
"Operand not replaced");
445 SmallVector<Value *, 8> Indices(
GEP->indices());
450 NewI->setNoWrapFlags(
GEP->getNoWrapFlags());
453 Value *TrueValue =
SI->getTrueValue();
454 Value *FalseValue =
SI->getFalseValue();
455 if (
Value *Replacement = getReplacement(TrueValue))
456 TrueValue = Replacement;
457 if (
Value *Replacement = getReplacement(FalseValue))
458 FalseValue = Replacement;
460 SI->getName(),
nullptr, SI);
465 auto *DestV = MemCpy->getRawDest();
466 auto *SrcV = MemCpy->getRawSource();
468 if (
auto *DestReplace = getReplacement(DestV))
470 if (
auto *SrcReplace = getReplacement(SrcV))
475 MemCpy->getIntrinsicID(), DestV, MemCpy->getDestAlign(), SrcV,
476 MemCpy->getSourceAlign(), MemCpy->getLength(), MemCpy->isVolatile());
479 NewI->setAAMetadata(AAMD);
482 WorkMap[MemCpy] = NewI;
484 auto *
V = getReplacement(ASC->getPointerOperand());
485 assert(V &&
"Operand not replaced");
486 assert(isEqualOrValidAddrSpaceCast(
487 ASC,
V->getType()->getPointerAddressSpace()) &&
488 "Invalid address space cast!");
490 if (
V->getType()->getPointerAddressSpace() !=
491 ASC->getType()->getPointerAddressSpace()) {
492 auto *NewI =
new AddrSpaceCastInst(V, ASC->getType(),
"");
524 if (&*FirstInst != &AI) {
529 std::optional<TypeSize> EntryAISize =
531 if (!EntryAISize || !EntryAISize->isZero()) {
553 AA, &AI, ToDelete,
CLOpts.max_copied_from_constant_users)) {
554 Value *TheSrc = Copy->getSource();
557 TheSrc, AllocaAlign,
DL, &AI, &
AC, &
DT);
558 if (AllocaAlign <= SourceAlign &&
563 LLVM_DEBUG(
dbgs() <<
"Found alloca equal to global: " << AI <<
'\n');
576 PointerReplacer PtrReplacer(*
this, AI, SrcAddrSpace);
577 if (PtrReplacer.collectUsers()) {
581 PtrReplacer.replacePointer(TheSrc);
594 return Ty->isIntOrPtrTy() || Ty->isFloatingPointTy();
607 const Twine &Suffix) {
609 "can't fold an atomic load to requested type");
623 "can't fold an atomic store of requested type");
625 Value *Ptr =
SI.getPointerOperand();
627 SI.getAllMetadata(MD);
630 for (
const auto &MDPair : MD) {
631 unsigned ID = MDPair.first;
642 case LLVMContext::MD_dbg:
643 case LLVMContext::MD_DIAssignID:
644 case LLVMContext::MD_tbaa:
645 case LLVMContext::MD_prof:
646 case LLVMContext::MD_fpmath:
647 case LLVMContext::MD_tbaa_struct:
648 case LLVMContext::MD_alias_scope:
649 case LLVMContext::MD_noalias:
650 case LLVMContext::MD_nontemporal:
651 case LLVMContext::MD_mem_parallel_loop_access:
652 case LLVMContext::MD_access_group:
656 case LLVMContext::MD_invariant_load:
657 case LLVMContext::MD_nonnull:
658 case LLVMContext::MD_noundef:
659 case LLVMContext::MD_range:
660 case LLVMContext::MD_align:
661 case LLVMContext::MD_dereferenceable:
662 case LLVMContext::MD_dereferenceable_or_null:
692 if (!
Load.isUnordered())
695 if (
Load.isElementwise())
698 if (
Load.use_empty())
702 if (
Load.getPointerOperand()->isSwiftError())
708 if (
Load.hasOneUse()) {
714 if (BC->getType()->isX86_AMXTy())
719 Type *DestTy = CastUser->getDestTy();
743 if (!
T->isAggregateType())
750 auto NumElements = ST->getNumElements();
751 if (NumElements == 1) {
756 NewLoad->
copyMetadata(LI, LLVMContext::MD_invariant_load);
764 auto *SL =
DL.getStructLayout(ST);
766 if (SL->hasPadding())
771 auto *IdxType =
DL.getIndexType(Addr->getType());
774 for (
unsigned i = 0; i < NumElements; i++) {
779 ST->getElementType(i), Ptr,
785 L->copyMetadata(LI, LLVMContext::MD_invariant_load);
794 auto *ET = AT->getElementType();
795 auto NumElements = AT->getNumElements();
796 if (NumElements == 1) {
807 if (NumElements > IC.
CLOpts.maxarray_size)
816 auto *Zero = ConstantInt::get(IdxType, 0);
820 for (
uint64_t i = 0; i < NumElements; i++) {
821 Value *Indices[2] = {
823 ConstantInt::get(IdxType, i),
829 EltAlign, Name +
".unpack");
855 P =
P->stripPointerCasts();
872 if (GA->isInterposable())
881 std::optional<TypeSize> AllocSize = AI->getAllocationSize(
DL);
882 if (!AllocSize || AllocSize->isScalable() ||
883 AllocSize->getFixedValue() > MaxSize)
889 if (!GV->hasDefinitiveInitializer() || !GV->isConstant())
893 if (InitSize > MaxSize)
899 }
while (!Worklist.
empty());
943 Idx = FirstNZIdx(GEPI);
957 if (!AllocTy || !AllocTy->
isSized())
960 uint64_t TyAllocSize =
DL.getTypeAllocSize(AllocTy).getFixedValue();
966 auto IsAllNonNegative = [&]() {
967 for (
unsigned i = Idx+1, e = GEPI->
getNumOperands(); i != e; ++i) {
969 if (
Known.isNonNegative())
1001 ConstantInt::get(GEPI->getOperand(Idx)->getType(), 0));
1006 if (GEPI->getParent() == MemI.
getParent() &&
1023 auto *Ptr =
SI.getPointerOperand();
1025 Ptr = GEPI->getOperand(0);
1032 const Value *GEPI0 = GEPI->getOperand(0);
1044Value *InstCombinerImpl::simplifyNonNullOperand(
Value *V,
bool UseProvenance,
1048 return Sel->getOperand(2);
1051 return Sel->getOperand(1);
1054 if (!
V->hasOneUse())
1071 if (UseProvenance ||
1072 (
GEP->isInBounds() &&
1074 if (
auto *Res = simplifyNonNullOperand(
GEP->getPointerOperand(),
1075 UseProvenance,
Depth + 1)) {
1076 replaceOperand(*
GEP, 0, Res);
1085 for (Use &U :
PHI->incoming_values()) {
1120 bool IsLoadCSE =
false;
1143 if (
Op->hasOneUse()) {
1166 Alignment,
SQ.getWithInstruction(
SI)) &&
1168 Alignment,
SQ.getWithInstruction(
SI))) {
1170 auto MaybeCastedLoadOperand = [&](
Value *
Op) {
1173 Op->getName() +
".cast");
1176 Value *LoadOp1 = MaybeCastedLoadOperand(
SI->getOperand(1));
1181 Value *LoadOp2 = MaybeCastedLoadOperand(
SI->getOperand(2));
1196 if (
Value *V = simplifyNonNullOperand(
Op,
true))
1202 if (
II->getIntrinsicID() == Intrinsic::protected_field_ptr) {
1203 std::vector<OperandBundleDef> DSBundle;
1213 NewLI->setOperand(0,
II->getOperand(0));
1217 F.getParent(), Intrinsic::ptrauth_auth, {});
1218 auto *LIInt =
Builder.CreatePtrToInt(NewLI,
Builder.getInt64Ty());
1253 auto *W =
E->getVectorOperand();
1259 if (!CI ||
IV->getNumIndices() != 1 || CI->getZExtValue() != *
IV->idx_begin())
1261 V =
IV->getAggregateOperand();
1267 auto *VT = V->getType();
1270 if (
DL.getTypeStoreSizeInBits(UT) !=
DL.getTypeStoreSizeInBits(VT)) {
1280 for (
const auto *EltT : ST->elements()) {
1281 if (EltT != UT->getElementType())
1311 if (!
SI.isUnordered())
1314 if (
SI.isElementwise())
1318 if (
SI.getPointerOperand()->isSwiftError())
1321 Value *V =
SI.getValueOperand();
1325 assert(!BC->getType()->isX86_AMXTy() &&
1326 "store to x86_amx* should not happen!");
1327 V = BC->getOperand(0);
1330 if (V->getType()->isX86_AMXTy())
1355 Value *V =
SI.getValueOperand();
1356 Type *
T = V->getType();
1358 if (!
T->isAggregateType())
1363 unsigned Count = ST->getNumElements();
1373 auto *SL =
DL.getStructLayout(ST);
1375 if (SL->hasPadding())
1378 const auto Align =
SI.getAlign();
1382 auto *Addr =
SI.getPointerOperand();
1384 AddrName +=
".repack";
1386 auto *IdxType =
DL.getIndexType(Addr->getType());
1387 for (
unsigned i = 0; i <
Count; i++) {
1403 auto NumElements = AT->getNumElements();
1404 if (NumElements == 1) {
1414 if (NumElements > IC.
CLOpts.maxarray_size)
1418 TypeSize EltSize =
DL.getTypeAllocSize(AT->getElementType());
1419 const auto Align =
SI.getAlign();
1423 auto *Addr =
SI.getPointerOperand();
1425 AddrName +=
".repack";
1428 auto *Zero = ConstantInt::get(IdxType, 0);
1431 for (
uint64_t i = 0; i < NumElements; i++) {
1432 Value *Indices[2] = {
1434 ConstantInt::get(IdxType, i),
1461 if (
A ==
B)
return true;
1481 Value *Val =
SI.getOperand(0);
1482 Value *Ptr =
SI.getOperand(1);
1498 if (!
SI.isUnordered())
return nullptr;
1507 if (
GEP->getOperand(0)->hasOneUse())
1523 for (
unsigned ScanInsts = 6; BBI !=
SI.getParent()->begin() && ScanInsts;
1528 if (BBI->isDebugOrPseudoInst()) {
1535 if (PrevSI->isUnordered() &&
1537 PrevSI->getValueOperand()->getType() ==
1538 SI.getValueOperand()->getType()) {
1555 assert(
SI.isUnordered() &&
"can't eliminate ordering operation");
1565 if (BBI->mayWriteToMemory() || BBI->mayReadFromMemory() || BBI->mayThrow())
1606 if (
Value *V = simplifyNonNullOperand(Ptr,
true))
1613 if (
II->getIntrinsicID() == Intrinsic::protected_field_ptr) {
1614 std::vector<OperandBundleDef> DSBundle;
1624 F.getParent(), Intrinsic::ptrauth_sign, {});
1625 auto *ValInt =
Builder.CreatePtrToInt(Val,
Builder.getInt64Ty());
1628 {ValInt,
Builder.getInt32( 2),
1649 if (!
SI.isUnordered())
1660 if (*PredIter == StoreBB)
1666 if (StoreBB == DestBB || OtherBB == DestBB)
1671 if (BBI == OtherBB->
begin())
1674 auto OtherStoreIsMergeable = [&](
StoreInst *OtherStore) ->
bool {
1676 OtherStore->getPointerOperand() !=
SI.getPointerOperand())
1679 auto *SIVTy =
SI.getValueOperand()->getType();
1680 auto *OSVTy = OtherStore->getValueOperand()->getType();
1682 !
SI.hasSameSpecialState(OtherStore))
1688 return !
SI.isElementwise() ||
1689 DL.getTypeStoreSize(SIVTy->getScalarType()) ==
1690 DL.getTypeStoreSize(OSVTy->getScalarType());
1699 while (BBI->isDebugOrPseudoInst()) {
1700 if (BBI==OtherBB->
begin())
1707 if (!OtherStoreIsMergeable(OtherStore))
1712 if (OtherBr->getSuccessor(0) != StoreBB &&
1713 OtherBr->getSuccessor(1) != StoreBB)
1722 if (OtherStoreIsMergeable(OtherStore))
1727 if (BBI->mayReadFromMemory() || BBI->mayThrow() ||
1728 BBI->mayWriteToMemory() || BBI == OtherBB->
begin())
1736 if (
I->mayReadFromMemory() ||
I->mayThrow() ||
I->mayWriteToMemory())
1747 if (MergedVal !=
SI.getValueOperand()) {
1751 Builder.SetInsertPoint(OtherStore);
1761 new StoreInst(MergedVal,
SI.getOperand(1),
SI.getProperties());
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static void addToWorklist(Instruction &I, SmallVector< Instruction *, 4 > &Worklist)
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 isOnlyCopiedFromConstantMemory(AAResults *AA, AllocaInst *V, MemTransferInst *&TheCopy, SmallVectorImpl< Instruction * > &ToDelete, unsigned MaxUsers)
isOnlyCopiedFromConstantMemory - Recursively walk the uses of a (derived) pointer to an alloca.
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 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 isObjectSizeLessThanOrEq(Value *V, uint64_t MaxSize, const DataLayout &DL)
This file provides the interface for the instcombine pass implementation.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
uint64_t IntrinsicInst * II
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]
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
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 std::optional< TypeSize > getAllocationSize(const DataLayout &DL) const
Get allocation size in bytes.
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.
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
LLVM_ABI 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; assumes that the block is well-formed.
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
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.
static LLVM_ABI Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
This is the shared class of boolean and integer constants.
This is an important base class in LLVM.
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.
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...
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
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.
StoreInst * CreateStore(Value *Val, Value *Ptr, bool isVolatile=false)
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="")
LLVM_ABI CallInst * CreateMemTransferInst(Intrinsic::ID IntrID, Value *Dst, MaybeAlign DstAlign, Value *Src, MaybeAlign SrcAlign, Value *Size, bool isVolatile=false, const AAMDNodes &AAInfo=AAMDNodes())
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)
const InstCombineCLOptions & CLOpts
bool mergeStoreIntoSuccessor(StoreInst &SI)
Try to transform: if () { *P = v1; } else { *P = v2 } or: *P = v1; if () { *P = v2; }...
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.
InstructionWorklist & Worklist
A worklist of the instructions that need to be simplified.
Instruction * InsertNewInstWith(Instruction *New, BasicBlock::iterator Old)
Same as InsertNewInstBefore, but also sets the debug loc.
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CtxI, unsigned Depth=0) const
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.
Value * getPointerOperand()
LoadStoreInstProperties getProperties() const
Returns the properties of this load instruction.
Align getAlign() const
Return the alignment of the access that is being performed.
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, const Instruction *MDFrom=nullptr)
bool contains(const_arg_type key) const
Check if the SetVector contains the given key.
bool insert(const value_type &X)
Insert a new element into the SetVector.
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.
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()
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.
bool isSized() const
Return true if it makes sense to take the size of this type.
bool isByteOrByteVectorTy() const
Return true if this is a byte type or a vector of byte types.
static LLVM_ABI Type * getIntFromByteType(Type *)
Returns an integer (vector of integer) type with the same size of a byte of the given byte (vector of...
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.
LLVM_ABI bool isScalableTy() const
Return true if this is a type whose size is a known multiple of vscale.
bool isIntegerTy() const
True if this is an instance of IntegerType.
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.
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< use_iterator > uses()
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
const ParentTy * getParent() const
self_iterator getIterator()
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Abstract Attribute helper functions.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
bool match(Val *V, const Pattern &P)
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
auto m_Undef()
Match an arbitrary undef constant.
LLVM_ABI bool isAvailable()
friend class Instruction
Iterator for Instructions in a `BasicBlock.
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.
detail::zippy< detail::zip_first, T, U, Args... > zip_equal(T &&t, U &&u, Args &&...args)
zip iterator that assumes that all iteratees have the same length.
@ Known
Known to have no common set bits.
LLVM_ABI Align getOrEnforceKnownAlignment(Value *V, MaybeAlign PrefAlign, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr)
Try to ensure that the alignment of V is at least PrefAlign bytes.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
@ Load
The value being inserted comes from a load (InsertElement only).
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 ...
LLVM_ABI MDNode * intersectAccessGroups(const Instruction *Inst1, const Instruction *Inst2)
Compute the access-group list of access groups that Inst1 and Inst2 are both in.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
auto reverse(ContainerTy &&C)
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 raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI 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.
LLVM_ABI bool isSafeToLoadUnconditionally(Value *V, Align Alignment, const APInt &Size, const SimplifyQuery &SQ, bool IgnoreFree=false)
Return true if we know that executing a load from this value cannot trap.
OperandBundleDefT< Value * > OperandBundleDef
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.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
DWARFExpression::Operation Op
PredIterator< BasicBlock, Value::user_iterator > pred_iterator
LLVM_ABI bool isDereferenceableAndAlignedPointer(const Value *V, Type *Ty, Align Alignment, const SimplifyQuery &Q, bool IgnoreFree=false)
Returns true if V is always a dereferenceable pointer with alignment greater or equal than requested.
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI bool isGuaranteedToTransferExecutionToSuccessor(const Instruction *I)
Return true if this function can prove that the instruction I will always transfer execution to one o...
auto pred_begin(const MachineBasicBlock *BB)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
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.