46 case Instruction::Sub:
47 return Instruction::Add;
48 case Instruction::FSub:
49 return Instruction::FAdd;
56 if (
I->getOpcode() == Instruction::Sub)
58 if (
I->getOpcode() == Instruction::FSub)
59 return I->hasAllowReassoc();
60 return I->isAssociative();
68 switch (
I->getOpcode()) {
69 case Instruction::ExtractValue:
70 case Instruction::InsertValue:
72 case Instruction::ExtractElement:
75 case Instruction::InsertElement:
85 "ScalableVectorType is not supported.");
96 return std::min<unsigned>(PartNumElems,
Size - Part * PartNumElems);
104 OS <<
"Idx: " << Idx <<
", ";
105 OS <<
"n=" << VL.
size() <<
" [" << *VL.
front() <<
", ..]";
126 if (BB !=
II->getParent())
139 Value *FirstNonUndef =
nullptr;
140 for (
Value *V : VL) {
143 if (!FirstNonUndef) {
147 if (V != FirstNonUndef)
150 return FirstNonUndef !=
nullptr;
156 if ((LHS == Intrinsic::fma || LHS == Intrinsic::fmuladd) &&
157 (RHS == Intrinsic::fma || RHS == Intrinsic::fmuladd))
158 return Intrinsic::fma;
165 return Cmp->isCommutative();
167 return BO->isCommutative() ||
168 (BO->getOpcode() == Instruction::Sub && ValWithUses->
hasUseList() &&
175 if (match(U.getUser(),
176 m_ICmp(Pred, m_Specific(U.get()), m_Zero())) &&
177 (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE))
181 auto *I = dyn_cast<BinaryOperator>(U.get());
182 return match(U.getUser(),
183 m_Intrinsic<Intrinsic::abs>(
184 m_Specific(U.get()), m_ConstantInt(Flag))) &&
185 ((!IsCopyable && I && !I->hasNoSignedWrap()) ||
188 (BO->getOpcode() == Instruction::FSub && ValWithUses->
hasUseList() &&
191 return match(U.getUser(),
192 m_Intrinsic<Intrinsic::fabs>(m_Specific(U.get())));
194 return I->isCommutative();
202 "The instruction is not commutative.");
206 switch (BO->getOpcode()) {
207 case Instruction::Sub:
208 case Instruction::FSub:
214 return I->isCommutableOperand(
Op);
221 constexpr unsigned IntrinsicNumOperands = 2;
222 return IntrinsicNumOperands;
224 return I->getNumOperands();
239 Type *CurrentType =
IV->getType();
240 for (
unsigned I :
IV->indices()) {
242 Index *= ST->getNumElements();
243 CurrentType = ST->getElementType(
I);
245 Index *= AT->getNumElements();
246 CurrentType = AT->getElementType();
265 if (auto *CI = dyn_cast<CmpInst>(V))
266 return BasePred == CI->getPredicate();
267 if (auto *I = dyn_cast<Instruction>(V))
268 return I->getOpcode() == Opcode;
269 return isa<PoisonValue>(V);
274 unsigned Opcode = E->getOpcode();
275 assert((Opcode == Instruction::ExtractElement ||
276 Opcode == Instruction::ExtractValue) &&
277 "Expected extractelement or extractvalue instruction.");
278 if (Opcode == Instruction::ExtractElement) {
284 unsigned Idx = CI->getZExtValue();
292 if (EI->getNumIndices() != 1)
294 return *EI->idx_begin();
300 const unsigned E = Indices.
size();
302 for (
unsigned I = 0;
I < E; ++
I)
303 Mask[Indices[
I]] =
I;
307 assert(!Mask.empty() &&
"Expected non-empty mask.");
311 for (
unsigned I = 0, E = Prev.
size();
I < E; ++
I)
313 Scalars[Mask[
I]] = Prev[
I];
317 assert(!VL.
empty() &&
"Expected non-empty list of values.");
319 return all_of(VL, [&](
Value *V) {
return V->getType() == Ty; });
325 static_assert(std::is_same_v<T, InsertElementInst> ||
326 std::is_same_v<T, ExtractElementInst>,
333 constexpr bool IsInsert = std::is_same_v<T, InsertElementInst>;
334 Type *VecTy = IsInsert ? IE->getType() : IE->getOperand(0)->getType();
341 if (CI->getValue().uge(VT->getNumElements()))
344 Index *= VT->getNumElements();
345 Index += CI->getZExtValue();
351template std::optional<unsigned>
353template std::optional<unsigned>
362 auto *IO = dyn_cast<Instruction>(V);
365 return isa<PHINode>(IO) || IO->getParent() != I->getParent();
374 return !
I->mayReadOrWriteMemory() && !
I->hasNUsesOrMore(
UsesLimit) &&
376 auto *IU = dyn_cast<Instruction>(U);
379 return IU->getParent() != I->getParent() || isa<PHINode>(IU);
388 return !VL.
empty() &&
401 I * VecTyNumElements, VecTyNumElements)))
403 : Mask[
I] * VecTyNumElements + J;
413 unsigned SVNumElements =
415 unsigned ShuffleMaskSize = SV->getShuffleMask().size();
416 if (SVNumElements % ShuffleMaskSize != 0)
418 unsigned GroupSize = SVNumElements / ShuffleMaskSize;
419 if (GroupSize == 0 || (VL.
size() % GroupSize) != 0)
421 unsigned NumGroup = 0;
422 for (
size_t I = 0, E = VL.
size();
I != E;
I += GroupSize) {
424 Value *Src = SV->getOperand(0);
430 if (SV->getOperand(0) != Src)
433 if (!SV->isExtractSubvectorMask(Index))
435 ExpectedIndex.
set(Index / ShuffleMaskSize);
439 if (!ExpectedIndex.
all())
443 assert(NumGroup == (VL.
size() / GroupSize) &&
"Unexpected number of groups");
450 unsigned SVNumElements =
453 unsigned AccumulateLength = 0;
454 for (
Value *V : VL) {
456 for (
int M : SV->getShuffleMask())
458 : AccumulateLength + M);
459 AccumulateLength += SVNumElements;
480template <
bool IsPoisonOnly>
483 using T = std::conditional_t<IsPoisonOnly, PoisonValue, UndefValue>;
517 for (
unsigned I = 0, E = VecTy->getNumElements();
I != E; ++
I) {
518 if (
Constant *Elem =
C->getAggregateElement(
I))
538 case Instruction::Load: {
542 case Instruction::Store: {
544 return (
SI->getPointerOperand() == Scalar);
546 case Instruction::Call: {
550 return isVectorIntrinsicWithScalarOpAtArg(ID, Arg.index(), TTI) &&
551 Arg.value().get() == Scalar;
569 return LI->isSimple();
571 return SI->isSimple();
573 return !
MI->isVolatile();
583 uint64_t ScalarSize =
DL.getTypeStoreSize(ScalarTy);
584 Conditions.
assign(PointerOps.
size(),
nullptr);
589 APInt OffsetAP(
DL.getIndexTypeSizeInBits(
GEP->getType()), 0);
590 if (!
GEP->accumulateConstantOffset(
DL, OffsetAP) || OffsetAP.
isNegative())
593 Base =
GEP->getPointerOperand();
598 Value *
T = Sel->getTrueValue();
599 Value *
F = Sel->getFalseValue();
605 }
else if (TrueBase !=
T || FalseBase !=
F) {
610 if (
Offset !=
static_cast<uint64_t
>(Idx) * ScalarSize)
612 Conditions[Idx] = Sel->getCondition();
614 return TrueBase !=
nullptr;
618 bool ExtendingManyInputs) {
622 (!ExtendingManyInputs || SubMask.
size() > Mask.size() ||
625 "SubMask with many inputs support must be larger than the mask.");
627 Mask.append(SubMask.
begin(), SubMask.
end());
631 int TermValue = std::min(Mask.size(), SubMask.
size());
632 for (
int I = 0, E = SubMask.
size();
I < E; ++
I) {
634 (!ExtendingManyInputs &&
635 (SubMask[
I] >= TermValue || Mask[SubMask[
I]] >= TermValue)))
637 NewMask[
I] = Mask[SubMask[
I]];
643 const size_t Sz = Order.
size();
646 for (
unsigned I = 0;
I < Sz; ++
I) {
648 UnusedIndices.
reset(Order[
I]);
650 MaskedIndices.
set(
I);
652 if (MaskedIndices.
none())
655 "Non-synced masked/available indices.");
659 assert(Idx >= 0 &&
"Indices must be synced.");
667 unsigned Opcode0,
unsigned Opcode1) {
674 OpcodeMask.
set(Lane * ScalarTyNumElements,
675 Lane * ScalarTyNumElements + ScalarTyNumElements);
682 "Expected scalar constants.");
685 std::fill_n(NewVal.begin() +
I * VF, VF, V);
691 case Instruction::UDiv:
692 return Intrinsic::masked_udiv;
693 case Instruction::SDiv:
694 return Intrinsic::masked_sdiv;
695 case Instruction::URem:
696 return Intrinsic::masked_urem;
697 case Instruction::SRem:
698 return Intrinsic::masked_srem;
709 constexpr unsigned MaxIndexChainLength = 3;
712 auto IsProfitableOperand = [](
const Value *V) {
716 V = Cast->getOperand(0);
719 const User *U =
I->user_back();
720 for ([[maybe_unused]]
unsigned _ :
seq<unsigned>(MaxIndexChainLength)) {
723 none_of(
I->operand_values(), IsProfitableOperand);
737 unsigned Opcode = BO->getOpcode();
738 Type *Ty = BO->getType();
742 Opcode, Ty, Idx == 1) ||
744 Opcode, Ty, Idx == 0)))
748 const User *U =
I->user_back();
760 if (!Wide || !Wide->hasOneUse())
763 if (!Narrow || !Narrow->hasOneUse())
765 Value *Src = Narrow->getOperand(0);
768 if (MustBeElidable && !(Wide->hasAllowContract() && Wide->hasNoNaNs() &&
769 Wide->hasNoInfs() && Narrow->hasAllowContract()))
779struct NarrowedChainState {
781 unsigned NarrowShift = 0;
782 unsigned NarrowBW = 0;
800 NarrowedChainState S,
unsigned Depth,
804 if (
Depth < MaxDepth) {
806 Z && Z->getSrcTy()->isIntegerTy() && !Z->getSrcTy()->isIntegerTy(1)) {
809 Depth + 1, MaxDepth, Leaves, ChainInsts);
812 if (BO->getOpcode() == RdxOpcode) {
815 Depth + 1, MaxDepth, Leaves, ChainInsts);
817 Depth + 1, MaxDepth, Leaves, ChainInsts);
821 unsigned BW = V->getType()->getScalarSizeInBits();
823 if (BO->getOpcode() == Instruction::Shl && Z && S.NarrowBW == 0 &&
825 Z->getSrcTy()->isIntegerTy() && !Z->getSrcTy()->isIntegerTy(1) &&
827 Z->getSrcTy()->getIntegerBitWidth() + Amt->
getZExtValue() <= BW) &&
833 Depth + 1, MaxDepth, Leaves,
840 if (BW < WideBW && (S.NarrowBW == 0 || BW == S.NarrowBW)) {
841 if (BO->getOpcode() == Instruction::Shl &&
844 S.Shift + S.NarrowShift + Amt->
getZExtValue() < WideBW) {
846 if (BO->hasNoUnsignedWrap() && S.NarrowBW == 0) {
853 if (S.NarrowBW == 0) {
860 S,
Depth + 1, MaxDepth, Leaves,
866 if (S.NarrowBW == 0) {
870 S.NarrowMask &= *Amt << S.NarrowShift;
872 MaxDepth, Leaves, ChainInsts);
878 S.getMask(V->getType()->getScalarSizeInBits()));
886 0, MaxDepth, Leaves, ChainInsts);
890 assert(
F &&
"Expected function.");
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static std::pair< Value *, APInt > getMask(Value *WideMask, unsigned Factor, ElementCount LeafValueEC)
uint64_t IntrinsicInst * II
Provides some synthesis utilities to produce sequences of values.
static const uint32_t IV[8]
Class for arbitrary precision integers.
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
uint64_t getZExtValue() const
Get zero extended value.
bool ult(const APInt &RHS) const
Unsigned less than comparison.
bool isNegative() const
Determine sign of this APInt.
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
const T & front() const
Get the first element.
size_t size() const
Get the array size.
bool empty() const
Check if the array is empty.
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
const T & consume_front()
consume_front() - Returns the first element and drops it from ArrayRef.
LLVM Basic Block Representation.
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
This class represents a function call, abstracting a target machine's calling convention.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
static LLVM_ABI Constant * getBinOpAbsorber(unsigned Opcode, Type *Ty, bool AllowLHSConstant=false)
Return the absorbing element for the given binary operation, i.e.
static LLVM_ABI Constant * getBinOpIdentity(unsigned Opcode, Type *Ty, bool AllowRHSConstant=false, bool NSZ=false)
Return the identity constant for a binary opcode.
This is an important base class in LLVM.
A parsed version of the target data layout string in and methods for querying it.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
An instruction for reading from memory.
Value * getPointerOperand()
This is the common base class for memset/memcpy/memmove.
Representation for a specific memory location.
static LLVM_ABI MemoryLocation get(const LoadInst *LI)
Return a location with information about the memory reference by the given instruction.
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
This is a 'bitvector' (really, a variable-sized bit array), optimized for the case when the array is ...
int find_first() const
Returns the index of the first set bit, -1 if none of the bits are set.
int find_next(unsigned Prev) const
Returns the index of the next set bit following the "Prev" bit.
bool all() const
Returns true if all bits are set.
size_type count() const
Returns the number of bits which are set.
bool none() const
Returns true if none of the bits are set.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
reference emplace_back(ArgTypes &&... Args)
void swap(SmallVectorImpl &RHS)
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.
Provides information about what library functions are available for the current target.
The instances of the Type class are immutable: once they are created, they are never changed.
A Use represents the edge between a Value definition and its users.
LLVM Value Representation.
bool hasUseList() const
Check if this Value has a use-list.
LLVM_ABI bool hasNUsesOrMore(unsigned N) const
Return true if this value has N uses or more.
iterator_range< use_iterator > uses()
constexpr ScalarTy getFixedValue() const
const ParentTy * getParent() const
A raw_ostream that writes to an std::string.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
bool match(Val *V, const Pattern &P)
auto m_Value()
Match an arbitrary value and ignore it.
A private "module" namespace for types and utilities used by this pass.
std::optional< unsigned > getExtractIndex(const Instruction *E)
template SmallBitVector isUndefVector< true >(const Value *, const SmallBitVector &)
bool areAllOperandsNonInsts(Value *V)
Checks if the provided value does not require scheduling.
std::optional< unsigned > getElementIndex(const Value *Inst, unsigned Offset)
bool doesInTreeUserNeedToExtract(Value *Scalar, Instruction *UserInst, TargetLibraryInfo *TLI, const TargetTransformInfo *TTI)
MemoryLocation getLocation(Instruction *I)
bool isSelectedBaseLoad(Type *ScalarTy, ArrayRef< Value * > PointerOps, const DataLayout &DL, Value *&TrueBase, Value *&FalseBase, SmallVectorImpl< Value * > &Conditions)
Checks if the loads with scalar type ScalarTy and pointer operands PointerOps are each (optionally vi...
SmallBitVector getAltInstrMask(ArrayRef< Value * > VL, Type *ScalarTy, unsigned Opcode0, unsigned Opcode1)
SmallBitVector isUndefVector(const Value *V, const SmallBitVector &UseMask)
Checks if the given value is actually an undefined constant vector.
Intrinsic::ID getMaskedDivRemIntrinsic(unsigned Opcode)
bool isUsedOutsideBlock(Value *V)
Checks if the provided value does not require scheduling.
bool doesNotNeedToSchedule(ArrayRef< Value * > VL)
Checks if the specified array of instructions does not require scheduling.
std::optional< unsigned > getInsertExtractIndex(const Value *Inst, unsigned Offset)
void reorderScalars(SmallVectorImpl< Value * > &Scalars, ArrayRef< int > Mask)
Reorders the list of scalars in accordance with the given Mask.
bool allSameType(ArrayRef< Value * > VL)
bool allSameOpcode(ArrayRef< Value * > VL)
bool isSplat(ArrayRef< Value * > VL)
unsigned getNumElements(Type *Ty)
std::string shortBundleName(ArrayRef< Value * > VL, int Idx)
Print a short descriptor of the instruction bundle suitable for debug output.
bool isOnceUsedSeed(const Instruction *I)
Returns true if I forms a vectorizable bundle on its own and its single user does not tear the vector...
unsigned getPartNumElems(unsigned Size, unsigned NumParts)
Returns power-of-2 number of elements in a single register (part), given the total number of elements...
bool isCommutableOperand(const Instruction *I, Value *ValWithUses, unsigned Op, bool IsCopyable)
Checks if the operand is commutative.
TargetTransformInfo::TargetCostKind getSLPCostKind(const Function *F)
void transformScalarShuffleIndiciesToVector(unsigned VecTyNumElements, SmallVectorImpl< int > &Mask)
SmallVector< int > calculateShufflevectorMask(ArrayRef< Value * > VL)
SmallBitVector buildUseMask(int VF, ArrayRef< int > Mask, UseMask MaskArg)
Prepares a use bitset for the given mask either for the first argument or for the second.
bool isCommutative(const Instruction *I, const Value *ValWithUses, bool IsCopyable)
template SmallBitVector isUndefVector< false >(const Value *, const SmallBitVector &)
unsigned getNumberOfPotentiallyCommutativeOps(Instruction *I)
bool allConstant(ArrayRef< Value * > VL)
template std::optional< unsigned > getInsertExtractIndex< InsertElementInst >(const Value *, unsigned)
void inversePermutation(ArrayRef< unsigned > Indices, SmallVectorImpl< int > &Mask)
Compute the inverse permutation Mask of Indices.
bool allSameBlock(ArrayRef< Value * > VL)
bool isReassocChainLink(const Instruction *I)
Intrinsic::ID isEquivalentIntrinsicID(Intrinsic::ID LHS, Intrinsic::ID RHS)
Checks if LHS and RHS are the same intrinsic, or one is llvm.fma and the other is llvm....
UseMask
Specifies the way the mask should be analyzed for undefs/poisonous elements in the shuffle mask.
@ SecondArg
The mask is expected to be for permutation of 2 vectors, check for the mask elements for the second a...
@ UndefsAsMask
Consider undef mask elements (-1) as placeholders for future shuffle elements and mark them as ones a...
@ FirstArg
The mask is expected to be for permutation of 1-2 vectors, check for the mask elements for the first ...
static void collectNarrowedLeavesImpl(Value *V, unsigned RdxOpcode, unsigned WideBW, NarrowedChainState S, unsigned Depth, unsigned MaxDepth, SmallVectorImpl< NarrowedLeafInfo > &Leaves, SmallVectorImpl< Instruction * > &ChainInsts)
void addMask(SmallVectorImpl< int > &Mask, ArrayRef< int > SubMask, bool ExtendingManyInputs)
Shuffles Mask in accordance with the given SubMask.
bool isSimple(Instruction *I)
Instruction * lookThroughCastRoundTrip(Value *V, bool MustBeElidable)
If V is a single-use fpext of a single-use fptrunc forming a round-trip back to the type of V,...
bool isBinOpIdentityConstant(const Value *V, unsigned Opcode)
unsigned getShufflevectorNumGroups(ArrayRef< Value * > VL)
SmallVector< Constant * > replicateMask(ArrayRef< Constant * > Val, unsigned VF)
Replicates the given Val VF times.
unsigned getReassocCombineOpcode(unsigned Opcode)
bool isVectorLikeInstWithConstOps(Value *V)
Checks if V is one of vector-like instructions, i.e.
bool doesNotNeedToBeScheduled(Value *V)
Checks if the specified value does not require scheduling.
unsigned getNumElems(unsigned Size, unsigned PartNumElems, unsigned Part)
Returns correct remaining number of elements, considering total amount Size, (power-of-2 number) of e...
constexpr int UsesLimit
Limit of the number of uses for potentially transformed instructions/values, used in checks to avoid ...
void collectNarrowedLeaves(Value *V, unsigned RdxOpcode, unsigned WideBW, unsigned MaxDepth, SmallVectorImpl< NarrowedLeafInfo > &Leaves, SmallVectorImpl< Instruction * > &ChainInsts)
Recursively collects the narrow leaves of the widened reduction value V.
bool isConstant(Value *V)
static bool isNonProfitableIndex(const Instruction *I)
Returns true if I is a part of a single-use chain, computing an address, which does not pay off the v...
template std::optional< unsigned > getInsertExtractIndex< ExtractElementInst >(const Value *, unsigned)
void fixupOrderingIndices(MutableArrayRef< unsigned > Order)
Order may have elements assigned special value (size) which is out of bounds.
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI Intrinsic::ID getVectorIntrinsicIDForCall(const CallInst *CI, const TargetLibraryInfo *TLI)
Returns intrinsic ID for call.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
bool isVectorizedTy(Type *Ty)
Returns true if Ty is a vector type or a struct of vector types where all vector types share the same...
T bit_ceil(T Value)
Returns the smallest integral power of two no smaller than Value if Value is nonzero.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
ElementCount getVectorizedTypeVF(Type *Ty)
Returns the number of vector elements for a vectorized type.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
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...
MutableArrayRef(T &OneElt) -> MutableArrayRef< T >
constexpr int PoisonMaskElem
iterator_range(Container &&) -> iterator_range< llvm::detail::IterOfRange< Container > >
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
constexpr auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
LLVM_ABI bool mayHaveNonDefUseDependency(const Instruction &I)
Returns true if the result or effects of the given instructions I depend values not reachable through...
constexpr detail::IsaCheckPredicate< Types... > IsaPred
Function object wrapper for the llvm::isa type check.