LLVM  8.0.0svn
Public Types | Public Member Functions | List of all members
llvm::LoopVectorizationLegality Class Reference

LoopVectorizationLegality checks if it is legal to vectorize a loop, and to what vectorization factor. More...

#include "llvm/Transforms/Vectorize/LoopVectorizationLegality.h"

Public Types

using ReductionList = DenseMap< PHINode *, RecurrenceDescriptor >
 ReductionList contains the reduction descriptors for all of the reductions that were found in the loop. More...
 
using InductionList = MapVector< PHINode *, InductionDescriptor >
 InductionList saves induction variables and maps them to the induction descriptor. More...
 
using RecurrenceSet = SmallPtrSet< const PHINode *, 8 >
 RecurrenceSet contains the phi nodes that are recurrences other than inductions and reductions. More...
 

Public Member Functions

 LoopVectorizationLegality (Loop *L, PredicatedScalarEvolution &PSE, DominatorTree *DT, TargetLibraryInfo *TLI, AliasAnalysis *AA, Function *F, std::function< const LoopAccessInfo &(Loop &)> *GetLAA, LoopInfo *LI, OptimizationRemarkEmitter *ORE, LoopVectorizationRequirements *R, LoopVectorizeHints *H, DemandedBits *DB, AssumptionCache *AC)
 
bool canVectorize (bool UseVPlanNativePath)
 Returns true if it is legal to vectorize this loop. More...
 
PHINodegetPrimaryInduction ()
 Returns the primary induction variable. More...
 
ReductionListgetReductionVars ()
 Returns the reduction variables found in the loop. More...
 
InductionListgetInductionVars ()
 Returns the induction variables found in the loop. More...
 
RecurrenceSetgetFirstOrderRecurrences ()
 Return the first-order recurrences found in the loop. More...
 
DenseMap< Instruction *, Instruction * > & getSinkAfter ()
 Return the set of instructions to sink to handle first-order recurrences. More...
 
TypegetWidestInductionType ()
 Returns the widest induction type. More...
 
bool isInductionPhi (const Value *V)
 Returns True if V is a Phi node of an induction variable in this loop. More...
 
bool isCastedInductionVariable (const Value *V)
 Returns True if V is a cast that is part of an induction def-use chain, and had been proven to be redundant under a runtime guard (in other words, the cast has the same SCEV expression as the induction phi). More...
 
bool isInductionVariable (const Value *V)
 Returns True if V can be considered as an induction variable in this loop. More...
 
bool isReductionVariable (PHINode *PN)
 Returns True if PN is a reduction variable in this loop. More...
 
bool isFirstOrderRecurrence (const PHINode *Phi)
 Returns True if Phi is a first-order recurrence in this loop. More...
 
bool blockNeedsPredication (BasicBlock *BB)
 Return true if the block BB needs to be predicated in order for the loop to be vectorized. More...
 
int isConsecutivePtr (Value *Ptr)
 Check if this pointer is consecutive when vectorizing. More...
 
bool isUniform (Value *V)
 Returns true if the value V is uniform within the loop. More...
 
const RuntimePointerCheckinggetRuntimePointerChecking () const
 Returns the information that we collected about runtime memory check. More...
 
const LoopAccessInfogetLAI () const
 
unsigned getMaxSafeDepDistBytes ()
 
uint64_t getMaxSafeRegisterWidth () const
 
bool hasStride (Value *V)
 
bool isMaskRequired (const Instruction *I)
 Returns true if vector representation of the instruction I requires mask. More...
 
unsigned getNumStores () const
 
unsigned getNumLoads () const
 
bool hasFunNoNaNAttr () const
 

Detailed Description

LoopVectorizationLegality checks if it is legal to vectorize a loop, and to what vectorization factor.

This class does not look at the profitability of vectorization, only the legality. This class has two main kinds of checks:

Definition at line 212 of file LoopVectorizationLegality.h.

Member Typedef Documentation

◆ InductionList

InductionList saves induction variables and maps them to the induction descriptor.

Definition at line 229 of file LoopVectorizationLegality.h.

◆ RecurrenceSet

RecurrenceSet contains the phi nodes that are recurrences other than inductions and reductions.

Definition at line 233 of file LoopVectorizationLegality.h.

◆ ReductionList

ReductionList contains the reduction descriptors for all of the reductions that were found in the loop.

Definition at line 225 of file LoopVectorizationLegality.h.

Constructor & Destructor Documentation

◆ LoopVectorizationLegality()

llvm::LoopVectorizationLegality::LoopVectorizationLegality ( Loop L,
PredicatedScalarEvolution PSE,
DominatorTree DT,
TargetLibraryInfo TLI,
AliasAnalysis AA,
Function F,
std::function< const LoopAccessInfo &(Loop &)> *  GetLAA,
LoopInfo LI,
OptimizationRemarkEmitter ORE,
LoopVectorizationRequirements R,
LoopVectorizeHints H,
DemandedBits DB,
AssumptionCache AC 
)
inline

Definition at line 214 of file LoopVectorizationLegality.h.

Member Function Documentation

◆ blockNeedsPredication()

bool llvm::LoopVectorizationLegality::blockNeedsPredication ( BasicBlock BB)

◆ canVectorize()

bool llvm::LoopVectorizationLegality::canVectorize ( bool  UseVPlanNativePath)

Returns true if it is legal to vectorize this loop.

This does not mean that it is profitable to vectorize this loop, only that it is legal to do so. Temporarily taking UseVPlanNativePath parameter. If true, take the new code path being implemented for outer loop vectorization (should be functional for inner loop vectorization) based on VPlan. If false, good old LV code.

Definition at line 981 of file LoopVectorizationLegality.cpp.

References assert(), llvm::dbgs(), DEBUG_TYPE, llvm::LoopVectorizeHints::FK_Enabled, LLVM_DEBUG, PragmaVectorizeSCEVCheckThreshold, Result, and VectorizeSCEVCheckThreshold.

Referenced by llvm::LoopVectorizePass::processLoop().

◆ getFirstOrderRecurrences()

RecurrenceSet* llvm::LoopVectorizationLegality::getFirstOrderRecurrences ( )
inline

Return the first-order recurrences found in the loop.

Definition at line 254 of file LoopVectorizationLegality.h.

◆ getInductionVars()

InductionList* llvm::LoopVectorizationLegality::getInductionVars ( )
inline

◆ getLAI()

const LoopAccessInfo* llvm::LoopVectorizationLegality::getLAI ( ) const
inline

◆ getMaxSafeDepDistBytes()

unsigned llvm::LoopVectorizationLegality::getMaxSafeDepDistBytes ( )
inline

◆ getMaxSafeRegisterWidth()

uint64_t llvm::LoopVectorizationLegality::getMaxSafeRegisterWidth ( ) const
inline

◆ getNumLoads()

unsigned llvm::LoopVectorizationLegality::getNumLoads ( ) const
inline

◆ getNumStores()

unsigned llvm::LoopVectorizationLegality::getNumStores ( ) const
inline

◆ getPrimaryInduction()

PHINode* llvm::LoopVectorizationLegality::getPrimaryInduction ( )
inline

◆ getReductionVars()

ReductionList* llvm::LoopVectorizationLegality::getReductionVars ( )
inline

◆ getRuntimePointerChecking()

const RuntimePointerChecking* llvm::LoopVectorizationLegality::getRuntimePointerChecking ( ) const
inline

Returns the information that we collected about runtime memory check.

Definition at line 301 of file LoopVectorizationLegality.h.

Referenced by llvm::LoopVectorizationCostModel::computeMaxVF(), and llvm::LoopVectorizationCostModel::selectInterleaveCount().

◆ getSinkAfter()

DenseMap<Instruction *, Instruction *>& llvm::LoopVectorizationLegality::getSinkAfter ( )
inline

Return the set of instructions to sink to handle first-order recurrences.

Definition at line 257 of file LoopVectorizationLegality.h.

Referenced by llvm::VPRecipeBuilder::tryToCreateRecipe().

◆ getWidestInductionType()

Type* llvm::LoopVectorizationLegality::getWidestInductionType ( )
inline

◆ hasFunNoNaNAttr()

bool llvm::LoopVectorizationLegality::hasFunNoNaNAttr ( ) const
inline

◆ hasStride()

bool llvm::LoopVectorizationLegality::hasStride ( Value V)
inline

◆ isCastedInductionVariable()

bool llvm::LoopVectorizationLegality::isCastedInductionVariable ( const Value V)

Returns True if V is a cast that is part of an induction def-use chain, and had been proven to be redundant under a runtime guard (in other words, the cast has the same SCEV expression as the induction phi).

Definition at line 780 of file LoopVectorizationLegality.cpp.

References llvm::dyn_cast().

◆ isConsecutivePtr()

int llvm::LoopVectorizationLegality::isConsecutivePtr ( Value Ptr)

Check if this pointer is consecutive when vectorizing.

This happens when the last index of the GEP is the induction variable, or that the pointer itself is an induction variable. This check allows us to vectorize A[idx] into a wide load/store. Returns: 0 - Stride is unknown or non-consecutive. 1 - Address is consecutive. -1 - Address is consecutive, and decreasing. NOTE: This method must only be used before modifying the original scalar loop. Do not use after invoking 'createVectorizedLoopSkeleton' (PR34965).

Definition at line 454 of file LoopVectorizationLegality.cpp.

References llvm::getPtrStride().

Referenced by llvm::createLoopVectorizePass(), llvm::LoopVectorizationCostModel::isLegalMaskedLoad(), llvm::LoopVectorizationCostModel::isLegalMaskedStore(), isStrideMul(), llvm::LoopVectorizationCostModel::memoryInstructionCanBeWidened(), and llvm::LoopVectorizationCostModel::setCostBasedWideningDecision().

◆ isFirstOrderRecurrence()

bool llvm::LoopVectorizationLegality::isFirstOrderRecurrence ( const PHINode Phi)

◆ isInductionPhi()

bool llvm::LoopVectorizationLegality::isInductionPhi ( const Value V)

Returns True if V is a Phi node of an induction variable in this loop.

Definition at line 771 of file LoopVectorizationLegality.cpp.

Referenced by llvm::LoopVectorizationCostModel::isOptimizableIVTruncate().

◆ isInductionVariable()

bool llvm::LoopVectorizationLegality::isInductionVariable ( const Value V)

Returns True if V can be considered as an induction variable in this loop.

V can be the induction phi, or some redundant cast in the def-use chain of the inducion phi.

Definition at line 785 of file LoopVectorizationLegality.cpp.

Referenced by getAddressAccessSCEV().

◆ isMaskRequired()

bool llvm::LoopVectorizationLegality::isMaskRequired ( const Instruction I)
inline

Returns true if vector representation of the instruction I requires mask.

Definition at line 317 of file LoopVectorizationLegality.h.

Referenced by llvm::LoopVectorizationCostModel::isScalarWithPredication(), isStrideMul(), and llvm::VPRecipeBuilder::tryToWidenMemory().

◆ isReductionVariable()

bool llvm::LoopVectorizationLegality::isReductionVariable ( PHINode PN)
inline

◆ isUniform()

bool llvm::LoopVectorizationLegality::isUniform ( Value V)

Returns true if the value V is uniform within the loop.

Definition at line 464 of file LoopVectorizationLegality.cpp.

References assert(), llvm::SmallVectorTemplateCommon< T >::begin(), llvm::convertPointerToIntegerType(), llvm::dbgs(), DEBUG_TYPE, llvm::dyn_cast(), llvm::SmallVectorBase::empty(), F(), llvm::InductionDescriptor::getCastInsts(), llvm::InductionDescriptor::getConstIntStepValue(), llvm::Module::getDataLayout(), llvm::Function::getFnAttribute(), llvm::PHINode::getIncomingValueForBlock(), llvm::InductionDescriptor::getKind(), llvm::RecurrenceDescriptor::getLoopExitInstr(), llvm::Instruction::getModule(), llvm::PHINode::getNumIncomingValues(), llvm::BasicBlock::getParent(), llvm::InductionDescriptor::getStartValue(), llvm::Value::getType(), llvm::RecurrenceDescriptor::getUnsafeAlgebraInst(), llvm::InductionDescriptor::getUnsafeAlgebraInst(), llvm::Attribute::getValueAsString(), llvm::getVectorIntrinsicIDForCall(), llvm::getWiderType(), llvm::hasOutsideLoopUser(), llvm::RecurrenceDescriptor::hasUnsafeAlgebra(), llvm::InductionDescriptor::hasUnsafeAlgebra(), llvm::hasVectorInstrinsicScalarOpd(), I, llvm::InductionDescriptor::IK_IntInduction, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::RecurrenceDescriptor::isFirstOrderRecurrence(), llvm::Type::isFloatingPointTy(), llvm::InductionDescriptor::isInductionPHI(), llvm::Type::isIntegerTy(), llvm::ConstantInt::isOne(), llvm::Type::isPointerTy(), llvm::RecurrenceDescriptor::isReductionPHI(), llvm::isUniformLoopNest(), llvm::VectorType::isValidElementType(), LLVM_DEBUG, Result, and llvm::ARM_MB::ST.

Referenced by llvm::LoopVectorizationCostModel::setCostBasedWideningDecision().


The documentation for this class was generated from the following files: