LLVM 22.0.0git
llvm::PredicatedScalarEvolution Class Reference

An interface layer with SCEV used to manage how we see SCEV expressions for values in the context of existing predicates. More...

#include "llvm/Analysis/ScalarEvolution.h"

Public Member Functions

LLVM_ABI PredicatedScalarEvolution (ScalarEvolution &SE, Loop &L)
LLVM_ABI const SCEVPredicategetPredicate () const
LLVM_ABI const SCEVgetSCEV (Value *V)
 Returns the SCEV expression of V, in the context of the current SCEV predicate.
LLVM_ABI const SCEVgetBackedgeTakenCount ()
 Get the (predicated) backedge count for the analyzed loop.
LLVM_ABI const SCEVgetSymbolicMaxBackedgeTakenCount ()
 Get the (predicated) symbolic max backedge count for the analyzed loop.
LLVM_ABI unsigned getSmallConstantMaxTripCount ()
 Returns the upper bound of the loop trip count as a normal unsigned value, or 0 if the trip count is unknown.
LLVM_ABI void addPredicate (const SCEVPredicate &Pred)
 Adds a new predicate.
LLVM_ABI const SCEVAddRecExprgetAsAddRec (Value *V)
 Attempts to produce an AddRecExpr for V by adding additional SCEV predicates.
LLVM_ABI void setNoOverflow (Value *V, SCEVWrapPredicate::IncrementWrapFlags Flags)
 Proves that V doesn't overflow by adding SCEV predicate.
LLVM_ABI bool hasNoOverflow (Value *V, SCEVWrapPredicate::IncrementWrapFlags Flags)
 Returns true if we've proved that V doesn't wrap by means of a SCEV predicate.
ScalarEvolutiongetSE () const
 Returns the ScalarEvolution analysis used.
LLVM_ABI PredicatedScalarEvolution (const PredicatedScalarEvolution &)
 We need to explicitly define the copy constructor because of FlagsMap.
LLVM_ABI void print (raw_ostream &OS, unsigned Depth) const
 Print the SCEV mappings done by the Predicated Scalar Evolution.
LLVM_ABI bool areAddRecsEqualWithPreds (const SCEVAddRecExpr *AR1, const SCEVAddRecExpr *AR2) const
 Check if AR1 and AR2 are equal, while taking into account Equal predicates in Preds.

Detailed Description

An interface layer with SCEV used to manage how we see SCEV expressions for values in the context of existing predicates.

We can add new predicates, but we cannot remove them.

This layer has multiple purposes:

  • provides a simple interface for SCEV versioning.
  • guarantees that the order of transformations applied on a SCEV expression for a single Value is consistent across two different getSCEV calls. This means that, for example, once we've obtained an AddRec expression for a certain value through expression rewriting, we will continue to get an AddRec expression for that Value.
  • lowers the number of expression rewrites.

Definition at line 2423 of file ScalarEvolution.h.

Constructor & Destructor Documentation

◆ PredicatedScalarEvolution() [1/2]

PredicatedScalarEvolution::PredicatedScalarEvolution ( ScalarEvolution & SE,
Loop & L )

◆ PredicatedScalarEvolution() [2/2]

PredicatedScalarEvolution::PredicatedScalarEvolution ( const PredicatedScalarEvolution & Init)

We need to explicitly define the copy constructor because of FlagsMap.

Definition at line 15366 of file ScalarEvolution.cpp.

References I, and PredicatedScalarEvolution().

Member Function Documentation

◆ addPredicate()

◆ areAddRecsEqualWithPreds()

bool PredicatedScalarEvolution::areAddRecsEqualWithPreds ( const SCEVAddRecExpr * AR1,
const SCEVAddRecExpr * AR2 ) const

Check if AR1 and AR2 are equal, while taking into account Equal predicates in Preds.

Definition at line 5745 of file ScalarEvolution.cpp.

References llvm::SCEVAddRecExpr::getStart(), and llvm::SCEVAddRecExpr::getStepRecurrence().

Referenced by getCastsForInductionPHI().

◆ getAsAddRec()

const SCEVAddRecExpr * PredicatedScalarEvolution::getAsAddRec ( Value * V)

Attempts to produce an AddRecExpr for V by adding additional SCEV predicates.

If we can't transform the expression into an AddRecExpr we return nullptr and not add additional SCEV predicates to the current context.

Definition at line 15351 of file ScalarEvolution.cpp.

References addPredicate(), getSCEV(), and P.

Referenced by llvm::getPtrStride(), and llvm::InductionDescriptor::isInductionPHI().

◆ getBackedgeTakenCount()

const SCEV * PredicatedScalarEvolution::getBackedgeTakenCount ( )

Get the (predicated) backedge count for the analyzed loop.

Definition at line 15264 of file ScalarEvolution.cpp.

References addPredicate(), and P.

Referenced by llvm::RuntimePointerChecking::insert(), and processLoopInVPlanNativePath().

◆ getPredicate()

const SCEVPredicate & PredicatedScalarEvolution::getPredicate ( ) const

Definition at line 15305 of file ScalarEvolution.cpp.

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

◆ getSCEV()

const SCEV * PredicatedScalarEvolution::getSCEV ( Value * V)

Returns the SCEV expression of V, in the context of the current SCEV predicate.

The order of transformations applied on the expression of V returned by ScalarEvolution is guaranteed to be preserved, even when adding new predicates.

Definition at line 15245 of file ScalarEvolution.cpp.

Referenced by getAddressAccessSCEV(), getAsAddRec(), getCastsForInductionPHI(), hasNoOverflow(), llvm::InductionDescriptor::isInductionPHI(), llvm::VPlanTransforms::replaceSymbolicStrides(), llvm::replaceSymbolicStrideSCEV(), and setNoOverflow().

◆ getSE()

◆ getSmallConstantMaxTripCount()

unsigned PredicatedScalarEvolution::getSmallConstantMaxTripCount ( )

Returns the upper bound of the loop trip count as a normal unsigned value, or 0 if the trip count is unknown.

Definition at line 15285 of file ScalarEvolution.cpp.

References addPredicate(), and P.

Referenced by getSmallBestKnownTC().

◆ getSymbolicMaxBackedgeTakenCount()

const SCEV * PredicatedScalarEvolution::getSymbolicMaxBackedgeTakenCount ( )

Get the (predicated) symbolic max backedge count for the analyzed loop.

Definition at line 15274 of file ScalarEvolution.cpp.

References addPredicate(), and P.

Referenced by addInitialSkeleton(), and llvm::RuntimePointerChecking::insert().

◆ hasNoOverflow()

bool PredicatedScalarEvolution::hasNoOverflow ( Value * V,
SCEVWrapPredicate::IncrementWrapFlags Flags )

Returns true if we've proved that V doesn't wrap by means of a SCEV predicate.

Definition at line 15335 of file ScalarEvolution.cpp.

References llvm::cast(), llvm::SCEVWrapPredicate::clearFlags(), llvm::SCEVWrapPredicate::getImpliedFlags(), getSCEV(), II, and llvm::SCEVWrapPredicate::IncrementAnyWrap.

Referenced by isNoWrap().

◆ print()

void PredicatedScalarEvolution::print ( raw_ostream & OS,
unsigned Depth ) const

Print the SCEV mappings done by the Predicated Scalar Evolution.

The printed text is indented by Depth.

Definition at line 15376 of file ScalarEvolution.cpp.

References llvm::Depth, I, II, and llvm::raw_ostream::indent().

◆ setNoOverflow()

void PredicatedScalarEvolution::setNoOverflow ( Value * V,
SCEVWrapPredicate::IncrementWrapFlags Flags )

Proves that V doesn't overflow by adding SCEV predicate.

Definition at line 15319 of file ScalarEvolution.cpp.

References addPredicate(), llvm::cast(), llvm::SCEVWrapPredicate::clearFlags(), llvm::SCEVWrapPredicate::getImpliedFlags(), getSCEV(), II, and llvm::SCEVWrapPredicate::setFlags().

Referenced by isNoWrap().


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