15#ifndef LLVM_IR_INSTRUCTIONS_H
16#define LLVM_IR_INSTRUCTIONS_H
72 "Bitfields must be contiguous");
129 return Align(1ULL << getSubclassData<AlignmentField>());
133 setSubclassData<AlignmentField>(
Log2(
Align));
144 return getSubclassData<UsedWithInAllocaField>();
149 setSubclassData<UsedWithInAllocaField>(V);
153 bool isSwiftError()
const {
return getSubclassData<SwiftErrorField>(); }
159 return (
I->getOpcode() == Instruction::Alloca);
162 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
168 template <
typename Bitfield>
169 void setSubclassData(
typename Bitfield::Type
Value) {
170 Instruction::setSubclassData<Bitfield>(
Value);
185 Bitfield::areContiguous<VolatileField, AlignmentField, OrderingField>(),
186 "Bitfields must be contiguous");
209 bool isVolatile()
const {
return getSubclassData<VolatileField>(); }
216 return Align(1ULL << (getSubclassData<AlignmentField>()));
220 setSubclassData<AlignmentField>(
Log2(
Align));
225 return getSubclassData<OrderingField>();
230 setSubclassData<OrderingField>(Ordering);
271 return I->getOpcode() == Instruction::Load;
274 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
280 template <
typename Bitfield>
281 void setSubclassData(
typename Bitfield::Type
Value) {
282 Instruction::setSubclassData<Bitfield>(
Value);
301 Bitfield::areContiguous<VolatileField, AlignmentField, OrderingField>(),
302 "Bitfields must be contiguous");
326 void *
operator new(
size_t S) {
return User::operator
new(S, AllocMarker); }
327 void operator delete(
void *
Ptr) { User::operator
delete(
Ptr); }
330 bool isVolatile()
const {
return getSubclassData<VolatileField>(); }
339 return Align(1ULL << (getSubclassData<AlignmentField>()));
343 setSubclassData<AlignmentField>(
Log2(
Align));
348 return getSubclassData<OrderingField>();
354 setSubclassData<OrderingField>(Ordering);
398 return I->getOpcode() == Instruction::Store;
401 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
407 template <
typename Bitfield>
408 void setSubclassData(
typename Bitfield::Type
Value) {
409 Instruction::setSubclassData<Bitfield>(
Value);
450 void *
operator new(
size_t S) {
return User::operator
new(S, AllocMarker); }
451 void operator delete(
void *
Ptr) { User::operator
delete(
Ptr); }
455 return getSubclassData<OrderingField>();
461 setSubclassData<OrderingField>(Ordering);
476 return I->getOpcode() == Instruction::Fence;
479 return isa<Instruction>(V) && classof(cast<Instruction>(V));
485 template <
typename Bitfield>
486 void setSubclassData(
typename Bitfield::Type
Value) {
487 Instruction::setSubclassData<Bitfield>(
Value);
511 template <
unsigned Offset>
512 using AtomicOrderingBitfieldElement =
531 void *
operator new(
size_t S) {
return User::operator
new(S, AllocMarker); }
532 void operator delete(
void *
Ptr) { User::operator
delete(
Ptr); }
545 "Bitfields must be contiguous");
550 return Align(1ULL << getSubclassData<AlignmentField>());
554 setSubclassData<AlignmentField>(
Log2(
Align));
560 bool isVolatile()
const {
return getSubclassData<VolatileField>(); }
567 bool isWeak()
const {
return getSubclassData<WeakField>(); }
569 void setWeak(
bool IsWeak) { setSubclassData<WeakField>(IsWeak); }
588 return getSubclassData<SuccessOrderingField>();
594 "invalid CmpXchg success ordering");
595 setSubclassData<SuccessOrderingField>(Ordering);
600 return getSubclassData<FailureOrderingField>();
606 "invalid CmpXchg failure ordering");
607 setSubclassData<FailureOrderingField>(Ordering);
658 switch (SuccessOrdering) {
674 return I->getOpcode() == Instruction::AtomicCmpXchg;
677 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
683 template <
typename Bitfield>
684 void setSubclassData(
typename Bitfield::Type
Value) {
685 Instruction::setSubclassData<Bitfield>(
Value);
784 LAST_BINOP = USubSat,
789 template <
unsigned Offset>
790 using AtomicOrderingBitfieldElement =
794 template <
unsigned Offset>
795 using BinOpBitfieldElement =
798 constexpr static IntrusiveOperandsAllocMarker AllocMarker{2};
804 InsertPosition InsertBefore =
nullptr);
807 void *
operator new(
size_t S) {
return User::operator
new(S, AllocMarker); }
808 void operator delete(
void *
Ptr) { User::operator
delete(
Ptr); }
817 "Bitfields must be contiguous");
838 setSubclassData<OperationField>(
Operation);
844 return Align(1ULL << getSubclassData<AlignmentField>());
848 setSubclassData<AlignmentField>(
Log2(
Align));
853 bool isVolatile()
const {
return getSubclassData<VolatileField>(); }
864 return getSubclassData<AtomicOrderingField>();
870 "atomicrmw instructions can only be atomic.");
872 "atomicrmw instructions cannot be unordered.");
873 setSubclassData<AtomicOrderingField>(Ordering);
899 return isFPOperation(getOperation());
904 return I->getOpcode() == Instruction::AtomicRMW;
907 return isa<Instruction>(V) && classof(cast<Instruction>(V));
916 template <
typename Bitfield>
917 void setSubclassData(
typename Bitfield::Type
Value) {
918 Instruction::setSubclassData<Bitfield>(
Value);
942 assert(Ty &&
"Invalid GetElementPtrInst indices for type!");
950 Type *SourceElementType;
951 Type *ResultElementType;
964 const Twine &NameStr);
975 const Twine &NameStr =
"",
978 assert(PointeeType &&
"Must specify element type");
981 PointeeType,
Ptr, IdxList, AllocMarker, NameStr, InsertBefore);
986 const Twine &NameStr =
"",
989 Create(PointeeType,
Ptr, IdxList, NameStr, InsertBefore);
990 GEP->setNoWrapFlags(NW);
998 const Twine &NameStr =
"",
1001 NameStr, InsertBefore);
1013 return ResultElementType;
1083 if (
auto *IndexVTy = dyn_cast<VectorType>(
Index->getType())) {
1142 APInt &ConstantOffset)
const;
1145 return (
I->getOpcode() == Instruction::GetElementPtr);
1148 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
1156GetElementPtrInst::GetElementPtrInst(
Type *PointeeType,
Value *
Ptr,
1162 SourceElementType(PointeeType),
1163 ResultElementType(getIndexedType(PointeeType, IdxList)) {
1164 init(
Ptr, IdxList, NameStr);
1179 assert(isIntPredicate() &&
1180 "Invalid ICmp predicate value");
1182 "Both operands to ICmp instruction are not of the same type!");
1185 getOperand(0)->
getType()->isPtrOrPtrVectorTy()) &&
1186 "Invalid operand types for ICmp instruction");
1189 enum { SameSign = (1 << 0) };
1204 const Twine &NameStr =
""
1207 RHS, NameStr, InsertBefore) {
1218 const Twine &NameStr =
""
1228 return {getPredicate(), hasSameSign()};
1234 return {getInversePredicate(Pred), Pred.
hasSameSign()};
1239 return getInverseCmpPredicate(getCmpPredicate());
1245 return {getSwappedPredicate(Pred), Pred.
hasSameSign()};
1250 return getSwappedCmpPredicate(getCmpPredicate());
1256 return {getNonStrictPredicate(Pred), Pred.
hasSameSign()};
1262 return getNonStrictCmpPredicate(getCmpPredicate());
1270 return getSignedPredicate(getPredicate());
1281 return getUnsignedPredicate(getPredicate());
1297 return getFlippedSignednessPredicate(getPredicate());
1302 LLVM_ABI static std::optional<bool>
1306 SubclassOptionalData = (SubclassOptionalData & ~SameSign) | (
B * SameSign);
1317 return P == ICMP_EQ ||
P == ICMP_NE;
1323 return isEquality(getPredicate());
1337 return !isEquality();
1343 return !isEquality(
P);
1349 return P == ICMP_SGT ||
P == ICMP_UGT;
1355 return P == ICMP_SLT ||
P == ICMP_ULT;
1361 return P == ICMP_SGE ||
P == ICMP_UGE;
1367 return P == ICMP_SLE ||
P == ICMP_ULE;
1380 setPredicate(getSwappedPredicate());
1390 LLVM_ABI static std::optional<bool>
1395 return I->getOpcode() == Instruction::ICmp;
1398 return isa<Instruction>(V) && classof(cast<Instruction>(V));
1414 "Both operands to FCmp instruction are not of the same type!");
1417 "Invalid operand types for FCmp instruction");
1433 const Twine &NameStr =
""
1436 RHS, NameStr, InsertBefore) {
1444 const Twine &NameStr =
"",
1447 RHS, NameStr, nullptr, FlagsSource) {
1497 return I->getOpcode() == Instruction::FCmp;
1500 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
1531 static unsigned ComputeNumOperands(
unsigned NumArgs,
1532 unsigned NumBundleInputs = 0) {
1535 return 1 + NumArgs + NumBundleInputs;
1548 return new (AllocMarker)
1549 CallInst(Ty,
F, NameStr, AllocMarker, InsertBefore);
1553 const Twine &NameStr,
1556 return new (AllocMarker)
1557 CallInst(Ty, Func, Args, {}, NameStr, AllocMarker, InsertBefore);
1562 const Twine &NameStr =
"",
1564 IntrusiveOperandsAndDescriptorAllocMarker AllocMarker{
1568 return new (AllocMarker)
1569 CallInst(Ty, Func, Args, Bundles, NameStr, AllocMarker, InsertBefore);
1574 return Create(Func.getFunctionType(), Func.getCallee(), NameStr,
1580 const Twine &NameStr =
"",
1582 return Create(Func.getFunctionType(), Func.getCallee(), Args, Bundles,
1583 NameStr, InsertBefore);
1587 const Twine &NameStr,
1589 return Create(Func.getFunctionType(), Func.getCallee(), Args, NameStr,
1614 Bitfield::areContiguous<TailCallKindField, CallBase::CallingConvField>(),
1615 "Bitfields must be contiguous");
1618 return getSubclassData<TailCallKindField>();
1631 setSubclassData<TailCallKindField>(TCK);
1645 case Intrinsic::trap:
1646 case Intrinsic::ubsantrap:
1655 return I->getOpcode() == Instruction::Call;
1658 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
1667 template <
typename Bitfield>
1668 void setSubclassData(
typename Bitfield::Type
Value) {
1669 Instruction::setSubclassData<Bitfield>(
Value);
1673CallInst::CallInst(
FunctionType *Ty, Value *Func, ArrayRef<Value *> Args,
1674 ArrayRef<OperandBundleDef> Bundles,
const Twine &NameStr,
1675 AllocInfo AllocInfo, InsertPosition InsertBefore)
1676 : CallBase(Ty->getReturnType(), Instruction::
Call, AllocInfo,
1678 assert(AllocInfo.NumOps ==
1680 init(Ty, Func, Args, Bundles, NameStr);
1694 :
Instruction(
S1->getType(), Instruction::Select, AllocMarker,
1715 const Twine &NameStr =
"",
1719 new (AllocMarker)
SelectInst(
C,
S1, S2, NameStr, InsertBefore);
1754 return I->getOpcode() == Instruction::Select;
1757 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
1794 return I->getOpcode() == VAArg;
1797 return isa<Instruction>(V) && classof(cast<Instruction>(V));
1822 const Twine &NameStr =
"",
1824 return new (AllocMarker)
1846 return I->getOpcode() == Instruction::ExtractElement;
1849 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
1871 const Twine &NameStr =
"",
1882 const Twine &NameStr =
"",
1884 return new (AllocMarker)
1904 return I->getOpcode() == Instruction::InsertElement;
1907 return isa<Instruction>(V) && classof(cast<Instruction>(V));
1950 const Twine &NameStr =
"",
1953 const Twine &NameStr =
"",
1956 const Twine &NameStr =
"",
1959 void *
operator new(
size_t S) {
return User::operator
new(S, AllocMarker); }
1960 void operator delete(
void *
Ptr) {
return User::operator
delete(
Ptr); }
1994 Result.assign(ShuffleMask.
begin(), ShuffleMask.
end());
2015 unsigned NumSourceElts = cast<VectorType>(
Op<0>()->
getType())
2017 .getKnownMinValue();
2018 unsigned NumMaskElts = ShuffleMask.
size();
2019 return NumSourceElts != NumMaskElts;
2026 unsigned NumSourceElts = cast<VectorType>(
Op<0>()->
getType())
2028 .getKnownMinValue();
2029 unsigned NumMaskElts = ShuffleMask.
size();
2030 return NumSourceElts < NumMaskElts;
2040 assert(Mask->getType()->isVectorTy() &&
"Shuffle needs vector constant.");
2042 getShuffleMask(Mask, MaskAsInts);
2043 return isSingleSourceMask(MaskAsInts, NumSrcElts);
2051 return !changesLength() &&
2052 isSingleSourceMask(ShuffleMask, ShuffleMask.
size());
2062 assert(Mask->getType()->isVectorTy() &&
"Shuffle needs vector constant.");
2066 if (isa<ScalableVectorType>(Mask->getType()))
2070 getShuffleMask(Mask, MaskAsInts);
2071 return isIdentityMask(MaskAsInts, NumSrcElts);
2081 if (isa<ScalableVectorType>(
getType()))
2084 return !changesLength() && isIdentityMask(ShuffleMask, ShuffleMask.
size());
2089 LLVM_ABI bool isIdentityWithPadding()
const;
2093 LLVM_ABI bool isIdentityWithExtract()
const;
2110 assert(Mask->getType()->isVectorTy() &&
"Shuffle needs vector constant.");
2112 getShuffleMask(Mask, MaskAsInts);
2113 return isSelectMask(MaskAsInts, NumSrcElts);
2125 return !changesLength() && isSelectMask(ShuffleMask, ShuffleMask.
size());
2135 assert(Mask->getType()->isVectorTy() &&
"Shuffle needs vector constant.");
2137 getShuffleMask(Mask, MaskAsInts);
2156 assert(Mask->getType()->isVectorTy() &&
"Shuffle needs vector constant.");
2158 getShuffleMask(Mask, MaskAsInts);
2159 return isZeroEltSplatMask(MaskAsInts, NumSrcElts);
2169 return !changesLength() &&
2170 isZeroEltSplatMask(ShuffleMask, ShuffleMask.
size());
2207 assert(Mask->getType()->isVectorTy() &&
"Shuffle needs vector constant.");
2209 getShuffleMask(Mask, MaskAsInts);
2210 return isTransposeMask(MaskAsInts, NumSrcElts);
2219 return !changesLength() && isTransposeMask(ShuffleMask, ShuffleMask.
size());
2231 assert(Mask->getType()->isVectorTy() &&
"Shuffle needs vector constant.");
2233 getShuffleMask(Mask, MaskAsInts);
2234 return isSpliceMask(MaskAsInts, NumSrcElts,
Index);
2242 return !changesLength() &&
2243 isSpliceMask(ShuffleMask, ShuffleMask.
size(),
Index);
2250 int NumSrcElts,
int &
Index);
2253 assert(Mask->getType()->isVectorTy() &&
"Shuffle needs vector constant.");
2256 if (isa<ScalableVectorType>(Mask->getType()))
2259 getShuffleMask(Mask, MaskAsInts);
2260 return isExtractSubvectorMask(MaskAsInts, NumSrcElts,
Index);
2267 if (isa<ScalableVectorType>(
getType()))
2271 cast<FixedVectorType>(
Op<0>()->
getType())->getNumElements();
2272 return isExtractSubvectorMask(ShuffleMask, NumSrcElts,
Index);
2280 int &NumSubElts,
int &
Index);
2282 int &NumSubElts,
int &
Index) {
2283 assert(Mask->getType()->isVectorTy() &&
"Shuffle needs vector constant.");
2286 if (isa<ScalableVectorType>(Mask->getType()))
2289 getShuffleMask(Mask, MaskAsInts);
2290 return isInsertSubvectorMask(MaskAsInts, NumSrcElts, NumSubElts,
Index);
2297 if (isa<ScalableVectorType>(
getType()))
2301 cast<FixedVectorType>(
Op<0>()->
getType())->getNumElements();
2302 return isInsertSubvectorMask(ShuffleMask, NumSrcElts, NumSubElts,
Index);
2310 int &ReplicationFactor,
int &VF);
2313 assert(Mask->getType()->isVectorTy() &&
"Shuffle needs vector constant.");
2316 if (isa<ScalableVectorType>(Mask->getType()))
2319 getShuffleMask(Mask, MaskAsInts);
2320 return isReplicationMask(MaskAsInts, ReplicationFactor, VF);
2324 LLVM_ABI bool isReplicationMask(
int &ReplicationFactor,
int &VF)
const;
2339 LLVM_ABI bool isOneUseSingleSourceMask(
int VF)
const;
2344 unsigned InVecNumElts) {
2345 for (
int &
Idx : Mask) {
2348 Idx =
Idx < (int)InVecNumElts ?
Idx + InVecNumElts :
Idx - InVecNumElts;
2350 "shufflevector mask index out of range");
2355 LLVM_ABI bool isInterleave(
unsigned Factor);
2377 isInterleaveMask(
ArrayRef<int> Mask,
unsigned Factor,
unsigned NumInputElts,
2380 unsigned NumInputElts) {
2382 return isInterleaveMask(Mask, Factor, NumInputElts, StartIndexes);
2393 return isDeInterleaveMaskOfFactor(Mask, Factor, Unused);
2408 unsigned EltSizeInBits,
2409 unsigned MinSubElts,
unsigned MaxSubElts,
2410 unsigned &NumSubElts,
2411 unsigned &RotateAmt);
2415 return I->getOpcode() == Instruction::ShuffleVector;
2418 return isa<Instruction>(V) && classof(cast<Instruction>(V));
2457 const Twine &NameStr =
"",
2478 return getOperand(0);
2481 return getOperand(0);
2492 return (
unsigned)Indices.
size();
2501 return I->getOpcode() == Instruction::ExtractValue;
2504 return isa<Instruction>(V) && classof(cast<Instruction>(V));
2508ExtractValueInst::ExtractValueInst(Value *Agg, ArrayRef<unsigned> Idxs,
2509 const Twine &NameStr,
2510 InsertPosition InsertBefore)
2512 ExtractValue, Agg, InsertBefore) {
2513 init(Idxs, NameStr);
2540 const Twine &NameStr =
"",
2544 const Twine &NameStr);
2554 void *
operator new(
size_t S) {
return User::operator
new(S, AllocMarker); }
2555 void operator delete(
void *
Ptr) { User::operator
delete(
Ptr); }
2559 const Twine &NameStr =
"",
2600 return (
unsigned)Indices.
size();
2609 return I->getOpcode() == Instruction::InsertValue;
2612 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
2621InsertValueInst::InsertValueInst(
Value *Agg,
Value *Val,
2625 init(Agg, Val, Idxs, NameStr);
2643 unsigned ReservedSpace;
2647 explicit PHINode(
Type *Ty,
unsigned NumReservedValues,
2648 const Twine &NameStr =
"",
2650 :
Instruction(Ty, Instruction::PHI, AllocMarker, InsertBefore),
2651 ReservedSpace(NumReservedValues) {
2654 allocHungoffUses(ReservedSpace);
2674 const Twine &NameStr =
"",
2676 return new (AllocMarker)
2677 PHINode(Ty, NumReservedValues, NameStr, InsertBefore);
2696 return block_begin() + getNumOperands();
2700 return make_range(block_begin(), block_end());
2714 return getOperand(i);
2717 assert(V &&
"PHI node got a null value!");
2719 "All operands to PHI node must be the same type as the PHI node!");
2734 return block_begin()[i];
2741 assert(
this == U.getUser() &&
"Iterator doesn't point to PHI's Uses?");
2742 return getIncomingBlock(
unsigned(&U - op_begin()));
2749 return getIncomingBlock(
I.getUse());
2765 assert(New && Old &&
"PHI node got a null basic block!");
2766 for (
unsigned Op = 0, NumOps = getNumOperands();
Op != NumOps; ++
Op)
2767 if (getIncomingBlock(
Op) == Old)
2768 setIncomingBlock(
Op, New);
2774 if (getNumOperands() == ReservedSpace)
2777 setNumHungOffUseOperands(getNumOperands() + 1);
2778 setIncomingValue(getNumOperands() - 1, V);
2779 setIncomingBlock(getNumOperands() - 1, BB);
2791 bool DeletePHIIfEmpty =
true);
2794 int Idx = getBasicBlockIndex(BB);
2795 assert(
Idx >= 0 &&
"Invalid basic block argument to remove!");
2796 return removeIncomingValue(
Idx, DeletePHIIfEmpty);
2802 bool DeletePHIIfEmpty =
true);
2808 for (
unsigned i = 0, e = getNumOperands(); i != e; ++i)
2809 if (block_begin()[i] == BB)
2815 int Idx = getBasicBlockIndex(BB);
2816 assert(
Idx >= 0 &&
"Invalid basic block argument!");
2817 return getIncomingValue(
Idx);
2822 assert(BB &&
"PHI node got a null basic block!");
2824 for (
unsigned Op = 0, NumOps = getNumOperands();
Op != NumOps; ++
Op)
2825 if (getIncomingBlock(
Op) == BB) {
2827 setIncomingValue(
Op, V);
2830 assert(Found &&
"Invalid basic block argument to set!");
2840 LLVM_ABI bool hasConstantOrUndefValue()
const;
2847 return getBasicBlockIndex(Pred) >= 0;
2853 return I->getOpcode() == Instruction::PHI;
2856 return isa<Instruction>(V) && classof(cast<Instruction>(V));
2886 unsigned ReservedSpace;
2898 void *
operator new(
size_t S) {
return User::operator
new(S, AllocMarker); }
2901 void init(
unsigned NumReservedValues,
const Twine &NameStr);
2910 void operator delete(
void *
Ptr) { User::operator
delete(
Ptr); }
2915 unsigned NumReservedClauses,
2916 const Twine &NameStr =
"",
2925 bool isCleanup()
const {
return getSubclassData<CleanupField>(); }
2936 return cast<Constant>(getOperandList()[
Idx]);
2941 return !isa<ArrayType>(getOperandList()[
Idx]->
getType());
2946 return isa<ArrayType>(getOperandList()[
Idx]->
getType());
2958 return I->getOpcode() == Instruction::LandingPad;
2961 return isa<Instruction>(V) && classof(cast<Instruction>(V));
3009 return new (AllocMarker)
ReturnInst(
C, retVal, AllocMarker, InsertBefore);
3014 return new (AllocMarker)
ReturnInst(
C,
nullptr, AllocMarker, InsertAtEnd);
3022 return getNumOperands() != 0 ? getOperand(0) :
nullptr;
3029 return (
I->getOpcode() == Instruction::Ret);
3032 return isa<Instruction>(V) && classof(cast<Instruction>(V));
3036 BasicBlock *getSuccessor(
unsigned idx)
const {
3040 void setSuccessor(
unsigned idx, BasicBlock *
B) {
3092 std::random_access_iterator_tag, BasicBlock *,
3093 ptrdiff_t, BasicBlock *, BasicBlock *> {
3103 std::random_access_iterator_tag,
3104 const BasicBlock *, ptrdiff_t, const BasicBlock *,
3105 const BasicBlock *> {
3116 return new (AllocMarker)
BranchInst(IfTrue, AllocMarker, InsertBefore);
3123 return new (AllocMarker)
3134 assert(isConditional() &&
"Cannot get condition of an uncond branch!");
3139 assert(isConditional() &&
"Cannot set condition of unconditional branch!");
3146 assert(i < getNumSuccessors() &&
"Successor # out of range for Branch!");
3147 return cast_or_null<BasicBlock>((&
Op<-1>() - i)->
get());
3151 assert(idx < getNumSuccessors() &&
"Successor # out of range for Branch!");
3152 *(&
Op<-1>() - idx) = NewSucc;
3170 std::next(value_op_begin(), isConditional() ? 1 : 0)),
3176 return (
I->getOpcode() == Instruction::Br);
3179 return isa<Instruction>(V) && classof(cast<Instruction>(V));
3198 unsigned ReservedSpace;
3214 void *
operator new(
size_t S) {
return User::operator
new(S, AllocMarker); }
3217 void growOperands();
3226 void operator delete(
void *
Ptr) { User::operator
delete(
Ptr); }
3229 static const unsigned DefaultPseudoIndex =
static_cast<unsigned>(~0L-1);
3238 template <
typename SwitchInstT,
typename ConstantIntT,
typename BasicBlockT>
3257 assert((
unsigned)Index < SI->getNumCases() &&
3258 "Index out the number of cases.");
3259 return reinterpret_cast<ConstantIntT *
>(
SI->getOperand(2 +
Index * 2));
3264 assert(((
unsigned)Index < SI->getNumCases() ||
3265 (
unsigned)
Index == DefaultPseudoIndex) &&
3266 "Index out the number of cases.");
3267 return SI->getSuccessor(getSuccessorIndex());
3276 (
unsigned)Index < SI->getNumCases()) &&
3277 "Index out the number of cases.");
3278 return (
unsigned)
Index != DefaultPseudoIndex ?
Index + 1 : 0;
3282 assert(
SI ==
RHS.SI &&
"Incompatible operators.");
3299 assert((
unsigned)Index < SI->getNumCases() &&
3300 "Index out the number of cases.");
3301 SI->setOperand(2 +
Index*2,
reinterpret_cast<Value*
>(V));
3306 SI->setSuccessor(getSuccessorIndex(), S);
3310 template <
typename CaseHandleT>
3313 std::random_access_iterator_tag,
3314 const CaseHandleT> {
3315 using SwitchInstT =
typename CaseHandleT::SwitchInstType;
3331 unsigned SuccessorIndex) {
3332 assert(SuccessorIndex < SI->getNumSuccessors() &&
3333 "Successor index # out of range!");
3348 (
unsigned)(Case.Index +
N) <= Case.SI->getNumCases() &&
3349 "Case.Index out the number of cases.");
3357 (
unsigned)(Case.Index -
N) <= Case.SI->getNumCases() &&
3358 "Case.Index out the number of cases.");
3363 assert(Case.SI ==
RHS.Case.SI &&
"Incompatible operators.");
3364 return Case.Index -
RHS.Case.Index;
3367 return Case ==
RHS.Case;
3370 assert(Case.SI ==
RHS.Case.SI &&
"Incompatible operators.");
3371 return Case.Index <
RHS.Case.Index;
3393 return cast<BasicBlock>(getOperand(1));
3399 return isa<UnreachableInst>(getDefaultDest()->getFirstNonPHIOrDbg());
3403 setOperand(1,
reinterpret_cast<Value*
>(DefaultCase));
3409 return getNumOperands()/2 - 1;
3427 return CaseIt(
this, getNumCases());
3452 return CaseIt(
this, DefaultPseudoIndex);
3465 const_cast<const SwitchInst *
>(
this)->findCaseValue(
C)->getCaseIndex());
3471 if (
I != case_end())
3474 return case_default();
3480 if (BB == getDefaultDest())
3484 for (
auto Case : cases()) {
3485 if (Case.getCaseSuccessor() != BB)
3491 CI = Case.getCaseValue();
3514 assert(idx < getNumSuccessors() &&
"Successor idx out of range for switch!");
3515 return cast<BasicBlock>(getOperand(idx*2+1));
3518 assert(idx < getNumSuccessors() &&
"Successor # out of range for switch!");
3519 setOperand(idx * 2 + 1, NewSucc);
3524 return I->getOpcode() == Instruction::Switch;
3527 return isa<Instruction>(V) && classof(cast<Instruction>(V));
3535 std::optional<SmallVector<uint32_t, 8>> Weights;
3536 bool Changed =
false;
3589 unsigned ReservedSpace;
3603 void *
operator new(
size_t S) {
return User::operator
new(S, AllocMarker); }
3606 void growOperands();
3615 void operator delete(
void *
Ptr) { User::operator
delete(
Ptr); }
3623 std::random_access_iterator_tag, BasicBlock *,
3624 ptrdiff_t, BasicBlock *, BasicBlock *> {
3634 std::random_access_iterator_tag,
3635 const BasicBlock *, ptrdiff_t, const BasicBlock *,
3636 const BasicBlock *> {
3671 LLVM_ABI void removeDestination(
unsigned i);
3675 return cast<BasicBlock>(getOperand(i+1));
3678 setOperand(i + 1, NewSucc);
3693 return I->getOpcode() == Instruction::IndirectBr;
3696 return isa<Instruction>(V) && classof(cast<Instruction>(V));
3715 static constexpr int NumExtraOperands = 2;
3718 static constexpr int NormalDestOpEndIdx = -3;
3721 static constexpr int UnwindDestOpEndIdx = -2;
3738 static unsigned ComputeNumOperands(
unsigned NumArgs,
3739 size_t NumBundleInputs = 0) {
3742 return 1 + NumExtraOperands + NumArgs +
unsigned(NumBundleInputs);
3754 const Twine &NameStr,
3757 ComputeNumOperands(
unsigned(Args.size()))};
3758 return new (AllocMarker)
InvokeInst(Ty, Func, IfNormal, IfException, Args,
3759 {}, AllocMarker, NameStr, InsertBefore);
3765 const Twine &NameStr =
"",
3767 IntrusiveOperandsAndDescriptorAllocMarker AllocMarker{
3768 ComputeNumOperands(Args.size(), CountBundleInputs(Bundles)),
3771 return new (AllocMarker)
3772 InvokeInst(Ty, Func, IfNormal, IfException, Args, Bundles, AllocMarker,
3773 NameStr, InsertBefore);
3778 const Twine &NameStr,
3780 return Create(Func.getFunctionType(), Func.getCallee(), IfNormal,
3781 IfException, Args, {}, NameStr, InsertBefore);
3787 const Twine &NameStr =
"",
3789 return Create(Func.getFunctionType(), Func.getCallee(), IfNormal,
3790 IfException, Args, Bundles, NameStr, InsertBefore);
3799 LLVM_ABI static InvokeInst *Create(InvokeInst *
II,
3800 ArrayRef<OperandBundleDef> Bundles,
3801 InsertPosition InsertPt =
nullptr);
3822 assert(i < 2 &&
"Successor # out of range for invoke!");
3823 return i == 0 ? getNormalDest() : getUnwindDest();
3827 assert(i < 2 &&
"Successor # out of range for invoke!");
3829 setNormalDest(NewSucc);
3831 setUnwindDest(NewSucc);
3841 return (
I->getOpcode() == Instruction::Invoke);
3844 return isa<Instruction>(V) && classof(cast<Instruction>(V));
3850 template <
typename Bitfield>
3851 void setSubclassData(
typename Bitfield::Type
Value) {
3852 Instruction::setSubclassData<Bitfield>(
Value);
3856InvokeInst::InvokeInst(
FunctionType *Ty, Value *Func, BasicBlock *IfNormal,
3857 BasicBlock *IfException, ArrayRef<Value *> Args,
3858 ArrayRef<OperandBundleDef> Bundles, AllocInfo AllocInfo,
3859 const Twine &NameStr, InsertPosition InsertBefore)
3860 : CallBase(Ty->getReturnType(), Instruction::Invoke, AllocInfo,
3862 init(Ty, Func, IfNormal, IfException, Args, Bundles, NameStr);
3875 unsigned NumIndirectDests;
3891 const Twine &NameStr);
3894 static unsigned ComputeNumOperands(
int NumArgs,
int NumIndirectDests,
3895 int NumBundleInputs = 0) {
3898 return unsigned(2 + NumIndirectDests + NumArgs + NumBundleInputs);
3914 ComputeNumOperands(Args.size(), IndirectDests.
size())};
3915 return new (AllocMarker)
3916 CallBrInst(Ty, Func, DefaultDest, IndirectDests, Args, {}, AllocMarker,
3917 NameStr, InsertBefore);
3925 IntrusiveOperandsAndDescriptorAllocMarker AllocMarker{
3926 ComputeNumOperands(Args.size(), IndirectDests.
size(),
3930 return new (AllocMarker)
3931 CallBrInst(Ty, Func, DefaultDest, IndirectDests, Args, Bundles,
3932 AllocMarker, NameStr, InsertBefore);
3939 return Create(Func.getFunctionType(), Func.getCallee(), DefaultDest,
3940 IndirectDests, Args, NameStr, InsertBefore);
3947 const Twine &NameStr =
"",
3949 return Create(Func.getFunctionType(), Func.getCallee(), DefaultDest,
3950 IndirectDests, Args, Bundles, NameStr, InsertBefore);
3960 ArrayRef<OperandBundleDef> Bundles,
3961 InsertPosition InsertBefore =
nullptr);
3990 return IndirectDests;
4001 "Successor # out of range for callbr!");
4007 "Successor # out of range for callbr!");
4015 return (
I->getOpcode() == Instruction::CallBr);
4018 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
4024 template <
typename Bitfield>
4025 void setSubclassData(
typename Bitfield::Type
Value) {
4026 Instruction::setSubclassData<Bitfield>(
Value);
4030CallBrInst::CallBrInst(
FunctionType *Ty, Value *Func, BasicBlock *DefaultDest,
4031 ArrayRef<BasicBlock *> IndirectDests,
4032 ArrayRef<Value *> Args,
4033 ArrayRef<OperandBundleDef> Bundles, AllocInfo AllocInfo,
4034 const Twine &NameStr, InsertPosition InsertBefore)
4035 : CallBase(Ty->getReturnType(), Instruction::CallBr, AllocInfo,
4037 init(Ty, Func, DefaultDest, IndirectDests, Args, Bundles, NameStr);
4063 return new (AllocMarker)
ResumeInst(Exn, InsertBefore);
4076 return I->getOpcode() == Instruction::Resume;
4079 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
4083 BasicBlock *getSuccessor(
unsigned idx)
const {
4087 void setSuccessor(
unsigned idx,
BasicBlock *NewSucc) {
4109 unsigned ReservedSpace;
4121 unsigned NumHandlers,
const Twine &NameStr,
4125 void *
operator new(
size_t S) {
return User::operator
new(S, AllocMarker); }
4127 void init(
Value *ParentPad,
BasicBlock *UnwindDest,
unsigned NumReserved);
4128 void growOperands(
unsigned Size);
4137 void operator delete(
void *
Ptr) {
return User::operator
delete(
Ptr); }
4140 unsigned NumHandlers,
4141 const Twine &NameStr =
"",
4143 return new CatchSwitchInst(ParentPad, UnwindDest, NumHandlers, NameStr,
4158 if (hasUnwindDest())
4159 return cast<BasicBlock>(getOperand(1));
4165 setOperand(1, UnwindDest);
4171 if (hasUnwindDest())
4172 return getNumOperands() - 2;
4173 return getNumOperands() - 1;
4177 static BasicBlock *handler_helper(
Value *V) {
return cast<BasicBlock>(V); }
4178 static const BasicBlock *handler_helper(
const Value *V) {
4179 return cast<BasicBlock>(V);
4194 if (hasUnwindDest())
4203 if (hasUnwindDest())
4222 return make_range(handler_begin(), handler_end());
4227 return make_range(handler_begin(), handler_end());
4236 LLVM_ABI void removeHandler(handler_iterator HI);
4241 "Successor # out of range for catchswitch!");
4242 return cast<BasicBlock>(getOperand(
Idx + 1));
4246 "Successor # out of range for catchswitch!");
4247 setOperand(
Idx + 1, NewSucc);
4252 return I->getOpcode() == Instruction::CatchSwitch;
4255 return isa<Instruction>(V) && classof(cast<Instruction>(V));
4273 NameStr, InsertBefore) {}
4277 const Twine &NameStr =
"",
4279 IntrusiveOperandsAllocMarker AllocMarker{
unsigned(1 + Args.size())};
4280 return new (AllocMarker)
4281 CleanupPadInst(ParentPad, Args, AllocMarker, NameStr, InsertBefore);
4286 return I->getOpcode() == Instruction::CleanupPad;
4289 return isa<Instruction>(V) && classof(cast<Instruction>(V));
4302 NameStr, InsertBefore) {}
4306 const Twine &NameStr =
"",
4309 return new (AllocMarker)
4310 CatchPadInst(CatchSwitch, Args, AllocMarker, NameStr, InsertBefore);
4315 return cast<CatchSwitchInst>(
Op<-1>());
4319 Op<-1>() = CatchSwitch;
4324 return I->getOpcode() == Instruction::CatchPad;
4327 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
4383 return (
I->getOpcode() == Instruction::CatchRet);
4386 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
4433 unsigned Values = 1;
4437 return new (AllocMarker)
4449 return cast<CleanupPadInst>(
Op<0>());
4453 Op<0>() = CleanupPad;
4459 return hasUnwindDest() ? cast<BasicBlock>(
Op<1>()) :
nullptr;
4469 return (
I->getOpcode() == Instruction::CleanupRet);
4472 return isa<Instruction>(V) && classof(cast<Instruction>(V));
4478 return getUnwindDest();
4481 void setSuccessor(
unsigned Idx, BasicBlock *
B) {
4488 template <
typename Bitfield>
4489 void setSubclassData(
typename Bitfield::Type Value) {
4490 Instruction::setSubclassData<Bitfield>(Value);
4523 void *
operator new(
size_t S) {
return User::operator
new(S, AllocMarker); }
4524 void operator delete(
void *
Ptr) { User::operator
delete(
Ptr); }
4530 return I->getOpcode() == Instruction::Unreachable;
4533 return isa<Instruction>(V) && classof(cast<Instruction>(V));
4537 LLVM_ABI bool shouldLowerToTrap(
bool TrapUnreachable,
4538 bool NoTrapAfterNoreturn)
const;
4541 BasicBlock *getSuccessor(
unsigned idx)
const {
4545 void setSuccessor(
unsigned idx, BasicBlock *
B) {
4570 const Twine &NameStr =
"",
4577 return I->getOpcode() == Trunc;
4580 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
4606 unsigned NoWrapKind = 0;
4635 const Twine &NameStr =
"",
4642 return I->getOpcode() == ZExt;
4645 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
4667 const Twine &NameStr =
"",
4674 return I->getOpcode() == SExt;
4677 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
4698 const Twine &NameStr =
"",
4705 return I->getOpcode() == FPTrunc;
4708 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
4730 const Twine &NameStr =
"",
4737 return I->getOpcode() == FPExt;
4740 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
4762 const Twine &NameStr =
"",
4769 return I->getOpcode() == UIToFP;
4772 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
4794 const Twine &NameStr =
"",
4801 return I->getOpcode() == SIToFP;
4804 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
4826 const Twine &NameStr =
"",
4833 return I->getOpcode() == FPToUI;
4836 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
4858 const Twine &NameStr =
"",
4865 return I->getOpcode() == FPToSI;
4868 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
4886 const Twine &NameStr =
"",
4901 return I->getOpcode() == IntToPtr;
4904 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
4926 const Twine &NameStr =
"",
4945 return I->getOpcode() == PtrToInt;
4948 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
4966 const Twine &NameStr =
"",
4985 return I->getOpcode() == PtrToAddr;
4988 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
5010 const Twine &NameStr =
"",
5017 return I->getOpcode() == BitCast;
5020 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
5043 const Twine &NameStr =
"",
5050 return I->getOpcode() == AddrSpaceCast;
5053 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
5089 if (
auto *Load = dyn_cast<LoadInst>(V))
5090 return Load->getPointerOperand();
5091 if (
auto *Store = dyn_cast<StoreInst>(V))
5092 return Store->getPointerOperand();
5096 return const_cast<Value *
>(
5105 if (
auto *Gep = dyn_cast<GetElementPtrInst>(V))
5106 return Gep->getPointerOperand();
5115 assert((isa<LoadInst>(
I) || isa<StoreInst>(
I)) &&
5116 "Expected Load or Store instruction");
5117 if (
auto *LI = dyn_cast<LoadInst>(
I))
5118 return LI->getAlign();
5119 return cast<StoreInst>(
I)->getAlign();
5124 assert((isa<LoadInst>(
I) || isa<StoreInst>(
I)) &&
5125 "Expected Load or Store instruction");
5126 if (
auto *LI = dyn_cast<LoadInst>(
I))
5127 LI->setAlignment(NewAlign);
5129 cast<StoreInst>(
I)->setAlignment(NewAlign);
5135 assert((isa<LoadInst>(
I) || isa<StoreInst>(
I)) &&
5136 "Expected Load or Store instruction");
5137 if (
auto *LI = dyn_cast<LoadInst>(
I))
5138 return LI->getPointerAddressSpace();
5139 return cast<StoreInst>(
I)->getPointerAddressSpace();
5144 assert((isa<LoadInst>(
I) || isa<StoreInst>(
I)) &&
5145 "Expected Load or Store instruction");
5146 if (
auto *LI = dyn_cast<LoadInst>(
I))
5147 return LI->getType();
5148 return cast<StoreInst>(
I)->getValueOperand()->getType();
5155 return std::nullopt;
5156 if (
auto *AI = dyn_cast<LoadInst>(
I))
5157 return AI->getSyncScopeID();
5158 if (
auto *AI = dyn_cast<StoreInst>(
I))
5159 return AI->getSyncScopeID();
5160 if (
auto *AI = dyn_cast<FenceInst>(
I))
5161 return AI->getSyncScopeID();
5162 if (
auto *AI = dyn_cast<AtomicCmpXchgInst>(
I))
5163 return AI->getSyncScopeID();
5164 if (
auto *AI = dyn_cast<AtomicRMWInst>(
I))
5165 return AI->getSyncScopeID();
5172 if (
auto *AI = dyn_cast<LoadInst>(
I))
5173 AI->setSyncScopeID(SSID);
5174 else if (
auto *AI = dyn_cast<StoreInst>(
I))
5175 AI->setSyncScopeID(SSID);
5176 else if (
auto *AI = dyn_cast<FenceInst>(
I))
5177 AI->setSyncScopeID(SSID);
5178 else if (
auto *AI = dyn_cast<AtomicCmpXchgInst>(
I))
5179 AI->setSyncScopeID(SSID);
5180 else if (
auto *AI = dyn_cast<AtomicRMWInst>(
I))
5181 AI->setSyncScopeID(SSID);
5206 return I->getOpcode() == Freeze;
5209 return isa<Instruction>(V) &&
classof(cast<Instruction>(V));
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isReverseMask(ArrayRef< int > M, EVT VT)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Atomic ordering constants.
static const Function * getParent(const Value *V)
This file implements methods to test, set and extract typed bits from packed unsigned integers.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
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 various utilities for inspecting and working with the control flow graph in LLVM I...
This defines the Use class.
This file implements a map that provides insertion order iteration.
uint64_t IntrinsicInst * II
#define DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CLASS, VALUECLASS)
Macro for generating out-of-class operand accessor definitions.
PowerPC Reduce CR logical Operation
StandardInstrumentations SI(Mod->getContext(), Debug, VerifyEach)
const SmallVectorImpl< MachineOperand > & Cond
This file defines the SmallVector class.
static SymbolRef::Type getType(const Symbol *Sym)
Class for arbitrary precision integers.
This class represents a conversion between pointers from one address space to another.
const Value * getPointerOperand() const
Gets the pointer operand.
LLVM_ABI AddrSpaceCastInst * cloneImpl() const
Clone an identical AddrSpaceCastInst.
Value * getPointerOperand()
Gets the pointer operand.
static bool classof(const Instruction *I)
static bool classof(const Value *V)
unsigned getSrcAddressSpace() const
Returns the address space of the pointer operand.
unsigned getDestAddressSpace() const
Returns the address space of the result.
static unsigned getPointerOperandIndex()
Gets the operand index of the pointer operand.
an instruction to allocate memory on the stack
LLVM_ABI std::optional< TypeSize > getAllocationSizeInBits(const DataLayout &DL) const
Get allocation size in bits.
static bool classof(const Value *V)
bool isSwiftError() const
Return true if this alloca is used as a swifterror argument to a call.
void setSwiftError(bool V)
Specify whether this alloca is used to represent a swifterror.
LLVM_ABI bool isStaticAlloca() const
Return true if this alloca is in the entry block of the function and is a constant size.
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
void setAllocatedType(Type *Ty)
for use only in special circumstances that need to generically transform a whole instruction (eg: IR ...
static bool classof(const Instruction *I)
PointerType * getType() const
Overload to return most specific pointer type.
void setUsedWithInAlloca(bool V)
Specify whether this alloca is used to represent the arguments to a call.
LLVM_ABI AllocaInst * cloneImpl() const
Type * getAllocatedType() const
Return the type that is being allocated by the instruction.
bool isUsedWithInAlloca() const
Return true if this alloca is used as an inalloca argument to a call.
unsigned getAddressSpace() const
Return the address space for the allocation.
LLVM_ABI std::optional< TypeSize > getAllocationSize(const DataLayout &DL) const
Get allocation size in bytes.
LLVM_ABI bool isArrayAllocation() const
Return true if there is an allocation size parameter to the allocation instruction that is not 1.
void setAlignment(Align Align)
const Value * getArraySize() const
Get the number of elements allocated.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
An instruction that atomically checks whether a specified value is in a memory location,...
BoolBitfieldElementT< 0 > VolatileField
const Value * getCompareOperand() const
Value * getNewValOperand()
void setSyncScopeID(SyncScope::ID SSID)
Sets the synchronization scope ID of this cmpxchg instruction.
AtomicOrdering getMergedOrdering() const
Returns a single ordering which is at least as strong as both the success and failure orderings for t...
void setWeak(bool IsWeak)
bool isVolatile() const
Return true if this is a cmpxchg from a volatile memory location.
unsigned getPointerAddressSpace() const
Returns the address space of the pointer operand.
BoolBitfieldElementT< VolatileField::NextBit > WeakField
AtomicOrderingBitfieldElementT< SuccessOrderingField::NextBit > FailureOrderingField
Value * getCompareOperand()
void setFailureOrdering(AtomicOrdering Ordering)
Sets the failure ordering constraint of this cmpxchg instruction.
static bool isValidFailureOrdering(AtomicOrdering Ordering)
AtomicOrdering getFailureOrdering() const
Returns the failure ordering constraint of this cmpxchg instruction.
void setSuccessOrdering(AtomicOrdering Ordering)
Sets the success ordering constraint of this cmpxchg instruction.
AlignmentBitfieldElementT< FailureOrderingField::NextBit > AlignmentField
Value * getPointerOperand()
static AtomicOrdering getStrongestFailureOrdering(AtomicOrdering SuccessOrdering)
Returns the strongest permitted ordering on failure, given the desired ordering on success.
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
LLVM_ABI AtomicCmpXchgInst * cloneImpl() const
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
const Value * getPointerOperand() const
static bool classof(const Value *V)
bool isWeak() const
Return true if this cmpxchg may spuriously fail.
void setAlignment(Align Align)
void setVolatile(bool V)
Specify whether this is a volatile cmpxchg.
static bool isValidSuccessOrdering(AtomicOrdering Ordering)
AtomicOrdering getSuccessOrdering() const
Returns the success ordering constraint of this cmpxchg instruction.
AtomicOrderingBitfieldElementT< WeakField::NextBit > SuccessOrderingField
static unsigned getPointerOperandIndex()
const Value * getNewValOperand() const
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID of this cmpxchg instruction.
static bool classof(const Instruction *I)
an instruction that atomically reads a memory location, combines it with another value,...
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
static bool isFPOperation(BinOp Op)
static unsigned getPointerOperandIndex()
bool isVolatile() const
Return true if this is a RMW on a volatile memory location.
void setVolatile(bool V)
Specify whether this is a volatile RMW or not.
BinOpBitfieldElement< AtomicOrderingField::NextBit > OperationField
BinOp
This enumeration lists the possible modifications atomicrmw can make.
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
AtomicOrderingBitfieldElementT< VolatileField::NextBit > AtomicOrderingField
void setSyncScopeID(SyncScope::ID SSID)
Sets the synchronization scope ID of this rmw instruction.
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
Value * getPointerOperand()
void setOrdering(AtomicOrdering Ordering)
Sets the ordering constraint of this rmw instruction.
bool isFloatingPointOperation() const
static bool classof(const Instruction *I)
const Value * getPointerOperand() const
void setOperation(BinOp Operation)
static bool classof(const Value *V)
BinOp getOperation() const
const Value * getValOperand() const
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID of this rmw instruction.
void setAlignment(Align Align)
AtomicOrdering getOrdering() const
Returns the ordering constraint of this rmw instruction.
AlignmentBitfieldElementT< OperationField::NextBit > AlignmentField
BoolBitfieldElementT< 0 > VolatileField
unsigned getPointerAddressSpace() const
Returns the address space of the pointer operand.
LLVM Basic Block Representation.
This class represents a no-op cast from one type to another.
static bool classof(const Instruction *I)
static bool classof(const Value *V)
LLVM_ABI BitCastInst * cloneImpl() const
Clone an identical BitCastInst.
Conditional or Unconditional Branch instruction.
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
iterator_range< succ_op_iterator > successors()
static BranchInst * Create(BasicBlock *IfTrue, BasicBlock *IfFalse, Value *Cond, InsertPosition InsertBefore=nullptr)
void setCondition(Value *V)
static bool classof(const Instruction *I)
bool isConditional() const
unsigned getNumSuccessors() const
static bool classof(const Value *V)
static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)
BasicBlock * getSuccessor(unsigned i) const
bool isUnconditional() const
void setSuccessor(unsigned idx, BasicBlock *NewSucc)
Value * getCondition() const
iterator_range< const_succ_op_iterator > successors() const
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
void addFnAttr(Attribute::AttrKind Kind)
Adds the attribute to the function.
bool hasFnAttr(Attribute::AttrKind Kind) const
Determine whether this call has the given attribute.
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
static unsigned CountBundleInputs(ArrayRef< OperandBundleDef > Bundles)
Return the total number of values used in Bundles.
unsigned arg_size() const
unsigned getNumTotalBundleOperands() const
Return the total number operands (not operand bundles) used by every operand bundle in this OperandBu...
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
static bool classof(const Value *V)
static CallBrInst * Create(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, ArrayRef< OperandBundleDef > Bundles={}, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static bool classof(const Instruction *I)
static CallBrInst * Create(FunctionCallee Func, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, ArrayRef< OperandBundleDef > Bundles={}, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
SmallVector< BasicBlock *, 16 > getIndirectDests() const
static CallBrInst * Create(FunctionCallee Func, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
void setSuccessor(unsigned i, BasicBlock *NewSucc)
BasicBlock * getSuccessor(unsigned i) const
Value * getIndirectDestLabelUse(unsigned i) const
BasicBlock * getIndirectDest(unsigned i) const
void setDefaultDest(BasicBlock *B)
unsigned getNumSuccessors() const
void setIndirectDest(unsigned i, BasicBlock *B)
Value * getIndirectDestLabel(unsigned i) const
getIndirectDestLabel - Return the i-th indirect dest label.
BasicBlock * getDefaultDest() const
unsigned getNumIndirectDests() const
Return the number of callbr indirect dest labels.
static CallBrInst * Create(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
LLVM_ABI CallBrInst * cloneImpl() const
This class represents a function call, abstracting a target machine's calling convention.
bool isNoTailCall() const
LLVM_ABI void updateProfWeight(uint64_t S, uint64_t T)
Updates profile metadata by scaling it by S / T.
static bool classof(const Value *V)
void setTailCallKind(TailCallKind TCK)
static CallInst * Create(FunctionType *Ty, Value *Func, ArrayRef< Value * > Args, ArrayRef< OperandBundleDef > Bundles={}, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CallInst * Create(FunctionType *Ty, Value *Func, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
bool canReturnTwice() const
Return true if the call can return twice.
TailCallKind getTailCallKind() const
LLVM_ABI CallInst * cloneImpl() const
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
void setTailCall(bool IsTc=true)
bool isMustTailCall() const
static CallInst * Create(FunctionCallee Func, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
static bool classof(const Instruction *I)
bool isNonContinuableTrap() const
Return true if the call is for a noreturn trap intrinsic.
static CallInst * Create(FunctionCallee Func, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CallInst * Create(FunctionCallee Func, ArrayRef< Value * > Args, ArrayRef< OperandBundleDef > Bundles={}, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This is the base class for all instructions that perform data casts.
CatchSwitchInst * getCatchSwitch() const
Convenience accessors.
void setCatchSwitch(Value *CatchSwitch)
static bool classof(const Instruction *I)
Methods for support type inquiry through isa, cast, and dyn_cast:
static CatchPadInst * Create(Value *CatchSwitch, ArrayRef< Value * > Args, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static bool classof(const Value *V)
static bool classof(const Instruction *I)
BasicBlock * getSuccessor() const
CatchPadInst * getCatchPad() const
Convenience accessors.
void setSuccessor(BasicBlock *NewSucc)
static bool classof(const Value *V)
static CatchReturnInst * Create(Value *CatchPad, BasicBlock *BB, InsertPosition InsertBefore=nullptr)
unsigned getNumSuccessors() const
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Provide fast operand accessors.
void setCatchPad(CatchPadInst *CatchPad)
LLVM_ABI CatchReturnInst * cloneImpl() const
Value * getCatchSwitchParentPad() const
Get the parentPad of this catchret's catchpad's catchswitch.
void setUnwindDest(BasicBlock *UnwindDest)
static bool classof(const Instruction *I)
BasicBlock *(*)(Value *) DerefFnTy
const BasicBlock *(*)(const Value *) ConstDerefFnTy
unsigned getNumSuccessors() const
const_handler_iterator handler_begin() const
Returns an iterator that points to the first handler in the CatchSwitchInst.
unsigned getNumHandlers() const
return the number of 'handlers' in this catchswitch instruction, except the default handler
void setSuccessor(unsigned Idx, BasicBlock *NewSucc)
Value * getParentPad() const
void setParentPad(Value *ParentPad)
bool unwindsToCaller() const
static bool classof(const Value *V)
handler_iterator handler_end()
Returns a read-only iterator that points one past the last handler in the CatchSwitchInst.
BasicBlock * getUnwindDest() const
BasicBlock * getSuccessor(unsigned Idx) const
const_handler_iterator handler_end() const
Returns an iterator that points one past the last handler in the CatchSwitchInst.
bool hasUnwindDest() const
handler_iterator handler_begin()
Returns an iterator that points to the first handler in CatchSwitchInst.
static CatchSwitchInst * Create(Value *ParentPad, BasicBlock *UnwindDest, unsigned NumHandlers, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
handler_range handlers()
iteration adapter for range-for loops.
const_handler_range handlers() const
iteration adapter for range-for loops.
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Provide fast operand accessors.
static bool classof(const Value *V)
static bool classof(const Instruction *I)
Methods for support type inquiry through isa, cast, and dyn_cast:
static CleanupPadInst * Create(Value *ParentPad, ArrayRef< Value * > Args={}, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static bool classof(const Instruction *I)
CleanupPadInst * getCleanupPad() const
Convenience accessor.
unsigned getNumSuccessors() const
BasicBlock * getUnwindDest() const
bool unwindsToCaller() const
void setCleanupPad(CleanupPadInst *CleanupPad)
static bool classof(const Value *V)
void setUnwindDest(BasicBlock *NewDest)
static CleanupReturnInst * Create(Value *CleanupPad, BasicBlock *UnwindBB=nullptr, InsertPosition InsertBefore=nullptr)
bool hasUnwindDest() const
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Provide fast operand accessors.
This class is the base class for the comparison instructions.
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
void setPredicate(Predicate P)
Set the predicate for this instruction to the specified value.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
static auto FCmpPredicates()
Returns the sequence of all FCmp predicates.
bool isFPPredicate() const
Predicate getPredicate() const
Return the predicate for this instruction.
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
bool hasSameSign() const
Query samesign information, for optimizations.
This is the shared class of boolean and integer constants.
This is an important base class in LLVM.
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
This instruction compares its operands according to the predicate given to the constructor.
bool isRelational() const
FCmpInst(Predicate Pred, Value *LHS, Value *RHS, const Twine &NameStr="", Instruction *FlagsSource=nullptr)
Constructor with no-insertion semantics.
static bool classof(const Value *V)
bool isCommutative() const
static bool isCommutative(Predicate Pred)
static LLVM_ABI bool compare(const APFloat &LHS, const APFloat &RHS, FCmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
static bool isEquality(Predicate Pred)
static bool classof(const Instruction *I)
Methods for support type inquiry through isa, cast, and dyn_cast:
static auto predicates()
Returns the sequence of all FCmp predicates.
LLVM_ABI FCmpInst * cloneImpl() const
Clone an identical FCmpInst.
void swapOperands()
Exchange the two operands to this instruction in such a way that it does not modify the semantics of ...
FCmpInst(InsertPosition InsertBefore, Predicate pred, Value *LHS, Value *RHS, const Twine &NameStr="")
Constructor with insertion semantics.
This class represents an extension of floating point types.
static bool classof(const Value *V)
LLVM_ABI FPExtInst * cloneImpl() const
Clone an identical FPExtInst.
static bool classof(const Instruction *I)
Methods for support type inquiry through isa, cast, and dyn_cast:
This class represents a cast from floating point to signed integer.
static bool classof(const Value *V)
LLVM_ABI FPToSIInst * cloneImpl() const
Clone an identical FPToSIInst.
static bool classof(const Instruction *I)
Methods for support type inquiry through isa, cast, and dyn_cast:
This class represents a cast from floating point to unsigned integer.
static bool classof(const Value *V)
static bool classof(const Instruction *I)
Methods for support type inquiry through isa, cast, and dyn_cast:
LLVM_ABI FPToUIInst * cloneImpl() const
Clone an identical FPToUIInst.
This class represents a truncation of floating point types.
static bool classof(const Instruction *I)
Methods for support type inquiry through isa, cast, and dyn_cast:
static bool classof(const Value *V)
LLVM_ABI FPTruncInst * cloneImpl() const
Clone an identical FPTruncInst.
An instruction for ordering other memory operations.
static bool classof(const Value *V)
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID of this fence instruction.
void setSyncScopeID(SyncScope::ID SSID)
Sets the synchronization scope ID of this fence instruction.
static bool classof(const Instruction *I)
void setOrdering(AtomicOrdering Ordering)
Sets the ordering constraint of this fence instruction.
AtomicOrdering getOrdering() const
Returns the ordering constraint of this fence instruction.
This class represents a freeze function that returns random concrete value if an operand is either a ...
static bool classof(const Value *V)
LLVM_ABI FreezeInst * cloneImpl() const
Clone an identical FreezeInst.
static bool classof(const Instruction *I)
friend class CatchPadInst
A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...
Class to represent function types.
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags inBounds()
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
LLVM_ABI bool isInBounds() const
Determine whether the GEP has the inbounds flag.
LLVM_ABI bool hasNoUnsignedSignedWrap() const
Determine whether the GEP has the nusw flag.
static LLVM_ABI Type * getTypeAtIndex(Type *Ty, Value *Idx)
Return the type of the element at the given index of an indexable type.
Value * getPointerOperand()
LLVM_ABI bool hasAllZeroIndices() const
Return true if all of the indices of this GEP are zeros.
static Type * getGEPReturnType(Value *Ptr, ArrayRef< Value * > IdxList)
Returns the pointer type returned by the GEP instruction, which may be a vector of pointers.
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
void setResultElementType(Type *Ty)
LLVM_ABI bool hasNoUnsignedWrap() const
Determine whether the GEP has the nuw flag.
LLVM_ABI bool hasAllConstantIndices() const
Return true if all of the indices of this GEP are constant integers.
unsigned getAddressSpace() const
Returns the address space of this instruction's pointer type.
iterator_range< const_op_iterator > indices() const
Type * getResultElementType() const
static bool classof(const Instruction *I)
static bool classof(const Value *V)
iterator_range< op_iterator > indices()
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
LLVM_ABI void setIsInBounds(bool b=true)
Set or clear the inbounds flag on this GEP instruction.
void setSourceElementType(Type *Ty)
static LLVM_ABI Type * getIndexedType(Type *Ty, ArrayRef< Value * > IdxList)
Returns the result type of a getelementptr with the given source element type and indexes.
Type * getSourceElementType() const
static GetElementPtrInst * CreateInBounds(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Create an "inbounds" getelementptr.
Type * getPointerOperandType() const
Method to return the pointer operand as a PointerType.
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, GEPNoWrapFlags NW, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static unsigned getPointerOperandIndex()
LLVM_ABI bool accumulateConstantOffset(const DataLayout &DL, APInt &Offset) const
Accumulate the constant address offset of this GEP if possible.
const_op_iterator idx_begin() const
LLVM_ABI GetElementPtrInst * cloneImpl() const
LLVM_ABI bool collectOffset(const DataLayout &DL, unsigned BitWidth, SmallMapVector< Value *, APInt, 4 > &VariableOffsets, APInt &ConstantOffset) const
LLVM_ABI void setNoWrapFlags(GEPNoWrapFlags NW)
Set nowrap flags for GEP instruction.
unsigned getNumIndices() const
LLVM_ABI GEPNoWrapFlags getNoWrapFlags() const
Get the nowrap flags for the GEP instruction.
const_op_iterator idx_end() const
const Value * getPointerOperand() const
unsigned getPointerAddressSpace() const
Returns the address space of the pointer operand.
This instruction compares its operands according to the predicate given to the constructor.
bool hasSameSign() const
An icmp instruction, which can be marked as "samesign", indicating that the two operands have the sam...
static bool classof(const Value *V)
void setSameSign(bool B=true)
ICmpInst(InsertPosition InsertBefore, Predicate pred, Value *LHS, Value *RHS, const Twine &NameStr="")
Constructor with insertion semantics.
static bool isCommutative(Predicate P)
static CmpPredicate getSwappedCmpPredicate(CmpPredicate Pred)
CmpPredicate getCmpPredicate() const
bool isCommutative() const
static bool isGE(Predicate P)
Return true if the predicate is SGE or UGE.
CmpPredicate getSwappedCmpPredicate() const
static bool isLT(Predicate P)
Return true if the predicate is SLT or ULT.
CmpPredicate getInverseCmpPredicate() const
Predicate getNonStrictCmpPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
static bool isGT(Predicate P)
Return true if the predicate is SGT or UGT.
static bool classof(const Instruction *I)
Predicate getFlippedSignednessPredicate() const
For example, SLT->ULT, ULT->SLT, SLE->ULE, ULE->SLE, EQ->EQ.
static CmpPredicate getNonStrictCmpPredicate(CmpPredicate Pred)
Predicate getSignedPredicate() const
For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
static CmpPredicate getInverseCmpPredicate(CmpPredicate Pred)
bool isEquality() const
Return true if this predicate is either EQ or NE.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
static bool isRelational(Predicate P)
Return true if the predicate is relational (not EQ or NE).
void swapOperands()
Exchange the two operands to this instruction in such a way that it does not modify the semantics of ...
static auto predicates()
Returns the sequence of all ICmp predicates.
ICmpInst(Predicate pred, Value *LHS, Value *RHS, const Twine &NameStr="")
Constructor with no-insertion semantics.
bool isRelational() const
Return true if the predicate is relational (not EQ or NE).
Predicate getUnsignedPredicate() const
For example, EQ->EQ, SLE->ULE, UGT->UGT, etc.
static bool isLE(Predicate P)
Return true if the predicate is SLE or ULE.
Indirect Branch Instruction.
static IndirectBrInst * Create(Value *Address, unsigned NumDests, InsertPosition InsertBefore=nullptr)
BasicBlock * getDestination(unsigned i)
Return the specified destination.
static bool classof(const Value *V)
const Value * getAddress() const
static bool classof(const Instruction *I)
BasicBlock * getSuccessor(unsigned i) const
iterator_range< const_succ_op_iterator > successors() const
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Provide fast operand accessors.
unsigned getNumDestinations() const
return the number of possible destinations in this indirectbr instruction.
const BasicBlock * getDestination(unsigned i) const
void setSuccessor(unsigned i, BasicBlock *NewSucc)
void setAddress(Value *V)
unsigned getNumSuccessors() const
iterator_range< succ_op_iterator > successors()
This instruction inserts a single (scalar) element into a VectorType value.
static bool classof(const Value *V)
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
VectorType * getType() const
Overload to return most specific vector type.
static bool classof(const Instruction *I)
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
This instruction inserts a struct field of array element value into an aggregate value.
Value * getInsertedValueOperand()
static bool classof(const Instruction *I)
static unsigned getAggregateOperandIndex()
Value * getAggregateOperand()
static bool classof(const Value *V)
unsigned getNumIndices() const
ArrayRef< unsigned > getIndices() const
iterator_range< idx_iterator > indices() const
static unsigned getInsertedValueOperandIndex()
LLVM_ABI InsertValueInst * cloneImpl() const
idx_iterator idx_end() const
static InsertValueInst * Create(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
const Value * getAggregateOperand() const
const Value * getInsertedValueOperand() const
idx_iterator idx_begin() const
typename Bitfield::Element< AtomicOrdering, Offset, 3, AtomicOrdering::LAST > AtomicOrderingBitfieldElementT
typename Bitfield::Element< bool, Offset, 1 > BoolBitfieldElementT
LLVM_ABI bool isAtomic() const LLVM_READONLY
Return true if this instruction has an AtomicOrdering of unordered or higher.
typename Bitfield::Element< unsigned, Offset, 6, Value::MaxAlignmentExponent > AlignmentBitfieldElementT
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
LLVM_ABI void copyMetadata(const Instruction &SrcInst, ArrayRef< unsigned > WL=ArrayRef< unsigned >())
Copy metadata from SrcInst to this instruction.
friend class BasicBlock
Various leaf nodes.
This class represents a cast from an integer to a pointer.
static bool classof(const Instruction *I)
LLVM_ABI IntToPtrInst * cloneImpl() const
Clone an identical IntToPtrInst.
unsigned getAddressSpace() const
Returns the address space of this instruction's pointer type.
static bool classof(const Value *V)
static bool classof(const Instruction *I)
BasicBlock * getUnwindDest() const
void setNormalDest(BasicBlock *B)
static bool classof(const Value *V)
static InvokeInst * Create(FunctionCallee Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
void setSuccessor(unsigned i, BasicBlock *NewSucc)
static InvokeInst * Create(FunctionCallee Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, ArrayRef< OperandBundleDef > Bundles={}, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
BasicBlock * getSuccessor(unsigned i) const
void setUnwindDest(BasicBlock *B)
BasicBlock * getNormalDest() const
static InvokeInst * Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, ArrayRef< OperandBundleDef > Bundles={}, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
unsigned getNumSuccessors() const
static InvokeInst * Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
This is an important class for using LLVM in a threaded context.
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.
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Provide fast operand accessors.
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.
static bool classof(const Value *V)
void setCleanup(bool V)
Indicate that this landingpad instruction is a cleanup.
void reserveClauses(unsigned Size)
Grow the size of the operand list to accommodate the new number of clauses.
static bool classof(const Instruction *I)
An instruction for reading from memory.
unsigned getPointerAddressSpace() const
Returns the address space of the pointer operand.
const Value * getPointerOperand() const
void setAlignment(Align Align)
Value * getPointerOperand()
bool isVolatile() const
Return true if this is a load from a volatile memory location.
static bool classof(const Instruction *I)
void setOrdering(AtomicOrdering Ordering)
Sets the ordering constraint of this load instruction.
static bool classof(const Value *V)
void setSyncScopeID(SyncScope::ID SSID)
Sets the synchronization scope ID of this load instruction.
void setAtomic(AtomicOrdering Ordering, SyncScope::ID SSID=SyncScope::System)
Sets the ordering constraint and the synchronization scope ID of this load instruction.
LLVM_ABI LoadInst * cloneImpl() const
AtomicOrdering getOrdering() const
Returns the ordering constraint of this load instruction.
Type * getPointerOperandType() const
static unsigned getPointerOperandIndex()
void setVolatile(bool V)
Specify whether this is a volatile load or not.
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.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
BasicBlock * getIncomingBlock(Value::const_user_iterator I) const
Return incoming basic block corresponding to value use iterator.
static bool classof(const Instruction *I)
Methods for support type inquiry through isa, cast, and dyn_cast:
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
bool isComplete() const
If the PHI node is complete which means all of its parent's predecessors have incoming value in this ...
iterator_range< const_block_iterator > blocks() const
op_range incoming_values()
static bool classof(const Value *V)
void allocHungoffUses(unsigned N)
const_block_iterator block_begin() const
void setIncomingValueForBlock(const BasicBlock *BB, Value *V)
Set every incoming value(s) for block BB to V.
void setIncomingBlock(unsigned i, BasicBlock *BB)
BasicBlock *const * const_block_iterator
void setIncomingValue(unsigned i, Value *V)
static unsigned getOperandNumForIncomingValue(unsigned i)
void copyIncomingBlocks(iterator_range< const_block_iterator > BBRange, uint32_t ToIdx=0)
Copies the basic blocks from BBRange to the incoming basic block list of this PHINode,...
const_block_iterator block_end() const
Value * getIncomingValueForBlock(const BasicBlock *BB) const
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Provide fast operand accessors.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
static unsigned getIncomingValueNumForOperand(unsigned i)
const_op_range incoming_values() const
Value * removeIncomingValue(const BasicBlock *BB, bool DeletePHIIfEmpty=true)
void replaceIncomingBlockWith(const BasicBlock *Old, BasicBlock *New)
Replace every incoming basic block Old to basic block New.
BasicBlock * getIncomingBlock(const Use &U) const
Return incoming basic block corresponding to an operand of the PHI.
int getBasicBlockIndex(const BasicBlock *BB) const
Return the first index of the specified basic block in the value list for this PHI.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
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...
Class to represent pointers.
unsigned getAddressSpace() const
Return the address space of the Pointer type.
This class represents a cast from a pointer to an address (non-capturing ptrtoint).
static unsigned getPointerOperandIndex()
Gets the operand index of the pointer operand.
static bool classof(const Instruction *I)
PtrToAddrInst * cloneImpl() const
Clone an identical PtrToAddrInst.
static bool classof(const Value *V)
const Value * getPointerOperand() const
Gets the pointer operand.
Value * getPointerOperand()
Gets the pointer operand.
unsigned getPointerAddressSpace() const
Returns the address space of the pointer operand.
This class represents a cast from a pointer to an integer.
Value * getPointerOperand()
Gets the pointer operand.
unsigned getPointerAddressSpace() const
Returns the address space of the pointer operand.
static bool classof(const Value *V)
const Value * getPointerOperand() const
Gets the pointer operand.
static unsigned getPointerOperandIndex()
Gets the operand index of the pointer operand.
static bool classof(const Instruction *I)
LLVM_ABI PtrToIntInst * cloneImpl() const
Clone an identical PtrToIntInst.
Resume the propagation of an exception.
static ResumeInst * Create(Value *Exn, InsertPosition InsertBefore=nullptr)
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Provide fast operand accessors.
Value * getValue() const
Convenience accessor.
static bool classof(const Value *V)
unsigned getNumSuccessors() const
LLVM_ABI ResumeInst * cloneImpl() const
static bool classof(const Instruction *I)
Return a value (possibly void), from a function.
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Provide fast operand accessors.
unsigned getNumSuccessors() const
static bool classof(const Value *V)
static bool classof(const Instruction *I)
static ReturnInst * Create(LLVMContext &C, BasicBlock *InsertAtEnd)
Value * getReturnValue() const
Convenience accessor. Returns null if there is no return value.
static ReturnInst * Create(LLVMContext &C, Value *retVal=nullptr, InsertPosition InsertBefore=nullptr)
This class represents a sign extension of integer types.
static bool classof(const Value *V)
static bool classof(const Instruction *I)
Methods for support type inquiry through isa, cast, and dyn_cast:
LLVM_ABI SExtInst * cloneImpl() const
Clone an identical SExtInst.
This class represents a cast from signed integer to floating point.
LLVM_ABI SIToFPInst * cloneImpl() const
Clone an identical SIToFPInst.
static bool classof(const Instruction *I)
Methods for support type inquiry through isa, cast, and dyn_cast:
static bool classof(const Value *V)
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)
void setFalseValue(Value *V)
const Value * getFalseValue() const
void setTrueValue(Value *V)
OtherOps getOpcode() const
void swapValues()
Swap the true and false values of the select instruction.
const Value * getCondition() const
LLVM_ABI SelectInst * cloneImpl() const
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
static LLVM_ABI const char * areInvalidOperands(Value *Cond, Value *True, Value *False)
Return a string if the specified operands are invalid for a select operation, otherwise return null.
static bool classof(const Value *V)
void setCondition(Value *V)
const Value * getTrueValue() const
static bool classof(const Instruction *I)
This instruction constructs a fixed permutation of two input vectors.
static bool classof(const Value *V)
static bool isInterleaveMask(ArrayRef< int > Mask, unsigned Factor, unsigned NumInputElts)
Constant * getShuffleMaskForBitcode() const
Return the mask for this instruction, for use in bitcode.
bool isSingleSource() const
Return true if this shuffle chooses elements from exactly one source vector without changing the leng...
bool changesLength() const
Return true if this shuffle returns a vector with a different number of elements than its source vect...
bool isExtractSubvectorMask(int &Index) const
Return true if this shuffle mask is an extract subvector mask.
ArrayRef< int > getShuffleMask() const
static bool isInsertSubvectorMask(const Constant *Mask, int NumSrcElts, int &NumSubElts, int &Index)
static bool isSingleSourceMask(const Constant *Mask, int NumSrcElts)
int getMaskValue(unsigned Elt) const
Return the shuffle mask value of this instruction for the given element index.
void getShuffleMask(SmallVectorImpl< int > &Result) const
Return the mask for this instruction as a vector of integers.
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
static bool isDeInterleaveMaskOfFactor(ArrayRef< int > Mask, unsigned Factor)
VectorType * getType() const
Overload to return most specific vector type.
bool isInsertSubvectorMask(int &NumSubElts, int &Index) const
Return true if this shuffle mask is an insert subvector mask.
bool increasesLength() const
Return true if this shuffle returns a vector with a greater number of elements than its source vector...
bool isZeroEltSplat() const
Return true if all elements of this shuffle are the same value as the first element of exactly one so...
static bool isExtractSubvectorMask(const Constant *Mask, int NumSrcElts, int &Index)
bool isSelect() const
Return true if this shuffle chooses elements from its source vectors without lane crossings and all o...
static bool isSpliceMask(const Constant *Mask, int NumSrcElts, int &Index)
bool isTranspose() const
Return true if this shuffle transposes the elements of its inputs without changing the length of the ...
static void commuteShuffleMask(MutableArrayRef< int > Mask, unsigned InVecNumElts)
Change values in a shuffle permute mask assuming the two vector operands of length InVecNumElts have ...
bool isSplice(int &Index) const
Return true if this shuffle splices two inputs without changing the length of the vectors.
static bool isReverseMask(const Constant *Mask, int NumSrcElts)
static bool isSelectMask(const Constant *Mask, int NumSrcElts)
static bool classof(const Instruction *I)
static bool isZeroEltSplatMask(const Constant *Mask, int NumSrcElts)
bool isIdentity() const
Return true if this shuffle chooses elements from exactly one source vector without lane crossings an...
static bool isReplicationMask(const Constant *Mask, int &ReplicationFactor, int &VF)
static bool isIdentityMask(const Constant *Mask, int NumSrcElts)
static bool isTransposeMask(const Constant *Mask, int NumSrcElts)
bool isReverse() const
Return true if this shuffle swaps the order of elements from exactly one source vector.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
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.
static bool classof(const Instruction *I)
AtomicOrdering getOrdering() const
Returns the ordering constraint of this store instruction.
const Value * getPointerOperand() const
Type * getPointerOperandType() const
void setVolatile(bool V)
Specify whether this is a volatile store or not.
void setAlignment(Align Align)
const Value * getValueOperand() const
void setOrdering(AtomicOrdering Ordering)
Sets the ordering constraint of this store instruction.
Value * getValueOperand()
static bool classof(const Value *V)
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
void setSyncScopeID(SyncScope::ID SSID)
Sets the synchronization scope ID of this store instruction.
LLVM_ABI StoreInst * cloneImpl() const
unsigned getPointerAddressSpace() const
Returns the address space of the pointer operand.
static unsigned getPointerOperandIndex()
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID of this store instruction.
bool isVolatile() const
Return true if this is a store to a volatile memory location.
Value * getPointerOperand()
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.
A wrapper class to simplify modification of SwitchInst cases along with their prof branch_weights met...
LLVM_ABI void setSuccessorWeight(unsigned idx, CaseWeightOpt W)
LLVM_ABI Instruction::InstListType::iterator eraseFromParent()
Delegate the call to the underlying SwitchInst::eraseFromParent() and mark this object to not touch t...
LLVM_ABI void addCase(ConstantInt *OnVal, BasicBlock *Dest, CaseWeightOpt W)
Delegate the call to the underlying SwitchInst::addCase() and set the specified branch weight for the...
SwitchInstProfUpdateWrapper(SwitchInst &SI)
~SwitchInstProfUpdateWrapper()
LLVM_ABI CaseWeightOpt getSuccessorWeight(unsigned idx)
LLVM_ABI MDNode * buildProfBranchWeightsMD()
std::optional< uint32_t > CaseWeightOpt
SwitchInst * operator->()
LLVM_ABI SwitchInst::CaseIt removeCase(SwitchInst::CaseIt I)
Delegate the call to the underlying SwitchInst::removeCase() and remove correspondent branch weight.
A handle to a particular switch case.
unsigned getCaseIndex() const
Returns number of current case.
unsigned getSuccessorIndex() const
Returns successor index for current case successor.
BasicBlockT * getCaseSuccessor() const
Resolves successor for current case.
CaseHandleImpl(SwitchInstT *SI, ptrdiff_t Index)
bool operator==(const CaseHandleImpl &RHS) const
ConstantIntT * getCaseValue() const
Resolves case value for current case.
SwitchInstT SwitchInstType
CaseHandle(SwitchInst *SI, ptrdiff_t Index)
void setValue(ConstantInt *V) const
Sets the new value for current case.
void setSuccessor(BasicBlock *S) const
Sets the new successor for current case.
const CaseHandleT & operator*() const
CaseIteratorImpl()=default
Default constructed iterator is in an invalid state until assigned to a case for a particular switch.
CaseIteratorImpl & operator-=(ptrdiff_t N)
bool operator==(const CaseIteratorImpl &RHS) const
CaseIteratorImpl & operator+=(ptrdiff_t N)
ptrdiff_t operator-(const CaseIteratorImpl &RHS) const
bool operator<(const CaseIteratorImpl &RHS) const
CaseIteratorImpl(SwitchInstT *SI, unsigned CaseNum)
Initializes case iterator for given SwitchInst and for given case number.
static CaseIteratorImpl fromSuccessorIndex(SwitchInstT *SI, unsigned SuccessorIndex)
Initializes case iterator for given SwitchInst and for given successor index.
BasicBlock * getDefaultDest() const
CaseIt case_end()
Returns a read/write iterator that points one past the last in the SwitchInst.
BasicBlock * getSuccessor(unsigned idx) const
ConstCaseIt findCaseValue(const ConstantInt *C) const
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Provide fast operand accessors.
static SwitchInst * Create(Value *Value, BasicBlock *Default, unsigned NumCases, InsertPosition InsertBefore=nullptr)
void setCondition(Value *V)
bool defaultDestUnreachable() const
Returns true if the default branch must result in immediate undefined behavior, false otherwise.
ConstCaseIt case_begin() const
Returns a read-only iterator that points to the first case in the SwitchInst.
iterator_range< ConstCaseIt > cases() const
Constant iteration adapter for range-for loops.
ConstantInt * findCaseDest(BasicBlock *BB)
Finds the unique case value for a given successor.
void setSuccessor(unsigned idx, BasicBlock *NewSucc)
static bool classof(const Value *V)
unsigned getNumSuccessors() const
CaseIt case_default()
Returns an iterator that points to the default case.
void setDefaultDest(BasicBlock *DefaultCase)
unsigned getNumCases() const
Return the number of 'cases' in this switch instruction, excluding the default case.
CaseIt findCaseValue(const ConstantInt *C)
Search all of the case values for the specified constant.
Value * getCondition() const
ConstCaseIt case_default() const
CaseIt case_begin()
Returns a read/write iterator that points to the first case in the SwitchInst.
static bool classof(const Instruction *I)
iterator_range< CaseIt > cases()
Iteration adapter for range-for loops.
ConstCaseIt case_end() const
Returns a read-only iterator that points one past the last in the SwitchInst.
This class represents a truncation of integer types.
void setHasNoSignedWrap(bool B)
static bool classof(const Instruction *I)
Methods for support type inquiry through isa, cast, and dyn_cast:
LLVM_ABI TruncInst * cloneImpl() const
Clone an identical TruncInst.
void setHasNoUnsignedWrap(bool B)
unsigned getNoWrapKind() const
Returns the no-wrap kind of the operation.
bool hasNoSignedWrap() const
Test whether this operation is known to never undergo signed overflow, aka the nsw property.
static bool classof(const Value *V)
bool hasNoUnsignedWrap() const
Test whether this operation is known to never undergo unsigned overflow, aka the nuw property.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
bool isVectorTy() const
True if this is an instance of VectorType.
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
bool isTokenTy() const
Return true if this is 'token'.
This class represents a cast unsigned integer to floating point.
static bool classof(const Value *V)
LLVM_ABI UIToFPInst * cloneImpl() const
Clone an identical UIToFPInst.
static bool classof(const Instruction *I)
Methods for support type inquiry through isa, cast, and dyn_cast:
This function has undefined behavior.
unsigned getNumSuccessors() const
static bool classof(const Value *V)
static bool classof(const Instruction *I)
A Use represents the edge between a Value definition and its users.
LLVM_ABI void allocHungoffUses(unsigned N, bool IsPhi=false)
Allocate the array of Uses, followed by a pointer (with bottom bit set) to the User.
const Use & getOperandUse(unsigned i) const
Value * getOperand(unsigned i) const
unsigned getNumOperands() const
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
static bool classof(const Instruction *I)
Value * getPointerOperand()
VAArgInst(Value *List, Type *Ty, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
const Value * getPointerOperand() const
static bool classof(const Value *V)
static unsigned getPointerOperandIndex()
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
user_iterator_impl< const User > const_user_iterator
unsigned char SubclassOptionalData
Hold subclass data that can be dropped.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
Base class of all SIMD vector types.
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
This class represents zero extension of integer types.
static bool classof(const Instruction *I)
Methods for support type inquiry through isa, cast, and dyn_cast:
static bool classof(const Value *V)
LLVM_ABI ZExtInst * cloneImpl() const
Clone an identical ZExtInst.
An efficient, type-erasing, non-owning reference to a callable.
base_list_type::iterator iterator
CRTP base class for adapting an iterator to a different type.
CRTP base class which implements the entire standard iterator facade in terms of a minimal subset of ...
A range adaptor for a pair of iterators.
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
@ C
The default llvm calling convention, compatible with C.
@ BasicBlock
Various leaf nodes.
@ System
Synchronized with respect to all concurrently executing threads.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
Type * checkGEPType(Type *Ty)
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
unsigned getLoadStoreAddressSpace(const Value *I)
A helper function that returns the address space of the pointer operand of load or store instruction.
APInt operator*(APInt a, uint64_t RHS)
const Value * getLoadStorePointerOperand(const Value *V)
A helper function that returns the pointer operand of a load or store instruction.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void setAtomicSyncScopeID(Instruction *I, SyncScope::ID SSID)
A helper function that sets an atomic operation's sync scope.
Align getLoadStoreAlignment(const Value *I)
A helper function that returns the alignment of load or store instruction.
const Value * getPointerOperand(const Value *V)
A helper function that returns the pointer operand of a load, store or GEP instruction.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
std::optional< SyncScope::ID > getAtomicSyncScopeID(const Instruction *I)
A helper function that returns an atomic operation's sync scope; returns std::nullopt if it is not an...
constexpr int PoisonMaskElem
AtomicOrdering
Atomic ordering for LLVM's memory model.
DWARFExpression::Operation Op
OutputIt copy(R &&Range, OutputIt Out)
constexpr unsigned BitWidth
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
auto predecessors(const MachineBasicBlock *BB)
Type * getLoadStoreType(const Value *I)
A helper function that returns the type of a load or store instruction.
void setLoadStoreAlignment(Value *I, Align NewAlign)
A helper function that set the alignment of load or store instruction.
unsigned Log2(Align A)
Returns the log2 of the alignment.
@ Default
The result values are uniform if and only if all operands are uniform.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Summary of memprof metadata on allocations.
Describes an element of a Bitfield.
static constexpr bool areContiguous()
The const version of succ_op_iterator.
const BasicBlock * operator->() const
const_succ_op_iterator(const_value_op_iterator I)
const BasicBlock * operator*() const
Iterator type that casts an operand to a basic block.
BasicBlock * operator->() const
succ_op_iterator(value_op_iterator I)
BasicBlock * operator*() const
FixedNumOperandTraits - determine the allocation regime of the Use array when it is a prefix to the U...
HungoffOperandTraits - determine the allocation regime of the Use array when it is not a prefix to th...
The const version of succ_op_iterator.
const BasicBlock * operator*() const
const_succ_op_iterator(const_value_op_iterator I)
const BasicBlock * operator->() const
Iterator type that casts an operand to a basic block.
BasicBlock * operator*() const
succ_op_iterator(value_op_iterator I)
BasicBlock * operator->() const
Compile-time customization of User operands.
A MapVector that performs no allocations if smaller than a certain size.
Information about how a User object was allocated, to be passed into the User constructor.
Indicates this User has operands "hung off" in another allocation.
Indicates this User has operands co-allocated.
Iterator for directly iterating over the operand Values.
VariadicOperandTraits - determine the allocation regime of the Use array when it is a prefix to the U...