28using namespace PatternMatch;
30#define DEBUG_TYPE "instcombine"
32STATISTIC(NumDeadStore,
"Number of dead stores eliminated");
33STATISTIC(NumGlobalCopies,
"Number of allocas copied from constant global");
36 "instcombine-max-copied-from-constant-users",
cl::init(300),
37 cl::desc(
"Maximum users to visit in copy from constant transform"),
59 while (!Worklist.
empty()) {
61 if (!Visited.
insert(Elem).second)
66 const auto [
Value, IsOffset] = Elem;
68 auto *
I = cast<Instruction>(U.getUser());
70 if (
auto *LI = dyn_cast<LoadInst>(
I)) {
72 if (!LI->isSimple())
return false;
76 if (isa<PHINode, SelectInst>(
I)) {
83 if (isa<BitCastInst, AddrSpaceCastInst>(
I)) {
88 if (
auto *
GEP = dyn_cast<GetElementPtrInst>(
I)) {
95 if (
auto *Call = dyn_cast<CallBase>(
I)) {
98 if (Call->isCallee(&U))
101 unsigned DataOpNo = Call->getDataOperandNo(&U);
102 bool IsArgOperand = Call->isArgOperand(&U);
105 if (IsArgOperand && Call->isInAllocaArgument(DataOpNo))
111 bool NoCapture = Call->doesNotCapture(DataOpNo);
112 if ((Call->onlyReadsMemory() && (Call->use_empty() || NoCapture)) ||
113 (Call->onlyReadsMemory(DataOpNo) && NoCapture))
118 if (IsArgOperand && Call->isByValArgument(DataOpNo))
123 if (
I->isLifetimeStartOrEnd()) {
124 assert(
I->use_empty() &&
"Lifetime markers have no result to use!");
136 if (
MI->isVolatile())
141 if (U.getOperandNo() == 1)
145 if (TheCopy)
return false;
149 if (IsOffset)
return false;
152 if (U.getOperandNo() != 0)
return false;
205 if (
C->getValue().getActiveBits() <= 64) {
243class PointerReplacer {
246 : IC(IC), Root(Root), FromAS(SrcAS) {}
249 void replacePointer(
Value *V);
256 return I == &Root || Worklist.contains(
I);
260 unsigned FromAS)
const {
261 const auto *ASC = dyn_cast<AddrSpaceCastInst>(
I);
264 unsigned ToAS = ASC->getDestAddressSpace();
265 return (FromAS == ToAS) || IC.isValidAddrSpaceCast(FromAS, ToAS);
277bool PointerReplacer::collectUsers() {
278 if (!collectUsersRecursive(Root))
287bool PointerReplacer::collectUsersRecursive(
Instruction &
I) {
288 for (
auto *U :
I.users()) {
289 auto *Inst = cast<Instruction>(&*U);
290 if (
auto *Load = dyn_cast<LoadInst>(Inst)) {
291 if (
Load->isVolatile())
293 Worklist.insert(Load);
294 }
else if (
auto *
PHI = dyn_cast<PHINode>(Inst)) {
297 [](
Value *V) { return !isa<Instruction>(V); }))
304 return !isAvailable(cast<Instruction>(V));
306 ValuesToRevisit.insert(Inst);
310 Worklist.insert(
PHI);
311 if (!collectUsersRecursive(*
PHI))
313 }
else if (
auto *SI = dyn_cast<SelectInst>(Inst)) {
314 if (!isa<Instruction>(
SI->getTrueValue()) ||
315 !isa<Instruction>(
SI->getFalseValue()))
320 ValuesToRevisit.insert(Inst);
324 if (!collectUsersRecursive(*SI))
326 }
else if (isa<GetElementPtrInst>(Inst)) {
327 Worklist.insert(Inst);
328 if (!collectUsersRecursive(*Inst))
330 }
else if (
auto *
MI = dyn_cast<MemTransferInst>(Inst)) {
331 if (
MI->isVolatile())
333 Worklist.insert(Inst);
334 }
else if (isEqualOrValidAddrSpaceCast(Inst, FromAS)) {
335 Worklist.insert(Inst);
336 if (!collectUsersRecursive(*Inst))
338 }
else if (Inst->isLifetimeStartOrEnd()) {
343 LLVM_DEBUG(
dbgs() <<
"Cannot handle pointer user: " << *U <<
'\n');
351Value *PointerReplacer::getReplacement(
Value *V) {
return WorkMap.lookup(V); }
354 if (getReplacement(
I))
357 if (
auto *LT = dyn_cast<LoadInst>(
I)) {
358 auto *
V = getReplacement(
LT->getPointerOperand());
359 assert(V &&
"Operand not replaced");
360 auto *NewI =
new LoadInst(
LT->getType(), V,
"",
LT->isVolatile(),
361 LT->getAlign(),
LT->getOrdering(),
362 LT->getSyncScopeID());
366 IC.InsertNewInstWith(NewI,
LT->getIterator());
367 IC.replaceInstUsesWith(*LT, NewI);
369 }
else if (
auto *
PHI = dyn_cast<PHINode>(
I)) {
370 Type *NewTy = getReplacement(
PHI->getIncomingValue(0))->getType();
372 PHI->getName(),
PHI->getIterator());
373 for (
unsigned int I = 0;
I <
PHI->getNumIncomingValues(); ++
I)
374 NewPHI->addIncoming(getReplacement(
PHI->getIncomingValue(
I)),
375 PHI->getIncomingBlock(
I));
376 WorkMap[
PHI] = NewPHI;
377 }
else if (
auto *
GEP = dyn_cast<GetElementPtrInst>(
I)) {
378 auto *
V = getReplacement(
GEP->getPointerOperand());
379 assert(V &&
"Operand not replaced");
383 IC.InsertNewInstWith(NewI,
GEP->getIterator());
385 NewI->setNoWrapFlags(
GEP->getNoWrapFlags());
387 }
else if (
auto *SI = dyn_cast<SelectInst>(
I)) {
388 Value *TrueValue =
SI->getTrueValue();
389 Value *FalseValue =
SI->getFalseValue();
390 if (
Value *Replacement = getReplacement(TrueValue))
391 TrueValue = Replacement;
392 if (
Value *Replacement = getReplacement(FalseValue))
393 FalseValue = Replacement;
395 SI->getName(),
nullptr, SI);
396 IC.InsertNewInstWith(NewSI,
SI->getIterator());
399 }
else if (
auto *MemCpy = dyn_cast<MemTransferInst>(
I)) {
400 auto *DestV = MemCpy->getRawDest();
401 auto *SrcV = MemCpy->getRawSource();
403 if (
auto *DestReplace = getReplacement(DestV))
405 if (
auto *SrcReplace = getReplacement(SrcV))
408 IC.Builder.SetInsertPoint(MemCpy);
409 auto *NewI = IC.Builder.CreateMemTransferInst(
410 MemCpy->getIntrinsicID(), DestV, MemCpy->getDestAlign(), SrcV,
411 MemCpy->getSourceAlign(), MemCpy->getLength(), MemCpy->isVolatile());
412 AAMDNodes AAMD = MemCpy->getAAMetadata();
414 NewI->setAAMetadata(AAMD);
416 IC.eraseInstFromFunction(*MemCpy);
417 WorkMap[MemCpy] = NewI;
418 }
else if (
auto *ASC = dyn_cast<AddrSpaceCastInst>(
I)) {
419 auto *
V = getReplacement(ASC->getPointerOperand());
420 assert(V &&
"Operand not replaced");
421 assert(isEqualOrValidAddrSpaceCast(
422 ASC,
V->getType()->getPointerAddressSpace()) &&
423 "Invalid address space cast!");
425 if (
V->getType()->getPointerAddressSpace() !=
426 ASC->getType()->getPointerAddressSpace()) {
429 IC.InsertNewInstWith(NewI, ASC->getIterator());
440void PointerReplacer::replacePointer(
Value *V) {
442 auto *PT = cast<PointerType>(Root.getType());
443 auto *
NT = cast<PointerType>(
V->getType());
444 assert(PT != NT &&
"Invalid usage");
471 if (FirstInst != &AI) {
475 AllocaInst *EntryAI = dyn_cast<AllocaInst>(FirstInst);
501 Value *TheSrc = Copy->getSource();
504 TheSrc, AllocaAlign,
DL, &AI, &
AC, &
DT);
505 if (AllocaAlign <= SourceAlign &&
507 !isa<Instruction>(TheSrc)) {
510 LLVM_DEBUG(
dbgs() <<
"Found alloca equal to global: " << AI <<
'\n');
523 PointerReplacer PtrReplacer(*
this, AI, SrcAddrSpace);
524 if (PtrReplacer.collectUsers()) {
528 PtrReplacer.replacePointer(TheSrc);
554 const Twine &Suffix) {
556 "can't fold an atomic load to requested type");
572 "can't fold an atomic store of requested type");
574 Value *
Ptr = SI.getPointerOperand();
576 SI.getAllMetadata(MD);
580 NewStore->
setAtomic(SI.getOrdering(), SI.getSyncScopeID());
581 for (
const auto &MDPair : MD) {
582 unsigned ID = MDPair.first;
593 case LLVMContext::MD_dbg:
594 case LLVMContext::MD_DIAssignID:
595 case LLVMContext::MD_tbaa:
596 case LLVMContext::MD_prof:
597 case LLVMContext::MD_fpmath:
598 case LLVMContext::MD_tbaa_struct:
599 case LLVMContext::MD_alias_scope:
600 case LLVMContext::MD_noalias:
601 case LLVMContext::MD_nontemporal:
602 case LLVMContext::MD_mem_parallel_loop_access:
603 case LLVMContext::MD_access_group:
607 case LLVMContext::MD_invariant_load:
608 case LLVMContext::MD_nonnull:
609 case LLVMContext::MD_noundef:
610 case LLVMContext::MD_range:
611 case LLVMContext::MD_align:
612 case LLVMContext::MD_dereferenceable:
613 case LLVMContext::MD_dereferenceable_or_null:
643 if (!Load.isUnordered())
646 if (Load.use_empty())
650 if (Load.getPointerOperand()->isSwiftError())
656 if (Load.hasOneUse()) {
659 Type *LoadTy = Load.getType();
660 if (
auto *BC = dyn_cast<BitCastInst>(Load.user_back())) {
662 if (BC->getType()->isX86_AMXTy())
666 if (
auto *CastUser = dyn_cast<CastInst>(Load.user_back())) {
667 Type *DestTy = CastUser->getDestTy();
691 if (!
T->isAggregateType())
696 if (
auto *ST = dyn_cast<StructType>(
T)) {
698 auto NumElements = ST->getNumElements();
699 if (NumElements == 1) {
710 auto *SL =
DL.getStructLayout(ST);
713 if (SL->getSizeInBits().isScalable())
716 if (SL->hasPadding())
722 auto *Zero = ConstantInt::get(IdxType, 0);
725 for (
unsigned i = 0; i < NumElements; i++) {
726 Value *Indices[2] = {
728 ConstantInt::get(IdxType, i),
733 ST->getElementType(i),
Ptr,
744 if (
auto *AT = dyn_cast<ArrayType>(
T)) {
745 auto *ET = AT->getElementType();
746 auto NumElements = AT->getNumElements();
747 if (NumElements == 1) {
767 auto *Zero = ConstantInt::get(IdxType, 0);
771 for (
uint64_t i = 0; i < NumElements; i++) {
772 Value *Indices[2] = {
774 ConstantInt::get(IdxType, i),
780 EltAlign,
Name +
".unpack");
806 P =
P->stripPointerCasts();
817 if (
PHINode *PN = dyn_cast<PHINode>(
P)) {
823 if (GA->isInterposable())
832 if (!AI->getAllocatedType()->isSized())
835 ConstantInt *CS = dyn_cast<ConstantInt>(AI->getArraySize());
839 TypeSize TS =
DL.getTypeAllocSize(AI->getAllocatedType());
851 if (!GV->hasDefinitiveInitializer() || !GV->isConstant())
854 uint64_t InitSize =
DL.getTypeAllocSize(GV->getValueType());
855 if (InitSize > MaxSize)
861 }
while (!Worklist.
empty());
893 if (
const ConstantInt *CI = dyn_cast<ConstantInt>(V))
905 Idx = FirstNZIdx(GEPI);
919 if (!AllocTy || !AllocTy->
isSized())
922 uint64_t TyAllocSize =
DL.getTypeAllocSize(AllocTy).getFixedValue();
928 auto IsAllNonNegative = [&]() {
963 ConstantInt::get(GEPI->getOperand(
Idx)->getType(), 0));
976 auto *
Ptr = SI.getPointerOperand();
978 Ptr = GEPI->getOperand(0);
979 return (isa<ConstantPointerNull>(
Ptr) &&
985 const Value *GEPI0 = GEPI->getOperand(0);
986 if (isa<ConstantPointerNull>(GEPI0) &&
990 if (isa<UndefValue>(
Op) ||
991 (isa<ConstantPointerNull>(
Op) &&
1016 bool IsLoadCSE =
false;
1039 if (
Op->hasOneUse()) {
1054 Alignment,
DL, SI) &&
1056 Alignment,
DL, SI)) {
1059 SI->getOperand(1)->getName() +
".val");
1062 SI->getOperand(2)->getName() +
".val");
1066 V2->setAlignment(Alignment);
1072 if (isa<ConstantPointerNull>(SI->getOperand(1)) &&
1078 if (isa<ConstantPointerNull>(SI->getOperand(2)) &&
1103 while (
auto *
IV = dyn_cast<InsertValueInst>(V)) {
1104 auto *E = dyn_cast<ExtractElementInst>(
IV->getInsertedValueOperand());
1107 auto *W = E->getVectorOperand();
1112 auto *CI = dyn_cast<ConstantInt>(E->getIndexOperand());
1113 if (!CI ||
IV->getNumIndices() != 1 || CI->getZExtValue() != *
IV->idx_begin())
1115 V =
IV->getAggregateOperand();
1120 auto *UT = cast<VectorType>(U->getType());
1121 auto *VT = V->getType();
1124 if (
DL.getTypeStoreSizeInBits(UT) !=
DL.getTypeStoreSizeInBits(VT)) {
1127 if (
auto *AT = dyn_cast<ArrayType>(VT)) {
1128 if (AT->getNumElements() != cast<FixedVectorType>(UT)->getNumElements())
1131 auto *ST = cast<StructType>(VT);
1132 if (ST->getNumElements() != cast<FixedVectorType>(UT)->getNumElements())
1134 for (
const auto *EltT : ST->elements()) {
1135 if (EltT != UT->getElementType())
1165 if (!SI.isUnordered())
1169 if (SI.getPointerOperand()->isSwiftError())
1172 Value *V = SI.getValueOperand();
1175 if (
auto *BC = dyn_cast<BitCastInst>(V)) {
1176 assert(!BC->getType()->isX86_AMXTy() &&
1177 "store to x86_amx* should not happen!");
1178 V = BC->getOperand(0);
1181 if (V->getType()->isX86_AMXTy())
1206 Value *V = SI.getValueOperand();
1207 Type *
T = V->getType();
1209 if (!
T->isAggregateType())
1212 if (
auto *ST = dyn_cast<StructType>(
T)) {
1214 unsigned Count = ST->getNumElements();
1224 auto *SL =
DL.getStructLayout(ST);
1227 if (SL->getSizeInBits().isScalable())
1230 if (SL->hasPadding())
1233 const auto Align = SI.getAlign();
1237 auto *
Addr = SI.getPointerOperand();
1239 AddrName +=
".repack";
1242 auto *Zero = ConstantInt::get(IdxType, 0);
1243 for (
unsigned i = 0; i < Count; i++) {
1244 Value *Indices[2] = {
1246 ConstantInt::get(IdxType, i),
1259 if (
auto *AT = dyn_cast<ArrayType>(
T)) {
1261 auto NumElements = AT->getNumElements();
1262 if (NumElements == 1) {
1276 TypeSize EltSize =
DL.getTypeAllocSize(AT->getElementType());
1277 const auto Align = SI.getAlign();
1281 auto *
Addr = SI.getPointerOperand();
1283 AddrName +=
".repack";
1286 auto *Zero = ConstantInt::get(IdxType, 0);
1289 for (
uint64_t i = 0; i < NumElements; i++) {
1290 Value *Indices[2] = {
1292 ConstantInt::get(IdxType, i),
1319 if (
A ==
B)
return true;
1326 if (isa<BinaryOperator>(
A) ||
1329 isa<GetElementPtrInst>(
A))
1331 if (cast<Instruction>(
A)->isIdenticalToWhenDefined(BI))
1339 Value *Val = SI.getOperand(0);
1356 if (!SI.isUnordered())
return nullptr;
1360 if (
Ptr->hasOneUse()) {
1361 if (isa<AllocaInst>(
Ptr))
1364 if (isa<AllocaInst>(
GEP->getOperand(0))) {
1365 if (
GEP->getOperand(0)->hasOneUse())
1381 for (
unsigned ScanInsts = 6; BBI != SI.getParent()->begin() && ScanInsts;
1386 if (BBI->isDebugOrPseudoInst()) {
1391 if (
StoreInst *PrevSI = dyn_cast<StoreInst>(BBI)) {
1393 if (PrevSI->isUnordered() &&
1395 PrevSI->getValueOperand()->getType() ==
1396 SI.getValueOperand()->getType()) {
1411 if (
LoadInst *LI = dyn_cast<LoadInst>(BBI)) {
1413 assert(SI.isUnordered() &&
"can't eliminate ordering operation");
1423 if (BBI->mayWriteToMemory() || BBI->mayReadFromMemory() || BBI->mayThrow())
1430 if (!isa<PoisonValue>(Val))
1436 if (isa<UndefValue>(
Ptr)) {
1452 if (isa<UndefValue>(Val))
1464 if (!SI.isUnordered())
1475 if (*PredIter == StoreBB)
1481 if (StoreBB == DestBB || OtherBB == DestBB)
1486 BranchInst *OtherBr = dyn_cast<BranchInst>(BBI);
1487 if (!OtherBr || BBI == OtherBB->
begin())
1490 auto OtherStoreIsMergeable = [&](
StoreInst *OtherStore) ->
bool {
1492 OtherStore->getPointerOperand() != SI.getPointerOperand())
1495 auto *SIVTy = SI.getValueOperand()->getType();
1496 auto *OSVTy = OtherStore->getValueOperand()->getType();
1498 SI.hasSameSpecialState(OtherStore);
1507 while (BBI->isDebugOrPseudoInst()) {
1508 if (BBI==OtherBB->
begin())
1514 OtherStore = dyn_cast<StoreInst>(BBI);
1515 if (!OtherStoreIsMergeable(OtherStore))
1529 OtherStore = dyn_cast<StoreInst>(BBI);
1530 if (OtherStoreIsMergeable(OtherStore))
1535 if (BBI->mayReadFromMemory() || BBI->mayThrow() ||
1536 BBI->mayWriteToMemory() || BBI == OtherBB->
begin())
1544 if (
I->mayReadFromMemory() ||
I->mayThrow() ||
I->mayWriteToMemory())
1554 if (MergedVal != SI.getValueOperand()) {
1557 PN->
addIncoming(SI.getValueOperand(), SI.getParent());
1568 new StoreInst(MergedVal, SI.getOperand(1), SI.isVolatile(), SI.getAlign(),
1569 SI.getOrdering(), SI.getSyncScopeID());
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.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines generic set operations that may be used on set's of different types,...
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]
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.
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.
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.
const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
bool hasNPredecessors(unsigned N) const
Return true if this block has exactly N predecessors.
const Instruction * getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
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 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 Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
static DILocation * getMergedLocation(DILocation *LocA, DILocation *LocB)
When two instructions are combined into a single instruction we also need to combine the original loc...
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
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...
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
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 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...
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)
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.
InstructionWorklist & Worklist
A worklist of the instructions that need to be simplified.
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, unsigned Depth, const Instruction *CxtI) const
void push(Instruction *I)
Push the instruction onto the worklist stack.
Instruction * clone() const
Create a copy of 'this' instruction that is identical in all ways except the following:
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.
void setAAMetadata(const AAMDNodes &N)
Sets the AA metadata on this instruction from the AAMDNodes structure.
bool isAtomic() const LLVM_READONLY
Return true if this instruction has an AtomicOrdering of unordered or higher.
const Function * getFunction() const
Return the function this instruction belongs to.
BasicBlock * getSuccessor(unsigned Idx) const LLVM_READONLY
Return the specified successor. This instruction must be a terminator.
void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
AAMDNodes getAAMetadata() const
Returns the AA metadata for this instruction.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
void moveBefore(Instruction *MovePos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
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 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)
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.
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.
unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
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.
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.
static IntegerType * getInt32Ty(LLVMContext &C)
static IntegerType * getInt64Ty(LLVMContext &C)
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.
void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
iterator_range< use_iterator > uses()
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)
This is an optimization pass for GlobalISel generic memory operations.
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.
void copyMetadataForLoad(LoadInst &Dest, const LoadInst &Source)
Copy the metadata from the source instruction to the destination (the replacement for the source inst...
bool set_is_subset(const S1Ty &S1, const S2Ty &S2)
set_is_subset(A, B) - Return true iff A in B
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
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 ...
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
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)
bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
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.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool replaceAllDbgUsesWith(Instruction &From, Value &To, Instruction &DomPoint, DominatorTree &DT)
Point debug users of From to To or salvage them.
Value * simplifyLoadInst(LoadInst *LI, Value *PtrOp, const SimplifyQuery &Q)
Given a load instruction and its pointer operand, fold the result or return null.
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...
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