41 "Disable metadata propagation fixes discovered through Issue #147390"));
46 : InsertAt(InsertAtEnd ? InsertAtEnd->
end() : InstListType::iterator()) {}
52 if (InstListType::iterator InsertIt = InsertBefore; InsertIt.isValid()) {
54 assert(BB &&
"Instruction to insert before is not in a basic block!");
55 insertInto(BB, InsertBefore);
71 if (isUsedByMetadata())
78 updateDIAssignIDMapping(
nullptr);
92 return getModule()->getDataLayout();
97 handleMarkerRemoval();
99 getParent()->getInstList().remove(getIterator());
106 DebugMarker->removeMarker();
110 handleMarkerRemoval();
111 return getParent()->getInstList().erase(getIterator());
117 insertBefore(*InsertPos->getParent(), InsertPos);
131 DestParent->getInstList().
insertAfter(InsertPos,
this);
137 assert((It == ParentBB->
end() || It->getParent() == ParentBB) &&
138 "It not in ParentBB");
139 insertBefore(*ParentBB, It);
140 return getIterator();
144 InstListType::iterator InsertPos) {
147 BB.getInstList().
insert(InsertPos,
this);
152 bool InsertAtHead = InsertPos.getHeadBit();
155 if (SrcMarker && !SrcMarker->
empty()) {
168 adoptDbgRecords(&BB, InsertPos,
false);
176 getParent()->flushTerminatorDbgRecords();
182 moveBeforeImpl(*MovePos->getParent(), MovePos,
false);
186 moveBeforeImpl(*MovePos->getParent(), MovePos,
true);
193 NextIt.setHeadBit(
true);
194 moveBeforeImpl(*MovePos->
getParent(), NextIt,
false);
200 MovePos.setHeadBit(
true);
201 moveBeforeImpl(*MovePos->getParent(), MovePos,
false);
208 NextIt.setHeadBit(
true);
209 moveBeforeImpl(*MovePos->
getParent(), NextIt,
true);
213 moveBeforeImpl(BB,
I,
false);
217 InstListType::iterator
I) {
218 moveBeforeImpl(BB,
I,
true);
221void Instruction::moveBeforeImpl(
BasicBlock &BB, InstListType::iterator
I,
224 bool InsertAtHead =
I.getHeadBit();
228 if (DebugMarker && !Preserve) {
229 if (
I != this->getIterator() || InsertAtHead) {
232 handleMarkerRemoval();
245 if (!InsertAtHead && NextMarker && !NextMarker->
empty()) {
246 adoptDbgRecords(&BB,
I,
false);
251 getParent()->flushTerminatorDbgRecords();
255 const Instruction *From, std::optional<DbgRecord::self_iterator> FromHere,
257 if (!From->DebugMarker)
263 return DebugMarker->cloneDebugInfoFrom(From->DebugMarker, FromHere,
267std::optional<DbgRecord::self_iterator>
286 auto ReleaseTrailingDbgRecords = [BB, It, SrcMarker]() {
287 if (BB->
end() == It) {
294 ReleaseTrailingDbgRecords();
301 if (DebugMarker || It == BB->
end()) {
304 DebugMarker->absorbDebugValues(*SrcMarker, InsertAtHead);
315 ReleaseTrailingDbgRecords();
320 DebugMarker = SrcMarker;
322 It->DebugMarker =
nullptr;
328 DebugMarker->dropDbgRecords();
332 DebugMarker->dropOneDbgRecord(DVR);
337 "instructions without BB parents have no order");
339 "cross-BB instruction order comparison");
342 return Order <
Other->Order;
346 assert(!
getType()->isVoidTy() &&
"Instruction must define result");
353 InsertBB =
II->getNormalDest();
360 assert(!isTerminator() &&
"Only invoke/callbr terminators return value");
362 InsertPt = std::next(getIterator());
366 InsertPt.setHeadBit(
true);
371 if (InsertPt == InsertBB->
end())
377 return any_of(operands(), [](
const Value *V) {
return V->hasOneUser(); });
382 Inst->setHasNoUnsignedWrap(b);
389 Inst->setHasNoSignedWrap(b);
406 return Inst->hasNoUnsignedWrap();
413 return Inst->hasNoSignedWrap();
429 case Instruction::Add:
430 case Instruction::Sub:
431 case Instruction::Mul:
432 case Instruction::Shl:
437 case Instruction::UDiv:
438 case Instruction::SDiv:
439 case Instruction::AShr:
440 case Instruction::LShr:
444 case Instruction::Or:
448 case Instruction::GetElementPtr:
452 case Instruction::UIToFP:
453 case Instruction::ZExt:
457 case Instruction::Trunc:
462 case Instruction::ICmp:
466 case Instruction::AddrSpaceCast:
470 case Instruction::Call: {
472 switch (
II->getIntrinsicID()) {
473 case Intrinsic::ctlz:
474 case Intrinsic::cttz:
489 assert(!hasPoisonGeneratingFlags() &&
"must be kept in sync");
494 [
this](
unsigned ID) {
return hasMetadata(ID); });
500 if (!hasMetadata(LLVMContext::MD_loop))
504 MDNode *LoopMD = getMetadata(LLVMContext::MD_loop);
528 return Attrs.hasAttribute(Attribute::Range) ||
529 Attrs.hasAttribute(Attribute::Alignment) ||
530 Attrs.hasAttribute(Attribute::NonNull) ||
531 Attrs.hasAttribute(Attribute::NoFPClass);
533 if (HasPoisonGeneratingAttributes(CB->getRetAttributes()))
535 for (
unsigned ArgNo = 0; ArgNo < CB->arg_size(); ArgNo++)
536 if (HasPoisonGeneratingAttributes(CB->getParamAttributes(ArgNo)))
549 CB->removeRetAttrs(AM);
550 for (
unsigned ArgNo = 0; ArgNo < CB->arg_size(); ArgNo++)
551 CB->removeParamAttrs(ArgNo, AM);
553 assert(!hasPoisonGeneratingAttributes() &&
"must be kept in sync");
558 dropUnknownNonDebugMetadata(KnownIDs);
569 AttributeFuncs::getUBImplyingAttributes();
570 for (
unsigned ArgNo = 0; ArgNo < CB->arg_size(); ArgNo++)
571 CB->removeParamAttrs(ArgNo, UBImplyingAttributes);
572 CB->removeRetAttrs(UBImplyingAttributes);
583 static const unsigned KnownIDs[] = {
584 LLVMContext::MD_annotation, LLVMContext::MD_range,
585 LLVMContext::MD_nonnull, LLVMContext::MD_align,
586 LLVMContext::MD_fpmath, LLVMContext::MD_prof,
587 LLVMContext::MD_mem_cache_hint, LLVMContext::MD_nofpclass};
589 KeepIDs.
reserve(
Keep.size() + std::size(KnownIDs));
592 dropUBImplyingAttrsAndUnknownMetadata(KeepIDs);
601 for (
unsigned ArgNo = 0; ArgNo < CB->arg_size(); ArgNo++)
602 if (CB->isPassingUndefUB(ArgNo))
604 return CB->hasRetAttr(Attribute::NoUndef) ||
605 CB->hasRetAttr(Attribute::Dereferenceable) ||
606 CB->hasRetAttr(Attribute::DereferenceableOrNull);
715 copyFastMathFlags(
I->getFastMathFlags());
722 setHasNoSignedWrap(
OB->hasNoSignedWrap());
723 setHasNoUnsignedWrap(
OB->hasNoUnsignedWrap());
729 setHasNoSignedWrap(TI->hasNoSignedWrap());
730 setHasNoUnsignedWrap(TI->hasNoUnsignedWrap());
737 setIsExact(PE->isExact());
741 DestPD->setIsDisjoint(SrcPD->isDisjoint());
746 copyFastMathFlags(
FP->getFastMathFlags());
750 DestGEP->setNoWrapFlags(SrcGEP->getNoWrapFlags() |
751 DestGEP->getNoWrapFlags());
755 setNonNeg(NNI->hasNonNeg());
759 DestICmp->setSameSign(SrcICmp->hasSameSign());
763 assert(DestASC->getSrcAddressSpace() == SrcASC->getSrcAddressSpace() &&
764 "nonull flag cannot be safely preserved with different source "
766 DestASC->setNonNull(SrcASC->hasNonNull());
787 setIsExact(isExact() && PE->isExact());
791 DestPD->setIsDisjoint(DestPD->isDisjoint() && SrcPD->isDisjoint());
796 FM &=
FP->getFastMathFlags();
797 copyFastMathFlags(FM);
803 DestGEP->setNoWrapFlags(SrcGEP->getNoWrapFlags() &
804 DestGEP->getNoWrapFlags());
808 setNonNeg(hasNonNeg() && NNI->hasNonNeg());
812 DestICmp->setSameSign(DestICmp->hasSameSign() && SrcICmp->hasSameSign());
816 assert(DestASC->getSrcAddressSpace() == SrcASC->getSrcAddressSpace() &&
817 "nonull flag cannot be safely preserved with different source "
819 DestASC->setNonNull(DestASC->hasNonNull() && SrcASC->hasNonNull());
827 case Ret:
return "ret";
828 case UncondBr:
return "br";
829 case CondBr:
return "br";
830 case Switch:
return "switch";
831 case IndirectBr:
return "indirectbr";
832 case Invoke:
return "invoke";
833 case Resume:
return "resume";
834 case Unreachable:
return "unreachable";
835 case CleanupRet:
return "cleanupret";
836 case CatchRet:
return "catchret";
837 case CatchPad:
return "catchpad";
838 case CatchSwitch:
return "catchswitch";
839 case CallBr:
return "callbr";
842 case FNeg:
return "fneg";
845 case Add:
return "add";
846 case FAdd:
return "fadd";
847 case Sub:
return "sub";
848 case FSub:
return "fsub";
849 case Mul:
return "mul";
850 case FMul:
return "fmul";
851 case UDiv:
return "udiv";
852 case SDiv:
return "sdiv";
853 case FDiv:
return "fdiv";
854 case URem:
return "urem";
855 case SRem:
return "srem";
856 case FRem:
return "frem";
859 case And:
return "and";
860 case Or :
return "or";
861 case Xor:
return "xor";
864 case Alloca:
return "alloca";
865 case Load:
return "load";
866 case Store:
return "store";
867 case AtomicCmpXchg:
return "cmpxchg";
868 case AtomicRMW:
return "atomicrmw";
869 case Fence:
return "fence";
870 case GetElementPtr:
return "getelementptr";
873 case Trunc:
return "trunc";
874 case ZExt:
return "zext";
875 case SExt:
return "sext";
876 case FPTrunc:
return "fptrunc";
877 case FPExt:
return "fpext";
878 case FPToUI:
return "fptoui";
879 case FPToSI:
return "fptosi";
880 case UIToFP:
return "uitofp";
881 case SIToFP:
return "sitofp";
882 case IntToPtr:
return "inttoptr";
883 case PtrToAddr:
return "ptrtoaddr";
884 case PtrToInt:
return "ptrtoint";
885 case BitCast:
return "bitcast";
886 case AddrSpaceCast:
return "addrspacecast";
889 case ICmp:
return "icmp";
890 case FCmp:
return "fcmp";
891 case PHI:
return "phi";
892 case Select:
return "select";
893 case Call:
return "call";
894 case Shl:
return "shl";
895 case LShr:
return "lshr";
896 case AShr:
return "ashr";
897 case VAArg:
return "va_arg";
898 case ExtractElement:
return "extractelement";
899 case InsertElement:
return "insertelement";
900 case ShuffleVector:
return "shufflevector";
901 case ExtractValue:
return "extractvalue";
902 case InsertValue:
return "insertvalue";
903 case LandingPad:
return "landingpad";
904 case CleanupPad:
return "cleanuppad";
905 case Freeze:
return "freeze";
906 case BitInsert:
return "bitinsert";
907 case BitExtract:
return "bitextract";
909 default:
return "<Invalid operator> ";
917 bool IgnoreAlignment,
918 bool IntersectAttrs)
const {
919 const auto *
I1 =
this;
921 "Can not compare special state of different instructions");
923 auto CheckAttrsSame = [IntersectAttrs](
const CallBase *CB0,
925 return IntersectAttrs
927 .intersectWith(CB0->
getContext(), CB1->getAttributes())
933 return AI->getAllocatedType() ==
cast<AllocaInst>(I2)->getAllocatedType() &&
951 return CI->getPredicate() ==
cast<CmpInst>(I2)->getPredicate();
967 if (Case1.getCaseValue() != Case2.getCaseValue())
983 CXI->getSuccessOrdering() ==
985 CXI->getFailureOrdering() ==
987 CXI->getSyncScopeID() ==
998 return SVI->getShuffleMask() ==
1001 return GEP->getSourceElementType() ==
1008 return isIdenticalToWhenDefined(
I) &&
1009 SubclassOptionalData ==
I->SubclassOptionalData;
1013 bool IntersectAttrs)
const {
1015 getNumOperands() !=
I->getNumOperands() ||
getType() !=
I->getType())
1019 if (getNumOperands() == 0 &&
I->getNumOperands() == 0)
1020 return this->hasSameSpecialState(
I,
false,
1025 if (!
equal(operands(),
I->operands()))
1034 return this->hasSameSpecialState(
I,
false,
1041 unsigned flags)
const {
1042 bool IgnoreAlignment = flags & CompareIgnoringAlignment;
1043 bool UseScalarTypes = flags & CompareUsingScalarTypes;
1044 bool IntersectAttrs = flags & CompareUsingIntersectedAttrs;
1045 bool CheckCallTargets = flags & CompareCallTargets;
1048 getNumOperands() !=
I->getNumOperands() ||
1050 getType()->getScalarType() !=
I->getType()->getScalarType() :
1056 for (
unsigned i = 0, e = getNumOperands(); i !=
e; ++i)
1057 if (UseScalarTypes ?
1058 getOperand(i)->
getType()->getScalarType() !=
1059 I->getOperand(i)->getType()->getScalarType() :
1060 getOperand(i)->
getType() !=
I->getOperand(i)->getType())
1063 if (CheckCallTargets)
1068 return this->hasSameSpecialState(
I, IgnoreAlignment, IntersectAttrs);
1072 for (
const Use &U : uses()) {
1078 if (
I->getParent() != BB)
1090 auto GetEffects = [](ModRefInfo BaseMR, AtomicOrdering
Ordering,
1106 case Instruction::VAArg:
1108 case Instruction::CatchPad:
1109 case Instruction::CatchRet:
1110 case Instruction::Fence:
1112 case Instruction::Call:
1113 case Instruction::Invoke:
1114 case Instruction::CallBr:
1116 case Instruction::Load: {
1118 return GetEffects(
ModRefInfo::Ref, LI->getOrdering(), LI->isVolatile());
1120 case Instruction::Store: {
1124 case Instruction::AtomicRMW: {
1129 case Instruction::AtomicCmpXchg: {
1143 default:
return false;
1144 case Instruction::VAArg:
1145 case Instruction::Load:
1146 case Instruction::Fence:
1147 case Instruction::AtomicCmpXchg:
1148 case Instruction::AtomicRMW:
1149 case Instruction::CatchPad:
1150 case Instruction::CatchRet:
1152 case Instruction::Call:
1153 case Instruction::Invoke:
1154 case Instruction::CallBr:
1156 case Instruction::Store:
1163 default:
return false;
1164 case Instruction::Fence:
1165 case Instruction::Store:
1166 case Instruction::VAArg:
1167 case Instruction::AtomicCmpXchg:
1168 case Instruction::AtomicRMW:
1169 case Instruction::CatchPad:
1170 case Instruction::CatchRet:
1172 case Instruction::Call:
1173 case Instruction::Invoke:
1174 case Instruction::CallBr:
1176 case Instruction::Load:
1185 case Instruction::AtomicCmpXchg:
1186 case Instruction::AtomicRMW:
1187 case Instruction::Fence:
1189 case Instruction::Load:
1191 case Instruction::Store:
1201 case Instruction::AtomicCmpXchg:
1202 case Instruction::AtomicRMW:
1203 case Instruction::Load:
1213 case Instruction::AtomicCmpXchg:
1214 case Instruction::AtomicRMW:
1215 case Instruction::Store:
1224 case Instruction::AtomicRMW:
1226 case Instruction::Store:
1228 case Instruction::Load:
1230 case Instruction::AtomicCmpXchg:
1232 case Instruction::Call:
1233 case Instruction::Invoke:
1237 return MI->isVolatile();
1238 switch (
II->getIntrinsicID()) {
1240 case Intrinsic::matrix_column_major_load:
1242 case Intrinsic::matrix_column_major_store:
1258 case Instruction::Fence: {
1263 case Instruction::AtomicRMW:
1264 case Instruction::AtomicCmpXchg:
1266 case Instruction::Store:
1268 case Instruction::Load:
1270 case Instruction::Call:
1271 case Instruction::Invoke:
1272 case Instruction::CallBr:
1279 case Instruction::Store:
1281 case Instruction::Load:
1282 case Instruction::AtomicRMW:
1284 case Instruction::AtomicCmpXchg:
1286 case Instruction::Call:
1287 case Instruction::Invoke:
1289 switch (
II->getIntrinsicID()) {
1290 case Intrinsic::masked_load:
1291 case Intrinsic::masked_gather:
1292 case Intrinsic::masked_expandload:
1293 case Intrinsic::vp_load:
1294 case Intrinsic::vp_gather:
1295 case Intrinsic::experimental_vp_strided_load:
1296 return II->getType();
1297 case Intrinsic::masked_store:
1298 case Intrinsic::masked_scatter:
1299 case Intrinsic::masked_compressstore:
1300 case Intrinsic::vp_store:
1301 case Intrinsic::vp_scatter:
1302 case Intrinsic::experimental_vp_strided_store:
1303 return II->getOperand(0)->getType();
1314 bool IncludePhaseOneUnwind) {
1318 return IncludePhaseOneUnwind;
1326 if (LP->
isFilter(
I) && Clause->getType()->getArrayNumElements() == 0)
1337 case Instruction::Call:
1339 case Instruction::CleanupRet:
1341 case Instruction::CatchSwitch:
1343 case Instruction::Resume:
1345 case Instruction::Invoke: {
1354 case Instruction::CleanupPad:
1356 return IncludePhaseOneUnwind;
1363 return mayWriteToMemory() ||
mayThrow() || !willReturn();
1368 !this->isTerminator() && !this->isEHPad();
1377 return CB->hasFnAttr(Attribute::WillReturn);
1386 return ID == Intrinsic::lifetime_start || ID == Intrinsic::lifetime_end;
1399 return II->isAssociative();
1417 return II->isCommutative();
1424 return II->isCommutableOperand(
Op);
1431#define HANDLE_TERM_INST(N, OPC, CLASS) \
1432 case Instruction::OPC: \
1433 return static_cast<const CLASS *>(this)->getNumSuccessors();
1434#include "llvm/IR/Instruction.def"
1443#define HANDLE_TERM_INST(N, OPC, CLASS) \
1444 case Instruction::OPC: \
1445 return static_cast<const CLASS *>(this)->getSuccessor(idx);
1446#include "llvm/IR/Instruction.def"
1455#define HANDLE_TERM_INST(N, OPC, CLASS) \
1456 case Instruction::OPC: \
1457 return static_cast<CLASS *>(this)->setSuccessor(idx, B);
1458#include "llvm/IR/Instruction.def"
1468#define HANDLE_TERM_INST(N, OPC, CLASS) \
1469 case Instruction::OPC: \
1470 return static_cast<const CLASS *>(this)->successors();
1471#include "llvm/IR/Instruction.def"
1480 for (
auto I = Succs.begin(),
E = Succs.end();
I !=
E; ++
I)
1482 I.getUse()->set(NewBB);
1497 unsigned SecondIdx = FirstIdx + 1;
1502 for (
unsigned Idx = 0; Idx < FirstIdx; ++Idx) {
1508 setMetadata(LLVMContext::MD_prof,
1514 static const unsigned SafeIDs[] = {
1515 LLVMContext::MD_dbg, LLVMContext::MD_prof, LLVMContext::MD_memprof,
1516 LLVMContext::MD_callsite};
1517 copyMetadata(SrcInst, SafeIDs);
1534 for (
const auto &MD : TheMDs) {
1535 if (WL.
empty() || WLS.count(MD.first))
1536 setMetadata(MD.first, MD.second);
1545#define HANDLE_INST(num, opc, clas) \
1546 case Instruction::opc: \
1547 New = cast<clas>(this)->cloneImpl(); \
1549#include "llvm/IR/Instruction.def"
1553 New->SubclassOptionalData = SubclassOptionalData;
1554 New->copyMetadata(*
this);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
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...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
This file defines the DenseSet and SmallDenseSet classes.
static MaybeAlign getAlign(Value *Ptr)
Module.h This file contains the declarations for the Module class.
static bool hasNoSignedWrap(BinaryOperator &I)
static bool hasNoUnsignedWrap(BinaryOperator &I)
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
Machine Check Debug Module
static DebugLoc getDebugLoc(MachineBasicBlock::instr_iterator FirstMI, MachineBasicBlock::instr_iterator LastMI)
Return the first DebugLoc that has line number information, given a range of instructions.
This file provides utility for Memory Model Relaxation Annotations (MMRAs).
uint64_t IntrinsicInst * II
StandardInstrumentations SI(Mod->getContext(), Debug, VerifyEach)
This file contains the declarations for profiling metadata utility functions.
static bool mayHaveSideEffects(MachineInstr &MI)
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
static unsigned getFastMathFlags(const MachineInstr &I, const SPIRVSubtarget &ST)
static bool canUnwindPastLandingPad(const LandingPadInst *LP, bool IncludePhaseOneUnwind)
static SymbolRef::Type getType(const Symbol *Sym)
static bool isAssociative(const COFFSection &Section)
an instruction to allocate memory on the stack
Represent a constant reference to an array (0 or more elements consecutively in memory),...
bool empty() const
Check if the array is empty.
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
This class stores enough information to efficiently remove some attributes from an existing AttrBuild...
AttributeMask & addAttribute(Attribute::AttrKind Val)
Add an attribute to the mask.
This class holds the attributes for a particular argument, parameter, function, or return value.
LLVM Basic Block Representation.
LLVM_ABI void deleteTrailingDbgRecords()
Delete any trailing DbgRecords at the end of this block, see setTrailingDbgRecords.
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...
const Function * getParent() const
Return the enclosing method, or null if none.
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
LLVM_ABI DbgMarker * getMarker(InstListType::iterator It)
Return the DbgMarker for the position given by It, so that DbgRecords can be inserted there.
InstListType::iterator iterator
Instruction iterators...
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
AttributeList getAttributes() const
Return the attributes for this call.
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
This class represents a function call, abstracting a target machine's calling convention.
This class is the base class for the comparison instructions.
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
A parsed version of the target data layout string in and methods for querying it.
Per-instruction record of debug-info.
static iterator_range< simple_ilist< DbgRecord >::iterator > getEmptyDbgRecordRange()
Instruction * MarkedInstr
Link back to the Instruction that owns this marker.
LLVM_ABI void eraseFromParent()
simple_ilist< DbgRecord > StoredDbgRecords
List of DbgRecords, the non-instruction equivalent of llvm.dbg.
Base class for non-instruction debug metadata records that have positions within IR.
DebugLoc orElse(DebugLoc Other) const
If this DebugLoc is non-empty, returns this DebugLoc; otherwise, selects Other.
Convenience struct for specifying and reasoning about fast-math flags.
An instruction for ordering other memory operations.
static GEPNoWrapFlags none()
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
InsertPosition(std::nullptr_t)
This instruction inserts a struct field of array element value into an aggregate value.
LLVM_ABI const DebugLoc & getStableDebugLoc() const
Fetch the debug location for this node, unless this is a debug intrinsic, in which case fetch the deb...
LLVM_ABI void dropUBImplyingAttrsAndMetadata(ArrayRef< unsigned > Keep={})
Drop any attributes or metadata that can cause immediate undefined behavior.
LLVM_ABI MemoryEffects getMemoryEffects() const LLVM_READONLY
Return memory effects of the instruction.
LLVM_ABI bool mayThrow(bool IncludePhaseOneUnwind=false) const LLVM_READONLY
Return true if this instruction may throw an exception.
LLVM_ABI Instruction * clone() const
Create a copy of 'this' instruction that is identical in all ways except the following:
LLVM_ABI void setHasNoUnsignedWrap(bool b=true)
Set or clear the nuw flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI bool hasNoNaNs() const LLVM_READONLY
Determine whether the no-NaNs flag is set.
LLVM_ABI void removeFromParent()
This method unlinks 'this' from the containing basic block, but does not delete it.
LLVM_ABI bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
LLVM_ABI bool hasNoInfs() const LLVM_READONLY
Determine whether the no-infs flag is set.
LLVM_ABI bool isLifetimeStartOrEnd() const LLVM_READONLY
Return true if the instruction is a llvm.lifetime.start or llvm.lifetime.end marker.
LLVM_ABI bool hasPoisonGeneratingAttributes() const LLVM_READONLY
Return true if this instruction has poison-generating attribute.
LLVM_ABI void copyFastMathFlags(FastMathFlags FMF)
Convenience function for transferring all fast-math flag values to this instruction,...
LLVM_ABI bool isSameOperationAs(const Instruction *I, unsigned flags=0) const LLVM_READONLY
This function determines if the specified instruction executes the same operation as the current one.
LLVM_ABI void setHasNoSignedZeros(bool B)
Set or clear the no-signed-zeros flag on this instruction, which must be an operator which supports t...
LLVM_ABI bool hasNoSignedZeros() const LLVM_READONLY
Determine whether the no-signed-zeros flag is set.
LLVM_ABI iterator_range< simple_ilist< DbgRecord >::iterator > cloneDebugInfoFrom(const Instruction *From, std::optional< simple_ilist< DbgRecord >::iterator > FromHere=std::nullopt, bool InsertAtHead=false)
Clone any debug-info attached to From onto this instruction.
LLVM_ABI FastMathFlags getFastMathFlagsOrNone() const LLVM_READONLY
Convenience function for getting fast-math flags, or default-constructed FastMathFlags when not a FPM...
LLVM_ABI void copyProfileAndDebugMetadata(const Instruction &SrcInst)
Copy debug, profile, and memprof metadata from SrcInst to this instruction without copying alias-anal...
LLVM_ABI bool isDebugOrPseudoInst() const LLVM_READONLY
Return true if the instruction is a DbgInfoIntrinsic or PseudoProbeInst.
LLVM_ABI unsigned getNumSuccessors() const LLVM_READONLY
Return the number of successors that this instruction has.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
LLVM_ABI bool mayWriteToMemory() const LLVM_READONLY
Return true if this instruction may modify memory.
LLVM_ABI void copyIRFlags(const Value *V, bool IncludeWrapFlags=true)
Convenience method to copy supported exact, fast-math, and (optionally) wrapping flags from V to this...
LLVM_ABI void setHasAllowContract(bool B)
Set or clear the allow-contract flag on this instruction, which must be an operator which supports th...
LLVM_ABI bool hasAtomicStore() const LLVM_READONLY
Return true if this atomic instruction stores to memory.
LLVM_ABI void setHasNoSignedWrap(bool b=true)
Set or clear the nsw flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI bool isOnlyUserOfAnyOperand()
It checks if this instruction is the only user of at least one of its operands.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
LLVM_ABI void andIRFlags(const Value *V)
Logical 'and' of any supported wrapping, exact, and fast-math flags of V and this instruction.
LLVM_ABI void setHasNoNaNs(bool B)
Set or clear the no-nans flag on this instruction, which must be an operator which supports this flag...
LLVM_ABI bool isAssociative() const LLVM_READONLY
Return true if the instruction is associative:
LLVM_ABI void setHasApproxFunc(bool B)
Set or clear the approximate-math-functions flag on this instruction, which must be an operator which...
LLVM_ABI void moveAfter(Instruction *MovePos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
bool hasMetadata() const
Return true if this instruction has any metadata attached to it.
LLVM_ABI bool hasSameSpecialState(const Instruction *I2, bool IgnoreAlignment=false, bool IntersectAttrs=false) const LLVM_READONLY
This function determines if the speficied instruction has the same "special" characteristics as the c...
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 void setHasAllowReassoc(bool B)
Set or clear the reassociation flag on this instruction, which must be an operator which supports thi...
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
LLVM_ABI void setFastMathFlags(FastMathFlags FMF)
Convenience function for setting multiple fast-math flags on this instruction, which must be an opera...
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI bool isIdenticalToWhenDefined(const Instruction *I, bool IntersectAttrs=false) const LLVM_READONLY
This is like isIdenticalTo, except that it ignores the SubclassOptionalData flags,...
LLVM_ABI bool isFast() const LLVM_READONLY
Determine whether all fast-math-flags are set.
LLVM_ABI void replaceSuccessorWith(BasicBlock *OldBB, BasicBlock *NewBB)
Replace specified successor OldBB to point at the provided block.
LLVM_ABI bool isExact() const LLVM_READONLY
Determine whether the exact flag is set.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
LLVM_ABI void swapProfMetadata()
If the instruction has "branch_weights" MD_prof metadata and the MDNode has three operands (including...
LLVM_ABI BasicBlock * getSuccessor(unsigned Idx) const LLVM_READONLY
Return the specified successor. This instruction must be a terminator.
LLVM_ABI bool mayHaveSideEffects() const LLVM_READONLY
Return true if the instruction may have side effects.
LLVM_ABI void dropOneDbgRecord(DbgRecord *I)
Erase a single DbgRecord I that is attached to this instruction.
LLVM_ABI void setNonNeg(bool b=true)
Set or clear the nneg flag on this instruction, which must be a zext instruction.
LLVM_ABI Type * getAccessType() const LLVM_READONLY
Return the type this instruction accesses in memory, if any.
LLVM_ABI bool hasAllowReciprocal() const LLVM_READONLY
Determine whether the allow-reciprocal flag is set.
LLVM_ABI bool comesBefore(const Instruction *Other) const
Given an instruction Other in the same basic block as this instruction, return true if this instructi...
LLVM_ABI bool hasNonNeg() const LLVM_READONLY
Determine whether the the nneg flag is set.
LLVM_ABI bool maySynchronize() const LLVM_READONLY
Return true if this instruction may synchronize, in the sense that it may introduce a synchronizes-wi...
LLVM_ABI bool hasPoisonGeneratingFlags() const LLVM_READONLY
Return true if this operator has flags which may cause this instruction to evaluate to poison despite...
LLVM_ABI bool mayReadFromMemory() const LLVM_READONLY
Return true if this instruction may read memory.
LLVM_ABI bool isUsedOutsideOfBlock(const BasicBlock *BB) const LLVM_READONLY
Return true if there are any uses of this instruction in blocks other than the specified block.
LLVM_ABI bool isVolatile() const LLVM_READONLY
Return true if this instruction has a volatile memory access.
LLVM_ABI void setHasNoInfs(bool B)
Set or clear the no-infs flag on this instruction, which must be an operator which supports this flag...
LLVM_ABI iterator_range< const_succ_iterator > successors() const LLVM_READONLY
LLVM_ABI void adoptDbgRecords(BasicBlock *BB, InstListType::iterator It, bool InsertAtHead)
Transfer any DbgRecords on the position It onto this instruction, by simply adopting the sequence of ...
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
const char * getOpcodeName() const
LLVM_ABI bool willReturn() const LLVM_READONLY
Return true if the instruction will return (unwinding is considered as a form of returning control fl...
LLVM_ABI bool hasNonDebugLocLoopMetadata() const
LLVM_ABI bool hasApproxFunc() const LLVM_READONLY
Determine whether the approximate-math-functions flag is set.
void getAllMetadataOtherThanDebugLoc(SmallVectorImpl< std::pair< unsigned, MDNode * > > &MDs) const
This does the same thing as getAllMetadata, except that it filters out the debug location.
LLVM_ABI void moveAfterPreserving(Instruction *MovePos)
See moveBeforePreserving .
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
LLVM_ABI bool hasAtomicLoad() const LLVM_READONLY
Return true if this atomic instruction loads from memory.
LLVM_ABI void setIsExact(bool b=true)
Set or clear the exact flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI void dropPoisonGeneratingMetadata()
Drops metadata that may generate poison.
LLVM_ABI void setHasAllowReciprocal(bool B)
Set or clear the allow-reciprocal flag on this instruction, which must be an operator which supports ...
LLVM_ABI void handleMarkerRemoval()
Handle the debug-info implications of this instruction being removed.
LLVM_ABI bool hasUBImplyingAttrs() const LLVM_READONLY
Return true if this instruction has UB-implying attributes that can cause immediate undefined behavio...
LLVM_ABI std::optional< InstListType::iterator > getInsertionPointAfterDef()
Get the first insertion point at which the result of this instruction is defined.
LLVM_ABI void dropPoisonGeneratingFlags()
Drops flags that may cause this instruction to evaluate to poison despite having non-poison inputs.
LLVM_ABI void dropPoisonGeneratingAttributes()
Drops attributes that may generate poison.
LLVM_ABI void dropUBImplyingAttrsAndUnknownMetadata(ArrayRef< unsigned > KnownIDs={})
This function drops non-debug unknown metadata (through dropUnknownNonDebugMetadata).
LLVM_ABI bool isIdenticalTo(const Instruction *I) const LLVM_READONLY
Return true if the specified instruction is exactly identical to the current one.
LLVM_ABI std::optional< simple_ilist< DbgRecord >::iterator > getDbgReinsertionPosition()
Return an iterator to the position of the "Next" DbgRecord after this instruction,...
LLVM_ABI bool hasAllowContract() const LLVM_READONLY
Determine whether the allow-contract flag is set.
LLVM_ABI void moveBeforePreserving(InstListType::iterator MovePos)
Perform a moveBefore operation, while signalling that the caller intends to preserve the original ord...
LLVM_ABI bool hasPoisonGeneratingMetadata() const LLVM_READONLY
Return true if this instruction has poison-generating metadata.
Instruction(const Instruction &)=delete
LLVM_ABI void setSuccessor(unsigned Idx, BasicBlock *BB)
Update the specified successor to point at the provided block.
LLVM_ABI bool isCommutableOperand(unsigned Op) const LLVM_READONLY
Checks if the operand is commutative.
LLVM_ABI void copyMetadata(const Instruction &SrcInst, ArrayRef< unsigned > WL=ArrayRef< unsigned >())
Copy metadata from SrcInst to this instruction.
LLVM_ABI void setFast(bool B)
Set or clear all fast-math-flags on this instruction, which must be an operator which supports this f...
LLVM_ABI bool hasAllowReassoc() const LLVM_READONLY
Determine whether the allow-reassociation flag is set.
LLVM_ABI void dropDbgRecords()
Erase any DbgRecords attached to this instruction.
LLVM_ABI void insertAfter(Instruction *InsertPos)
Insert an unlinked instruction into a basic block immediately after the specified instruction.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
LLVM_ABI bool isSafeToRemove() const LLVM_READONLY
Return true if the instruction can be removed if the result is unused.
LLVM_ABI InstListType::iterator insertInto(BasicBlock *ParentBB, InstListType::iterator It)
Inserts an unlinked instruction into ParentBB at position It and returns the iterator of the inserted...
LLVM_ABI bool hasDbgRecords() const
Returns true if any DbgRecords are attached to this instruction.
A wrapper class for inspecting calls to intrinsic functions.
The landingpad instruction holds all of the information necessary to generate correct exception handl...
bool isCleanup() const
Return 'true' if this landingpad instruction is a cleanup.
unsigned getNumClauses() const
Get the number of clauses for this landing pad.
bool isCatch(unsigned Idx) const
Return 'true' if the clause and index Idx is a catch clause.
bool isFilter(unsigned Idx) const
Return 'true' if the clause and index Idx is a filter clause.
Constant * getClause(unsigned Idx) const
Get the value of the clause at index Idx.
An instruction for reading from memory.
const MDOperand & getOperand(unsigned I) const
ArrayRef< MDOperand > operands() const
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
unsigned getNumOperands() const
Return number of MDNode operands.
LLVMContext & getContext() const
Tracking metadata reference owned by Metadata.
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase inaccessibleOrArgMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase none()
static MemoryEffectsBase unknown()
iterator_range< const_block_iterator > blocks() const
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Instruction that can have a nneg flag (zext/uitofp).
This instruction constructs a fixed permutation of two input vectors.
Implements a dense probed hash-table based set with some number of buckets stored inline.
void reserve(size_type N)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
A Use represents the edge between a Value definition and its users.
LLVMContext & getContext() const
All values hold a context through their type.
const ParentTy * getParent() const
self_iterator getIterator()
void splice(iterator where, iplist_impl &L2)
iterator insertAfter(iterator where, pointer New)
iterator insert(iterator where, pointer New)
A range adaptor for a pair of iterators.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char IsVolatile[]
Key for Kernel::Arg::Metadata::mIsVolatile.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
constexpr bool isAtomic(const T &...O)
@ SingleThread
Synchronized with respect to signal handlers executing in the same thread.
bool mayThrow(const MachineInstr &MI)
@ OB
OB - OneByte - Set if this instruction has a one byte opcode.
initializer< Ty > init(const Ty &Val)
@ Switch
The "resume-switch" lowering, where there are separate resume and destroy functions that are shared b...
NodeAddr< PhiNode * > Phi
bool isCommutative(const Instruction *I, const Value *ValWithUses, bool IsCopyable)
unsigned getOpcode(const VPValue *V)
Return the instruction opcode for the recipe defining V or 0 for unsupported recipes and VPValues not...
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
LLVM_ABI cl::opt< bool > ProfcheckDisableMetadataFixes
LLVM_ABI unsigned getBranchWeightOffset(const MDNode *ProfileData)
Return the offset to the first branch weight data.
bool isStrongerThanMonotonic(AtomicOrdering AO)
auto successors(const MachineBasicBlock *BB)
@ Load
The value being inserted comes from a load (InsertElement only).
@ Store
The extracted value is stored (ExtractElement only).
LLVM_ABI MDNode * getBranchWeightMDNode(const Instruction &I)
Get the branch weights metadata node.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
bool isStrongerThanUnordered(AtomicOrdering AO)
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
iterator_range< simple_ilist< DbgRecord >::iterator > getDbgRecordRange(DbgMarker *DebugMarker)
Inline helper to return a range of DbgRecords attached to a marker.
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...
@ Ref
The access may reference the value stored in memory.
@ ModRef
The access may reference and may modify the value stored in memory.
@ Mod
The access may modify the value stored in memory.
@ FSub
Subtraction of floats.
@ Xor
Bitwise or logical XOR of integers.
@ Sub
Subtraction of integers.
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
bool equal(L &&LRange, R &&RRange)
Wrapper function around std::equal to detect if pair-wise elements between two ranges are the same.
@ Keep
No function return thunk.
Summary of memprof metadata on allocations.