LLVM 20.0.0git
|
The RecurrenceDescriptor is used to identify recurrences variables in a loop. More...
#include "llvm/Analysis/IVDescriptors.h"
Classes | |
class | InstDesc |
This POD struct holds information about a potential recurrence operation. More... | |
Public Member Functions | |
RecurrenceDescriptor ()=default | |
RecurrenceDescriptor (Value *Start, Instruction *Exit, StoreInst *Store, RecurKind K, FastMathFlags FMF, Instruction *ExactFP, Type *RT, bool Signed, bool Ordered, SmallPtrSetImpl< Instruction * > &CI, unsigned MinWidthCastToRecurTy) | |
RecurKind | getRecurrenceKind () const |
unsigned | getOpcode () const |
FastMathFlags | getFastMathFlags () const |
TrackingVH< Value > | getRecurrenceStartValue () const |
Instruction * | getLoopExitInstr () const |
bool | hasExactFPMath () const |
Returns true if the recurrence has floating-point math that requires precise (ordered) operations. | |
Instruction * | getExactFPMathInst () const |
Returns 1st non-reassociative FP instruction in the PHI node's use-chain. | |
Type * | getRecurrenceType () const |
Returns the type of the recurrence. | |
Value * | getSentinelValue () const |
Returns the sentinel value for FindLastIV recurrences to replace the start value. | |
const SmallPtrSet< Instruction *, 8 > & | getCastInsts () const |
Returns a reference to the instructions used for type-promoting the recurrence. | |
unsigned | getMinWidthCastToRecurrenceTypeInBits () const |
Returns the minimum width used by the recurrence in bits. | |
bool | isSigned () const |
Returns true if all source operands of the recurrence are SExtInsts. | |
bool | isOrdered () const |
Expose an ordered FP reduction to the instance users. | |
SmallVector< Instruction *, 4 > | getReductionOpChain (PHINode *Phi, Loop *L) const |
Attempts to find a chain of operations from Phi to LoopExitInst that can be treated as a set of reductions instructions for in-loop reductions. | |
Static Public Member Functions | |
static InstDesc | isRecurrenceInstr (Loop *L, PHINode *Phi, Instruction *I, RecurKind Kind, InstDesc &Prev, FastMathFlags FuncFMF, ScalarEvolution *SE) |
Returns a struct describing if the instruction 'I' can be a recurrence variable of type 'Kind' for a Loop L and reduction PHI Phi . | |
static bool | hasMultipleUsesOf (Instruction *I, SmallPtrSetImpl< Instruction * > &Insts, unsigned MaxNumUses) |
Returns true if instruction I has multiple uses in Insts. | |
static bool | areAllUsesIn (Instruction *I, SmallPtrSetImpl< Instruction * > &Set) |
Returns true if all uses of the instruction I is within the Set. | |
static InstDesc | isMinMaxPattern (Instruction *I, RecurKind Kind, const InstDesc &Prev) |
Returns a struct describing if the instruction is a llvm. | |
static InstDesc | isAnyOfPattern (Loop *Loop, PHINode *OrigPhi, Instruction *I, InstDesc &Prev) |
Returns a struct describing whether the instruction is either a Select(ICmp(A, B), X, Y), or Select(FCmp(A, B), X, Y) where one of (X, Y) is a loop invariant integer and the other is a PHI value. | |
static InstDesc | isFindLastIVPattern (Loop *TheLoop, PHINode *OrigPhi, Instruction *I, ScalarEvolution &SE) |
Returns a struct describing whether the instruction is either a Select(ICmp(A, B), X, Y), or Select(FCmp(A, B), X, Y) where one of (X, Y) is an increasing loop induction variable, and the other is a PHI value. | |
static InstDesc | isConditionalRdxPattern (RecurKind Kind, Instruction *I) |
Returns a struct describing if the instruction is a Select(FCmp(X, Y), (Z = X op PHINode), PHINode) instruction pattern. | |
static unsigned | getOpcode (RecurKind Kind) |
Returns the opcode corresponding to the RecurrenceKind. | |
static bool | AddReductionVar (PHINode *Phi, RecurKind Kind, Loop *TheLoop, FastMathFlags FuncFMF, RecurrenceDescriptor &RedDes, DemandedBits *DB=nullptr, AssumptionCache *AC=nullptr, DominatorTree *DT=nullptr, ScalarEvolution *SE=nullptr) |
Returns true if Phi is a reduction of type Kind and adds it to the RecurrenceDescriptor. | |
static bool | isReductionPHI (PHINode *Phi, Loop *TheLoop, RecurrenceDescriptor &RedDes, DemandedBits *DB=nullptr, AssumptionCache *AC=nullptr, DominatorTree *DT=nullptr, ScalarEvolution *SE=nullptr) |
Returns true if Phi is a reduction in TheLoop. | |
static bool | isFixedOrderRecurrence (PHINode *Phi, Loop *TheLoop, DominatorTree *DT) |
Returns true if Phi is a fixed-order recurrence. | |
static bool | isIntegerRecurrenceKind (RecurKind Kind) |
Returns true if the recurrence kind is an integer kind. | |
static bool | isFloatingPointRecurrenceKind (RecurKind Kind) |
Returns true if the recurrence kind is a floating point kind. | |
static bool | isIntMinMaxRecurrenceKind (RecurKind Kind) |
Returns true if the recurrence kind is an integer min/max kind. | |
static bool | isFPMinMaxRecurrenceKind (RecurKind Kind) |
Returns true if the recurrence kind is a floating-point min/max kind. | |
static bool | isMinMaxRecurrenceKind (RecurKind Kind) |
Returns true if the recurrence kind is any min/max kind. | |
static bool | isAnyOfRecurrenceKind (RecurKind Kind) |
Returns true if the recurrence kind is of the form select(cmp(),x,y) where one of (x,y) is loop invariant. | |
static bool | isFindLastIVRecurrenceKind (RecurKind Kind) |
Returns true if the recurrence kind is of the form select(cmp(),x,y) where one of (x,y) is increasing loop induction. | |
static bool | isFMulAddIntrinsic (Instruction *I) |
Returns true if the instruction is a call to the llvm.fmuladd intrinsic. | |
Public Attributes | |
StoreInst * | IntermediateStore = nullptr |
Reductions may store temporary or final result to an invariant address. | |
The RecurrenceDescriptor is used to identify recurrences variables in a loop.
Reduction is a special case of recurrence that has uses of the recurrence variable outside the loop. The method isReductionPHI identifies reductions that are basic recurrences.
Basic recurrences are defined as the summation, product, OR, AND, XOR, min, or max of a set of terms. For example: for(i=0; i<n; i++) { total += array[i]; } is a summation of array elements. Basic recurrences are a special case of chains of recurrences (CR). See ScalarEvolution for CR references. This struct holds information about recurrence variables.
Definition at line 77 of file IVDescriptors.h.
|
default |
|
inline |
Definition at line 81 of file IVDescriptors.h.
References llvm::SmallPtrSetImpl< PtrType >::begin(), and llvm::SmallPtrSetImpl< PtrType >::end().
|
static |
Returns true if Phi is a reduction of type Kind and adds it to the RecurrenceDescriptor.
If either DB
is non-null or AC
and DT
are non-null, the minimal bit width needed to compute the reduction will be computed.
Definition at line 214 of file IVDescriptors.cpp.
References llvm::SmallVectorImpl< T >::append(), areAllUsesIn(), llvm::SmallVectorTemplateCommon< T, typename >::begin(), checkOrderedReduction(), collectCastInstrs(), computeRecurrenceType(), llvm::LoopBase< BlockT, LoopT >::contains(), llvm::SmallPtrSetImpl< PtrType >::count(), llvm::dbgs(), llvm::SmallVectorBase< Size_T >::empty(), llvm::SmallVectorTemplateCommon< T, typename >::end(), llvm::FAdd, llvm::FAnyOf, llvm::FMul, llvm::RecurrenceDescriptor::InstDesc::getExactFPMathInst(), llvm::FastMathFlags::getFast(), llvm::Instruction::getFastMathFlags(), llvm::LoopBase< BlockT, LoopT >::getHeader(), llvm::LoopBase< BlockT, LoopT >::getLoopPreheader(), llvm::User::getOperand(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::RecurrenceDescriptor::InstDesc::getPatternInst(), llvm::StoreInst::getPointerOperand(), llvm::RecurrenceDescriptor::InstDesc::getRecKind(), llvm::ScalarEvolution::getSCEV(), llvm::StoreInst::getValueOperand(), hasMultipleUsesOf(), llvm::IAnyOf, llvm::SmallPtrSetImpl< PtrType >::insert(), IntermediateStore, llvm::is_contained(), isAnyOfPattern(), isAnyOfRecurrenceKind(), llvm::Instruction::isCommutative(), isConditionalRdxPattern(), isFloatingPointRecurrenceKind(), llvm::Type::isFloatingPointTy(), isFMulAddIntrinsic(), isFPMinMaxRecurrenceKind(), isIntegerRecurrenceKind(), llvm::Type::isIntegerTy(), isIntMinMaxRecurrenceKind(), llvm::ScalarEvolution::isLoopInvariant(), isMinMaxPattern(), isMinMaxRecurrenceKind(), llvm::RecurrenceDescriptor::InstDesc::isRecurrence(), isRecurrenceInstr(), LLVM_DEBUG, lookThroughAnd(), llvm::None, llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::Value::use_empty(), and llvm::Value::users().
Referenced by isReductionPHI().
|
static |
Returns true if all uses of the instruction I is within the Set.
Definition at line 31 of file IVDescriptors.cpp.
References I.
Referenced by AddReductionVar().
|
inline |
Returns a reference to the instructions used for type-promoting the recurrence.
Definition at line 277 of file IVDescriptors.h.
Referenced by llvm::LoopVectorizationCostModel::collectValuesToIgnore().
|
inline |
Returns 1st non-reassociative FP instruction in the PHI node's use-chain.
Definition at line 225 of file IVDescriptors.h.
Referenced by findInnerReductionPhi().
|
inline |
Definition at line 214 of file IVDescriptors.h.
Referenced by llvm::VPReductionRecipe::computeCost(), llvm::VPReductionPHIRecipe::execute(), llvm::VPReductionRecipe::execute(), llvm::VPReductionEVLRecipe::execute(), and llvm::LoopVectorizationCostModel::getReductionPatternCost().
|
inline |
Definition at line 218 of file IVDescriptors.h.
|
inline |
Returns the minimum width used by the recurrence in bits.
Definition at line 280 of file IVDescriptors.h.
Referenced by llvm::LoopVectorizationCostModel::getSmallestAndWidestTypes().
|
inline |
Definition at line 212 of file IVDescriptors.h.
References getOpcode(), and getRecurrenceKind().
Referenced by getOpcode(), and getReductionOpChain().
Returns the opcode corresponding to the RecurrenceKind.
Definition at line 1130 of file IVDescriptors.cpp.
References llvm::Add, llvm::And, llvm::FAdd, llvm::FAnyOf, llvm::FFindLastIV, llvm::FMax, llvm::FMaximum, llvm::FMin, llvm::FMinimum, llvm::FMul, llvm::FMulAdd, llvm::IAnyOf, llvm::IFindLastIV, llvm_unreachable, llvm::Mul, llvm::Or, llvm::SMax, llvm::SMin, llvm::UMax, llvm::UMin, and llvm::Xor.
Referenced by llvm::LoopVectorizationCostModel::collectElementTypesForWidening(), llvm::LoopVectorizationCostModel::collectInLoopReductions(), llvm::VPReductionRecipe::computeCost(), llvm::VPReductionRecipe::execute(), llvm::VPReductionEVLRecipe::execute(), llvm::LoopVectorizationCostModel::getReductionPatternCost(), llvm::VPReductionRecipe::print(), and llvm::VPReductionEVLRecipe::print().
|
inline |
Definition at line 210 of file IVDescriptors.h.
Referenced by llvm::VPlanTransforms::clearReductionWrapFlags(), llvm::VPReductionRecipe::computeCost(), llvm::VPReductionPHIRecipe::execute(), llvm::VPReductionRecipe::execute(), llvm::VPReductionEVLRecipe::execute(), fixReductionScalarResumeWhenVectorizingEpilog(), getOpcode(), llvm::LoopVectorizationCostModel::getReductionPatternCost(), llvm::AArch64TTIImpl::isLegalToVectorizeReduction(), llvm::RISCVTTIImpl::isLegalToVectorizeReduction(), isReductionPHI(), and preparePlanForEpilogueVectorLoop().
|
inline |
Definition at line 216 of file IVDescriptors.h.
Referenced by llvm::VPReductionRecipe::execute(), fixReductionScalarResumeWhenVectorizingEpilog(), preparePlanForEpilogueVectorLoop(), and llvm::VPRecipeBuilder::tryToCreateWidenRecipe().
|
inline |
Returns the type of the recurrence.
This type can be narrower than the actual type of the Phi if the recurrence has been type-promoted.
Definition at line 264 of file IVDescriptors.h.
Referenced by llvm::LoopVectorizationCostModel::collectElementTypesForWidening(), llvm::LoopVectorizationCostModel::collectInLoopReductions(), llvm::VPReductionRecipe::computeCost(), llvm::LoopVectorizationCostModel::getReductionPatternCost(), llvm::LoopVectorizationCostModel::getSmallestAndWidestTypes(), llvm::AArch64TTIImpl::isLegalToVectorizeReduction(), and llvm::RISCVTTIImpl::isLegalToVectorizeReduction().
SmallVector< Instruction *, 4 > RecurrenceDescriptor::getReductionOpChain | ( | PHINode * | Phi, |
Loop * | L | ||
) | const |
Attempts to find a chain of operations from Phi to LoopExitInst that can be treated as a set of reductions instructions for in-loop reductions.
Definition at line 1167 of file IVDescriptors.cpp.
References getOpcode(), llvm::Value::hasNUses(), isFMulAddIntrinsic(), llvm::SelectPatternResult::isMinOrMax(), LHS, llvm::matchSelectPattern(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), RHS, and llvm::Value::users().
Referenced by llvm::LoopVectorizationCostModel::collectInLoopReductions().
|
inline |
Returns the sentinel value for FindLastIV recurrences to replace the start value.
Definition at line 268 of file IVDescriptors.h.
References assert(), llvm::Type::getIntegerBitWidth(), llvm::APInt::getSignedMinValue(), llvm::Value::getType(), and isFindLastIVRecurrenceKind().
|
inline |
Returns true if the recurrence has floating-point math that requires precise (ordered) operations.
Definition at line 222 of file IVDescriptors.h.
Referenced by llvm::LoopVectorizationLegality::canVectorizeFPMath().
|
static |
Returns true if instruction I has multiple uses in Insts.
Definition at line 910 of file IVDescriptors.cpp.
References llvm::SmallPtrSetImpl< PtrType >::count(), and I.
Referenced by AddReductionVar().
|
static |
Returns a struct describing whether the instruction is either a Select(ICmp(A, B), X, Y), or Select(FCmp(A, B), X, Y) where one of (X, Y) is a loop invariant integer and the other is a PHI value.
Prev
specifies the description of an already processed select instruction, so its corresponding cmp can be matched to it.
Definition at line 629 of file IVDescriptors.cpp.
References llvm::FAnyOf, llvm::RecurrenceDescriptor::InstDesc::getRecKind(), I, llvm::IAnyOf, llvm::Loop::isLoopInvariant(), llvm::PatternMatch::m_Cmp(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Select(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), and Select.
Referenced by AddReductionVar(), and isRecurrenceInstr().
Returns true if the recurrence kind is of the form select(cmp(),x,y) where one of (x,y) is loop invariant.
Definition at line 252 of file IVDescriptors.h.
References llvm::FAnyOf, and llvm::IAnyOf.
Referenced by AddReductionVar(), llvm::VPReductionRecipe::computeCost(), llvm::createAnyOfReduction(), llvm::createReduction(), llvm::createSimpleReduction(), llvm::VPReductionPHIRecipe::execute(), llvm::VPReductionRecipe::execute(), fixReductionScalarResumeWhenVectorizingEpilog(), llvm::LoopVectorizationCostModel::getInstructionCost(), isRecurrenceInstr(), and preparePlanForEpilogueVectorLoop().
|
static |
Returns a struct describing if the instruction is a Select(FCmp(X, Y), (Z = X op PHINode), PHINode) instruction pattern.
Returns true if the select instruction has users in the compare-and-add reduction pattern below.
The select instruction argument is the last one in the sequence.
sum.1 = phi ... ... cmp = fcmp pred %0, CFP add = fadd %0, sum.1 sum.2 = select cmp, add, sum.1
Definition at line 809 of file IVDescriptors.cpp.
References llvm::Value::hasOneUse(), I, llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_FAdd(), llvm::PatternMatch::m_FMul(), llvm::PatternMatch::m_FSub(), llvm::PatternMatch::m_Mul(), llvm::PatternMatch::m_Sub(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().
Referenced by AddReductionVar(), and isRecurrenceInstr().
|
static |
Returns a struct describing whether the instruction is either a Select(ICmp(A, B), X, Y), or Select(FCmp(A, B), X, Y) where one of (X, Y) is an increasing loop induction variable, and the other is a PHI value.
Definition at line 691 of file IVDescriptors.cpp.
References llvm::ConstantRange::contains(), llvm::dbgs(), llvm::FFindLastIV, llvm::Type::getIntegerBitWidth(), llvm::ConstantRange::getNonEmpty(), llvm::ScalarEvolution::getSCEV(), llvm::APInt::getSignedMinValue(), llvm::ScalarEvolution::getSignedRange(), llvm::Value::hasOneUse(), I, llvm::IFindLastIV, llvm::ScalarEvolution::isKnownPositive(), llvm::ScalarEvolution::isSCEVable(), LLVM_DEBUG, llvm::PatternMatch::m_Cmp(), llvm::PatternMatch::m_CombineOr(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Select(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), and llvm::Sentinel.
Referenced by isRecurrenceInstr().
Returns true if the recurrence kind is of the form select(cmp(),x,y) where one of (x,y) is increasing loop induction.
Definition at line 258 of file IVDescriptors.h.
References llvm::FFindLastIV, and llvm::IFindLastIV.
Referenced by llvm::createFindLastIVReduction(), llvm::createReduction(), llvm::VPReductionPHIRecipe::execute(), getSentinelValue(), and isRecurrenceInstr().
|
static |
Returns true if Phi is a fixed-order recurrence.
A fixed-order recurrence is a non-reduction recurrence relation in which the value of the recurrence in the current loop iteration equals a value defined in a previous iteration (e.g. if the value is defined in the previous iteration, we refer to it as first-order recurrence, if it is defined in the iteration before the previous, we refer to it as second-order recurrence and so on). Note that this function optimistically assumes that uses of the recurrence can be re-ordered if necessary and users need to check and perform the re-ordering.
Definition at line 1042 of file IVDescriptors.cpp.
References llvm::LoopBase< BlockT, LoopT >::contains(), llvm::DominatorTree::dominates(), llvm::SmallVectorBase< Size_T >::empty(), llvm::LoopBase< BlockT, LoopT >::getHeader(), llvm::LoopBase< BlockT, LoopT >::getLoopLatch(), llvm::LoopBase< BlockT, LoopT >::getLoopPreheader(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::Value::users().
Returns true if the recurrence kind is a floating point kind.
Definition at line 61 of file IVDescriptors.cpp.
References isIntegerRecurrenceKind(), and llvm::None.
Referenced by AddReductionVar().
|
inlinestatic |
Returns true if the instruction is a call to the llvm.fmuladd intrinsic.
Definition at line 296 of file IVDescriptors.h.
References I.
Referenced by AddReductionVar(), checkOrderedReduction(), getReductionOpChain(), llvm::LoopVectorizationCostModel::getVectorCallCost(), isRecurrenceInstr(), and llvm::LoopVectorizationCostModel::setVectorizedCallDecision().
Returns true if the recurrence kind is a floating-point min/max kind.
Definition at line 240 of file IVDescriptors.h.
References llvm::FMax, llvm::FMaximum, llvm::FMin, and llvm::FMinimum.
Referenced by AddReductionVar(), isMinMaxRecurrenceKind(), and isRecurrenceInstr().
Returns true if the recurrence kind is an integer kind.
Definition at line 39 of file IVDescriptors.cpp.
References llvm::Add, llvm::And, llvm::FAnyOf, llvm::FFindLastIV, llvm::IAnyOf, llvm::IFindLastIV, llvm::Mul, llvm::Or, llvm::SMax, llvm::SMin, llvm::UMax, llvm::UMin, and llvm::Xor.
Referenced by AddReductionVar(), and isFloatingPointRecurrenceKind().
Returns true if the recurrence kind is an integer min/max kind.
Definition at line 234 of file IVDescriptors.h.
References llvm::SMax, llvm::SMin, llvm::UMax, and llvm::UMin.
Referenced by AddReductionVar(), llvm::slpvectorizer::BoUpSLP::computeMinimumValueSizes(), isMinMaxRecurrenceKind(), and isRecurrenceInstr().
|
static |
Returns a struct describing if the instruction is a llvm.
(s/u)(min/max), llvm.minnum/maxnum or a Select(ICmp(X, Y), X, Y) pair of instructions corresponding to a min(X, Y) or max(X, Y), matching the recurrence kind Kind
. Prev
specifies the description of an already processed select instruction, so its corresponding cmp can be matched to it.
Definition at line 753 of file IVDescriptors.cpp.
References assert(), llvm::FMax, llvm::FMaximum, llvm::FMin, llvm::FMinimum, llvm::RecurrenceDescriptor::InstDesc::getRecKind(), I, isMinMaxRecurrenceKind(), llvm::PatternMatch::m_Cmp(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_OrdOrUnordFMax(), llvm::PatternMatch::m_OrdOrUnordFMin(), llvm::PatternMatch::m_Select(), llvm::PatternMatch::m_SMax(), llvm::PatternMatch::m_SMin(), llvm::PatternMatch::m_UMax(), llvm::PatternMatch::m_UMin(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), Select, llvm::SMax, llvm::SMin, llvm::UMax, and llvm::UMin.
Referenced by AddReductionVar(), and isRecurrenceInstr().
Returns true if the recurrence kind is any min/max kind.
Definition at line 246 of file IVDescriptors.h.
References isFPMinMaxRecurrenceKind(), and isIntMinMaxRecurrenceKind().
Referenced by AddReductionVar(), llvm::VPReductionRecipe::computeCost(), llvm::VPReductionPHIRecipe::execute(), llvm::VPReductionRecipe::execute(), llvm::VPReductionEVLRecipe::execute(), llvm::getOrderedReduction(), llvm::LoopVectorizationCostModel::getReductionPatternCost(), llvm::getShuffleReduction(), and isMinMaxPattern().
|
inline |
Expose an ordered FP reduction to the instance users.
Definition at line 288 of file IVDescriptors.h.
Referenced by llvm::LoopVectorizationLegality::canVectorizeFPMath(), and llvm::LoopVectorizationCostModel::useOrderedReductions().
|
static |
Returns a struct describing if the instruction 'I' can be a recurrence variable of type 'Kind' for a Loop L
and reduction PHI Phi
.
If the recurrence is a min/max pattern of select(icmp()) this function advances the instruction pointer 'I' from the compare instruction to the select instruction and stores this pointer in 'PatternLastInst' member of the returned struct.
Definition at line 850 of file IVDescriptors.cpp.
References llvm::Add, llvm::And, assert(), llvm::FAdd, llvm::FMul, llvm::FMulAdd, llvm::RecurrenceDescriptor::InstDesc::getExactFPMathInst(), llvm::RecurrenceDescriptor::InstDesc::getRecKind(), I, isAnyOfPattern(), isAnyOfRecurrenceKind(), isConditionalRdxPattern(), isFindLastIVPattern(), isFindLastIVRecurrenceKind(), isFMulAddIntrinsic(), isFPMinMaxRecurrenceKind(), isIntMinMaxRecurrenceKind(), isMinMaxPattern(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::Mul, llvm::FastMathFlags::noNaNs(), llvm::None, llvm::FastMathFlags::noSignedZeros(), llvm::Or, and llvm::Xor.
Referenced by AddReductionVar().
|
static |
Returns true if Phi is a reduction in TheLoop.
The RecurrenceDescriptor is returned in RedDes. If either DB
is non-null or AC
and DT
are non-null, the minimal bit width needed to compute the reduction will be computed. If SE
is non-null, store instructions to loop invariant addresses are processed.
Definition at line 924 of file IVDescriptors.cpp.
References llvm::Add, AddReductionVar(), llvm::And, llvm::dbgs(), F, llvm::FAdd, llvm::FAnyOf, llvm::FFindLastIV, llvm::FMax, llvm::FMaximum, llvm::FMin, llvm::FMinimum, llvm::FMul, llvm::FMulAdd, llvm::LoopBase< BlockT, LoopT >::getHeader(), getRecurrenceKind(), llvm::IAnyOf, llvm::IFindLastIV, LLVM_DEBUG, llvm::Mul, llvm::Or, llvm::FastMathFlags::setNoNaNs(), llvm::FastMathFlags::setNoSignedZeros(), llvm::SMax, llvm::SMin, llvm::UMax, llvm::UMin, and llvm::Xor.
Referenced by findInnerReductionPhi().
|
inline |
Returns true if all source operands of the recurrence are SExtInsts.
Definition at line 285 of file IVDescriptors.h.
StoreInst* llvm::RecurrenceDescriptor::IntermediateStore = nullptr |
Reductions may store temporary or final result to an invariant address.
If there is such a store in the loop then, after successfull run of AddReductionVar method, this field will be assigned the last met store.
Definition at line 304 of file IVDescriptors.h.
Referenced by AddReductionVar(), llvm::LoopVectorizationLegality::isInvariantAddressOfReduction(), llvm::LoopVectorizationLegality::isInvariantStoreOfReduction(), llvm::VPReductionRecipe::print(), and llvm::VPReductionEVLRecipe::print().