LLVM  6.0.0svn
Public Types | Public Member Functions | Static Public Member Functions | List of all members
llvm::InductionDescriptor Class Reference

A struct for saving information about induction variables. More...

#include "llvm/Transforms/Utils/LoopUtils.h"

Public Types

enum  InductionKind { IK_NoInduction, IK_IntInduction, IK_PtrInduction, IK_FpInduction }
 This enum represents the kinds of inductions that we support. More...
 

Public Member Functions

 InductionDescriptor ()=default
 Default constructor - creates an invalid induction. More...
 
int getConsecutiveDirection () const
 Get the consecutive direction. More...
 
Valuetransform (IRBuilder<> &B, Value *Index, ScalarEvolution *SE, const DataLayout &DL) const
 Compute the transformed value of Index at offset StartValue using step StepValue. More...
 
ValuegetStartValue () const
 
InductionKind getKind () const
 
const SCEVgetStep () const
 
ConstantIntgetConstIntStepValue () const
 
bool hasUnsafeAlgebra ()
 Returns true if the induction type is FP and the binary operator does not have the "fast-math" property. More...
 
InstructiongetUnsafeAlgebraInst ()
 Returns induction operator that does not have "fast-math" property and requires FP unsafe mode. More...
 
Instruction::BinaryOps getInductionOpcode () const
 Returns binary opcode of the induction operator. More...
 

Static Public Member Functions

static bool isInductionPHI (PHINode *Phi, const Loop *L, ScalarEvolution *SE, InductionDescriptor &D, const SCEV *Expr=nullptr)
 Returns true if Phi is an induction in the loop L. More...
 
static bool isFPInductionPHI (PHINode *Phi, const Loop *L, ScalarEvolution *SE, InductionDescriptor &D)
 Returns true if Phi is a floating point induction in the loop L. More...
 
static bool isInductionPHI (PHINode *Phi, const Loop *L, PredicatedScalarEvolution &PSE, InductionDescriptor &D, bool Assume=false)
 Returns true if Phi is a loop L induction, in the context associated with the run-time predicate of PSE. More...
 

Detailed Description

A struct for saving information about induction variables.

Definition at line 271 of file LoopUtils.h.

Member Enumeration Documentation

◆ InductionKind

This enum represents the kinds of inductions that we support.

Enumerator
IK_NoInduction 

Not an induction variable.

IK_IntInduction 

Integer induction variable. Step = C.

IK_PtrInduction 

Pointer induction var. Step = C / sizeof(elem).

IK_FpInduction 

Floating point induction variable.

Definition at line 274 of file LoopUtils.h.

Constructor & Destructor Documentation

◆ InductionDescriptor()

llvm::InductionDescriptor::InductionDescriptor ( )
default

Default constructor - creates an invalid induction.

Referenced by llvm::RecurrenceDescriptor::createMinMaxOp().

Member Function Documentation

◆ getConsecutiveDirection()

int InductionDescriptor::getConsecutiveDirection ( ) const

Get the consecutive direction.

Returns: 0 - unknown or non-consecutive. 1 - consecutive and increasing. -1 - consecutive and decreasing.

Definition at line 710 of file LoopUtils.cpp.

References llvm::ConstantInt::getSExtValue(), llvm::ConstantInt::isMinusOne(), and llvm::ConstantInt::isOne().

◆ getConstIntStepValue()

ConstantInt * InductionDescriptor::getConstIntStepValue ( ) const

Definition at line 717 of file LoopUtils.cpp.

References llvm::dyn_cast().

Referenced by hasOutsideLoopUser().

◆ getInductionOpcode()

Instruction::BinaryOps llvm::InductionDescriptor::getInductionOpcode ( ) const
inline

◆ getKind()

InductionKind llvm::InductionDescriptor::getKind ( ) const
inline

Definition at line 301 of file LoopUtils.h.

Referenced by llvm::LoopVectorizationPlanner::buildVPlans(), and hasOutsideLoopUser().

◆ getStartValue()

Value* llvm::InductionDescriptor::getStartValue ( ) const
inline

◆ getStep()

const SCEV* llvm::InductionDescriptor::getStep ( ) const
inline

◆ getUnsafeAlgebraInst()

Instruction* llvm::InductionDescriptor::getUnsafeAlgebraInst ( )
inline

Returns induction operator that does not have "fast-math" property and requires FP unsafe mode.

Definition at line 340 of file LoopUtils.h.

Referenced by hasOutsideLoopUser().

◆ hasUnsafeAlgebra()

bool llvm::InductionDescriptor::hasUnsafeAlgebra ( )
inline

Returns true if the induction type is FP and the binary operator does not have the "fast-math" property.

Such operation requires a relaxed FP mode.

Definition at line 333 of file LoopUtils.h.

Referenced by hasOutsideLoopUser().

◆ isFPInductionPHI()

bool InductionDescriptor::isFPInductionPHI ( PHINode Phi,
const Loop L,
ScalarEvolution SE,
InductionDescriptor D 
)
static

◆ isInductionPHI() [1/2]

bool InductionDescriptor::isInductionPHI ( PHINode Phi,
const Loop L,
ScalarEvolution SE,
InductionDescriptor D,
const SCEV Expr = nullptr 
)
static

◆ isInductionPHI() [2/2]

bool InductionDescriptor::isInductionPHI ( PHINode Phi,
const Loop L,
PredicatedScalarEvolution PSE,
InductionDescriptor D,
bool  Assume = false 
)
static

Returns true if Phi is a loop L induction, in the context associated with the run-time predicate of PSE.

If Assume is true, this can add further SCEV predicates to PSE in order to prove that Phi is an induction. If Phi is an induction, D will contain the data describing this induction.

Definition at line 844 of file LoopUtils.cpp.

References D, llvm::dbgs(), DEBUG, llvm::dyn_cast(), llvm::PredicatedScalarEvolution::getAsAddRec(), llvm::PredicatedScalarEvolution::getSCEV(), llvm::PredicatedScalarEvolution::getSE(), llvm::Value::getType(), llvm::Type::isDoubleTy(), llvm::Type::isFloatingPointTy(), llvm::Type::isFloatTy(), llvm::Type::isHalfTy(), llvm::Type::isIntegerTy(), and llvm::Type::isPointerTy().

◆ transform()

Value * InductionDescriptor::transform ( IRBuilder<> &  B,
Value Index,
ScalarEvolution SE,
const DataLayout DL 
) const

Compute the transformed value of Index at offset StartValue using step StepValue.

For integer induction, returns StartValue + Index * StepValue. For pointer induction, returns StartValue[Index * StepValue]. FIXME: The newly created binary instructions should contain nsw/nuw flags, which can be found from the original scalar operations.

Definition at line 723 of file LoopUtils.cpp.

References assert(), llvm::IRBuilder< T, Inserter >::CreateAdd(), llvm::IRBuilder< T, Inserter >::CreateBinOp(), llvm::IRBuilder< T, Inserter >::CreateFMul(), llvm::IRBuilder< T, Inserter >::CreateGEP(), llvm::IRBuilder< T, Inserter >::CreateSub(), llvm::SCEVExpander::expandCodeFor(), llvm::ScalarEvolution::getAddExpr(), llvm::IRBuilderBase::GetInsertPoint(), llvm::ScalarEvolution::getMulExpr(), llvm::ScalarEvolution::getSCEV(), llvm::SCEV::getType(), llvm::Value::getType(), llvm::Type::isFloatingPointTy(), llvm_unreachable, and llvm::FastMathFlags::setUnsafeAlgebra().

Referenced by llvm::InnerLoopVectorizer::createVectorizedLoopSkeleton(), and llvm::InnerLoopVectorizer::fixupIVUsers().


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