41 "Disable metadata propagation fixes discovered through Issue #147390"));
46 : InsertAt(InsertBefore ? InsertBefore->getIterator()
47 : InstListType::iterator()) {}
49 : InsertAt(InsertAtEnd ? InsertAtEnd->
end() : InstListType::iterator()) {}
55 if (InstListType::iterator InsertIt = InsertBefore; InsertIt.isValid()) {
57 assert(BB &&
"Instruction to insert before is not in a basic block!");
58 insertInto(BB, InsertBefore);
74 if (isUsedByMetadata())
79 setMetadata(LLVMContext::MD_DIAssignID,
nullptr);
91 return getModule()->getDataLayout();
96 handleMarkerRemoval();
98 getParent()->getInstList().remove(getIterator());
105 DebugMarker->removeMarker();
109 handleMarkerRemoval();
110 return getParent()->getInstList().erase(getIterator());
120 insertBefore(*InsertPos->getParent(), InsertPos);
134 DestParent->getInstList().
insertAfter(InsertPos,
this);
140 assert((It == ParentBB->
end() || It->getParent() == ParentBB) &&
141 "It not in ParentBB");
142 insertBefore(*ParentBB, It);
143 return getIterator();
147 InstListType::iterator InsertPos) {
150 BB.getInstList().
insert(InsertPos,
this);
155 bool InsertAtHead = InsertPos.getHeadBit();
158 if (SrcMarker && !SrcMarker->
empty()) {
171 adoptDbgRecords(&BB, InsertPos,
false);
179 getParent()->flushTerminatorDbgRecords();
189 moveBeforeImpl(*MovePos->getParent(), MovePos,
false);
197 moveBeforeImpl(*MovePos->getParent(), MovePos,
true);
204 NextIt.setHeadBit(
true);
205 moveBeforeImpl(*MovePos->
getParent(), NextIt,
false);
211 MovePos.setHeadBit(
true);
212 moveBeforeImpl(*MovePos->getParent(), MovePos,
false);
219 NextIt.setHeadBit(
true);
220 moveBeforeImpl(*MovePos->
getParent(), NextIt,
true);
224 moveBeforeImpl(BB,
I,
false);
228 InstListType::iterator
I) {
229 moveBeforeImpl(BB,
I,
true);
232void Instruction::moveBeforeImpl(
BasicBlock &BB, InstListType::iterator
I,
235 bool InsertAtHead =
I.getHeadBit();
239 if (DebugMarker && !Preserve) {
240 if (
I != this->getIterator() || InsertAtHead) {
243 handleMarkerRemoval();
256 if (!InsertAtHead && NextMarker && !NextMarker->
empty()) {
257 adoptDbgRecords(&BB,
I,
false);
262 getParent()->flushTerminatorDbgRecords();
266 const Instruction *From, std::optional<DbgRecord::self_iterator> FromHere,
274 return DebugMarker->cloneDebugInfoFrom(From->
DebugMarker, FromHere,
278std::optional<DbgRecord::self_iterator>
297 auto ReleaseTrailingDbgRecords = [BB, It, SrcMarker]() {
298 if (BB->
end() == It) {
305 ReleaseTrailingDbgRecords();
312 if (DebugMarker || It == BB->
end()) {
315 DebugMarker->absorbDebugValues(*SrcMarker, InsertAtHead);
326 ReleaseTrailingDbgRecords();
331 DebugMarker = SrcMarker;
339 DebugMarker->dropDbgRecords();
343 DebugMarker->dropOneDbgRecord(DVR);
348 "instructions without BB parents have no order");
350 "cross-BB instruction order comparison");
353 return Order <
Other->Order;
357 assert(!
getType()->isVoidTy() &&
"Instruction must define result");
364 InsertBB =
II->getNormalDest();
371 assert(!isTerminator() &&
"Only invoke/callbr terminators return value");
373 InsertPt = std::next(getIterator());
377 InsertPt.setHeadBit(
true);
382 if (InsertPt == InsertBB->
end())
388 return any_of(operands(), [](
const Value *V) {
return V->hasOneUser(); });
393 Inst->setHasNoUnsignedWrap(b);
400 Inst->setHasNoSignedWrap(b);
417 return Inst->hasNoUnsignedWrap();
424 return Inst->hasNoSignedWrap();
440 case Instruction::Add:
441 case Instruction::Sub:
442 case Instruction::Mul:
443 case Instruction::Shl:
448 case Instruction::UDiv:
449 case Instruction::SDiv:
450 case Instruction::AShr:
451 case Instruction::LShr:
455 case Instruction::Or:
459 case Instruction::GetElementPtr:
463 case Instruction::UIToFP:
464 case Instruction::ZExt:
468 case Instruction::Trunc:
473 case Instruction::ICmp:
483 assert(!hasPoisonGeneratingFlags() &&
"must be kept in sync");
488 [
this](
unsigned ID) {
return hasMetadata(
ID); });
494 if (!hasMetadata(LLVMContext::MD_loop))
498 MDNode *LoopMD = getMetadata(LLVMContext::MD_loop);
521 AttributeSet RetAttrs = CB->getAttributes().getRetAttrs();
535 CB->removeRetAttrs(AM);
537 assert(!hasPoisonGeneratingReturnAttributes() &&
"must be kept in sync");
542 dropUnknownNonDebugMetadata(KnownIDs);
549 AttributeList
AL = CB->getAttributes();
553 AttributeFuncs::getUBImplyingAttributes();
554 for (
unsigned ArgNo = 0; ArgNo < CB->arg_size(); ArgNo++)
555 CB->removeParamAttrs(ArgNo, UBImplyingAttributes);
556 CB->removeRetAttrs(UBImplyingAttributes);
564 static const unsigned KnownIDs[] = {
565 LLVMContext::MD_annotation, LLVMContext::MD_range,
566 LLVMContext::MD_nonnull, LLVMContext::MD_align, LLVMContext::MD_prof};
568 KeepIDs.
reserve(
Keep.size() + std::size(KnownIDs));
572 dropUBImplyingAttrsAndUnknownMetadata(KeepIDs);
581 for (
unsigned ArgNo = 0; ArgNo < CB->arg_size(); ArgNo++)
582 if (CB->isPassingUndefUB(ArgNo))
584 return CB->hasRetAttr(Attribute::NoUndef) ||
585 CB->hasRetAttr(Attribute::Dereferenceable) ||
586 CB->hasRetAttr(Attribute::DereferenceableOrNull);
689 copyFastMathFlags(
I->getFastMathFlags());
696 setHasNoSignedWrap(
OB->hasNoSignedWrap());
697 setHasNoUnsignedWrap(
OB->hasNoUnsignedWrap());
703 setHasNoSignedWrap(TI->hasNoSignedWrap());
704 setHasNoUnsignedWrap(TI->hasNoUnsignedWrap());
711 setIsExact(PE->isExact());
715 DestPD->setIsDisjoint(SrcPD->isDisjoint());
720 copyFastMathFlags(
FP->getFastMathFlags());
724 DestGEP->setNoWrapFlags(SrcGEP->getNoWrapFlags() |
725 DestGEP->getNoWrapFlags());
729 setNonNeg(NNI->hasNonNeg());
733 DestICmp->setSameSign(SrcICmp->hasSameSign());
753 setIsExact(isExact() && PE->isExact());
757 DestPD->setIsDisjoint(DestPD->isDisjoint() && SrcPD->isDisjoint());
762 FM &=
FP->getFastMathFlags();
763 copyFastMathFlags(FM);
769 DestGEP->setNoWrapFlags(SrcGEP->getNoWrapFlags() &
770 DestGEP->getNoWrapFlags());
774 setNonNeg(hasNonNeg() && NNI->hasNonNeg());
778 DestICmp->setSameSign(DestICmp->hasSameSign() && SrcICmp->hasSameSign());
784 case Ret:
return "ret";
785 case Br:
return "br";
786 case Switch:
return "switch";
787 case IndirectBr:
return "indirectbr";
788 case Invoke:
return "invoke";
789 case Resume:
return "resume";
790 case Unreachable:
return "unreachable";
791 case CleanupRet:
return "cleanupret";
792 case CatchRet:
return "catchret";
793 case CatchPad:
return "catchpad";
794 case CatchSwitch:
return "catchswitch";
795 case CallBr:
return "callbr";
798 case FNeg:
return "fneg";
801 case Add:
return "add";
802 case FAdd:
return "fadd";
803 case Sub:
return "sub";
804 case FSub:
return "fsub";
805 case Mul:
return "mul";
806 case FMul:
return "fmul";
807 case UDiv:
return "udiv";
808 case SDiv:
return "sdiv";
809 case FDiv:
return "fdiv";
810 case URem:
return "urem";
811 case SRem:
return "srem";
812 case FRem:
return "frem";
815 case And:
return "and";
816 case Or :
return "or";
817 case Xor:
return "xor";
820 case Alloca:
return "alloca";
821 case Load:
return "load";
822 case Store:
return "store";
823 case AtomicCmpXchg:
return "cmpxchg";
824 case AtomicRMW:
return "atomicrmw";
825 case Fence:
return "fence";
826 case GetElementPtr:
return "getelementptr";
829 case Trunc:
return "trunc";
830 case ZExt:
return "zext";
831 case SExt:
return "sext";
832 case FPTrunc:
return "fptrunc";
833 case FPExt:
return "fpext";
834 case FPToUI:
return "fptoui";
835 case FPToSI:
return "fptosi";
836 case UIToFP:
return "uitofp";
837 case SIToFP:
return "sitofp";
838 case IntToPtr:
return "inttoptr";
839 case PtrToAddr:
return "ptrtoaddr";
840 case PtrToInt:
return "ptrtoint";
841 case BitCast:
return "bitcast";
842 case AddrSpaceCast:
return "addrspacecast";
845 case ICmp:
return "icmp";
846 case FCmp:
return "fcmp";
847 case PHI:
return "phi";
848 case Select:
return "select";
849 case Call:
return "call";
850 case Shl:
return "shl";
851 case LShr:
return "lshr";
852 case AShr:
return "ashr";
853 case VAArg:
return "va_arg";
854 case ExtractElement:
return "extractelement";
855 case InsertElement:
return "insertelement";
856 case ShuffleVector:
return "shufflevector";
857 case ExtractValue:
return "extractvalue";
858 case InsertValue:
return "insertvalue";
859 case LandingPad:
return "landingpad";
860 case CleanupPad:
return "cleanuppad";
861 case Freeze:
return "freeze";
863 default:
return "<Invalid operator> ";
870 bool IgnoreAlignment,
871 bool IntersectAttrs)
const {
872 const auto *
I1 =
this;
874 "Can not compare special state of different instructions");
876 auto CheckAttrsSame = [IntersectAttrs](
const CallBase *CB0,
878 return IntersectAttrs
880 .intersectWith(CB0->
getContext(), CB1->getAttributes())
886 return AI->getAllocatedType() ==
cast<AllocaInst>(I2)->getAllocatedType() &&
902 return CI->getPredicate() ==
cast<CmpInst>(I2)->getPredicate();
928 CXI->getSuccessOrdering() ==
930 CXI->getFailureOrdering() ==
932 CXI->getSyncScopeID() ==
942 return SVI->getShuffleMask() ==
945 return GEP->getSourceElementType() ==
952 return isIdenticalToWhenDefined(
I) &&
953 SubclassOptionalData ==
I->SubclassOptionalData;
957 bool IntersectAttrs)
const {
959 getNumOperands() !=
I->getNumOperands() ||
getType() !=
I->getType())
963 if (getNumOperands() == 0 &&
I->getNumOperands() == 0)
964 return this->hasSameSpecialState(
I,
false,
969 if (!
equal(operands(),
I->operands()))
978 return this->hasSameSpecialState(
I,
false,
985 unsigned flags)
const {
986 bool IgnoreAlignment = flags & CompareIgnoringAlignment;
987 bool UseScalarTypes = flags & CompareUsingScalarTypes;
988 bool IntersectAttrs = flags & CompareUsingIntersectedAttrs;
991 getNumOperands() !=
I->getNumOperands() ||
993 getType()->getScalarType() !=
I->getType()->getScalarType() :
999 for (
unsigned i = 0, e = getNumOperands(); i !=
e; ++i)
1000 if (UseScalarTypes ?
1001 getOperand(i)->
getType()->getScalarType() !=
1002 I->getOperand(i)->getType()->getScalarType() :
1003 getOperand(i)->
getType() !=
I->getOperand(i)->getType())
1006 return this->hasSameSpecialState(
I, IgnoreAlignment, IntersectAttrs);
1010 for (
const Use &U : uses()) {
1016 if (
I->getParent() != BB)
1029 default:
return false;
1030 case Instruction::VAArg:
1031 case Instruction::Load:
1032 case Instruction::Fence:
1033 case Instruction::AtomicCmpXchg:
1034 case Instruction::AtomicRMW:
1035 case Instruction::CatchPad:
1036 case Instruction::CatchRet:
1038 case Instruction::Call:
1039 case Instruction::Invoke:
1040 case Instruction::CallBr:
1042 case Instruction::Store:
1049 default:
return false;
1050 case Instruction::Fence:
1051 case Instruction::Store:
1052 case Instruction::VAArg:
1053 case Instruction::AtomicCmpXchg:
1054 case Instruction::AtomicRMW:
1055 case Instruction::CatchPad:
1056 case Instruction::CatchRet:
1058 case Instruction::Call:
1059 case Instruction::Invoke:
1060 case Instruction::CallBr:
1062 case Instruction::Load:
1071 case Instruction::AtomicCmpXchg:
1072 case Instruction::AtomicRMW:
1073 case Instruction::Fence:
1075 case Instruction::Load:
1077 case Instruction::Store:
1087 case Instruction::AtomicCmpXchg:
1088 case Instruction::AtomicRMW:
1089 case Instruction::Load:
1099 case Instruction::AtomicCmpXchg:
1100 case Instruction::AtomicRMW:
1101 case Instruction::Store:
1110 case Instruction::AtomicRMW:
1112 case Instruction::Store:
1114 case Instruction::Load:
1116 case Instruction::AtomicCmpXchg:
1118 case Instruction::Call:
1119 case Instruction::Invoke:
1123 return MI->isVolatile();
1124 switch (
II->getIntrinsicID()) {
1126 case Intrinsic::matrix_column_major_load:
1128 case Intrinsic::matrix_column_major_store:
1138 case Instruction::Store:
1140 case Instruction::Load:
1141 case Instruction::AtomicRMW:
1143 case Instruction::AtomicCmpXchg:
1145 case Instruction::Call:
1146 case Instruction::Invoke:
1148 switch (
II->getIntrinsicID()) {
1149 case Intrinsic::masked_load:
1150 case Intrinsic::masked_gather:
1151 case Intrinsic::masked_expandload:
1152 case Intrinsic::vp_load:
1153 case Intrinsic::vp_gather:
1154 case Intrinsic::experimental_vp_strided_load:
1155 return II->getType();
1156 case Intrinsic::masked_store:
1157 case Intrinsic::masked_scatter:
1158 case Intrinsic::masked_compressstore:
1159 case Intrinsic::vp_store:
1160 case Intrinsic::vp_scatter:
1161 case Intrinsic::experimental_vp_strided_store:
1162 return II->getOperand(0)->getType();
1173 bool IncludePhaseOneUnwind) {
1177 return IncludePhaseOneUnwind;
1185 if (LP->
isFilter(
I) && Clause->getType()->getArrayNumElements() == 0)
1196 case Instruction::Call:
1198 case Instruction::CleanupRet:
1200 case Instruction::CatchSwitch:
1202 case Instruction::Resume:
1204 case Instruction::Invoke: {
1213 case Instruction::CleanupPad:
1215 return IncludePhaseOneUnwind;
1222 return mayWriteToMemory() ||
mayThrow() || !willReturn();
1227 !this->isTerminator() && !this->isEHPad();
1233 return !
SI->isVolatile();
1236 return CB->hasFnAttr(Attribute::WillReturn);
1245 return ID == Intrinsic::lifetime_start ||
ID == Intrinsic::lifetime_end;
1253 return ID == Intrinsic::launder_invariant_group ||
1254 ID == Intrinsic::strip_invariant_group;
1267 return II->isAssociative();
1284 return II->isCommutative();
1291#define HANDLE_TERM_INST(N, OPC, CLASS) \
1292 case Instruction::OPC: \
1293 return static_cast<const CLASS *>(this)->getNumSuccessors();
1294#include "llvm/IR/Instruction.def"
1303#define HANDLE_TERM_INST(N, OPC, CLASS) \
1304 case Instruction::OPC: \
1305 return static_cast<const CLASS *>(this)->getSuccessor(idx);
1306#include "llvm/IR/Instruction.def"
1315#define HANDLE_TERM_INST(N, OPC, CLASS) \
1316 case Instruction::OPC: \
1317 return static_cast<CLASS *>(this)->setSuccessor(idx, B);
1318#include "llvm/IR/Instruction.def"
1327 Idx != NumSuccessors; ++Idx)
1328 if (getSuccessor(Idx) == OldBB)
1329 setSuccessor(Idx, NewBB);
1344 unsigned SecondIdx = FirstIdx + 1;
1349 for (
unsigned Idx = 0; Idx < FirstIdx; ++Idx) {
1355 setMetadata(LLVMContext::MD_prof,
1373 for (
const auto &MD : TheMDs) {
1374 if (WL.
empty() ||
WLS.count(MD.first))
1375 setMetadata(MD.first, MD.second);
1384#define HANDLE_INST(num, opc, clas) \
1385 case Instruction::opc: \
1386 New = cast<clas>(this)->cloneImpl(); \
1388#include "llvm/IR/Instruction.def"
1392 New->SubclassOptionalData = SubclassOptionalData;
1393 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< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
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 found DebugLoc that has a DILocation, 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)
static bool isCommutative(Instruction *I, Value *ValWithUses)
static bool canUnwindPastLandingPad(const LandingPadInst *LP, bool IncludePhaseOneUnwind)
static SymbolRef::Type getType(const Symbol *Sym)
static std::optional< unsigned > getOpcode(ArrayRef< VPValue * > Values)
Returns the opcode of Values or ~0 if they do not all agree.
static bool isAssociative(const COFFSection &Section)
an instruction to allocate memory on the stack
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
bool empty() const
empty - 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_ABI bool hasAttribute(Attribute::AttrKind Kind) const
Return true if the attribute exists in this set.
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.
This is an important base class in LLVM.
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.
simple_ilist< DbgRecord > StoredDbgRecords
List of DbgRecords, the non-instruction equivalent of llvm.dbg.
LLVM_ABI void eraseFromParent()
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.
DbgMarker * DebugMarker
Optional marker recording the position for debugging information that takes effect immediately before...
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 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 bool hasPoisonGeneratingReturnAttributes() const LLVM_READONLY
Return true if this instruction has poison-generating attribute.
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 void dropPoisonGeneratingReturnAttributes()
Drops return attributes that may generate poison.
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 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 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 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 isLaunderOrStripInvariantGroup() const LLVM_READONLY
Return true if the instruction is a llvm.launder.invariant.group or llvm.strip.invariant....
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 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.
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.
LLVM_ABI 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.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
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
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.
LLVM_ABI unsigned getBranchWeightOffset(const MDNode *ProfileData)
Return the offset to the first branch weight data.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
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 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...
auto drop_end(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the last N elements excluded.
@ 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.
cl::opt< bool > ProfcheckDisableMetadataFixes("profcheck-disable-metadata-fixes", cl::Hidden, cl::init(false), cl::desc("Disable metadata propagation fixes discovered through Issue #147390"))
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.