Skip to content

Commit

Permalink
[SCEV] Change the SCEV Predicates interfaces for conversion to AddRec…
Browse files Browse the repository at this point in the history
…Expr to return SCEVAddRecExpr* instead of SCEV*

Summary:
This changes the conversion functions from SCEV * to SCEVAddRecExpr from
ScalarEvolution and PredicatedScalarEvolution to return a SCEVAddRecExpr*
instead of a SCEV* (which removes the need of most clients to do a
dyn_cast right after calling these functions).

We also don't add new predicates if the transformation was not successful.

This is not entirely a NFC (as it can theoretically remove some predicates
from LAA when we have an unknown dependece), but I couldn't find an obvious
regression test for it.

Reviewers: sanjoy

Subscribers: sanjoy, mzolotukhin, llvm-commits

Differential Revision: http://reviews.llvm.org/D18368

llvm-svn: 264161
  • Loading branch information
sbaranga-arm committed Mar 23, 2016
1 parent ffcad44 commit d68ed85
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 9 deletions.
11 changes: 7 additions & 4 deletions llvm/include/llvm/Analysis/ScalarEvolution.h
Expand Up @@ -1397,8 +1397,9 @@ namespace llvm {
SCEVUnionPredicate &A);
/// Tries to convert the \p S expression to an AddRec expression,
/// adding additional predicates to \p Preds as required.
const SCEV *convertSCEVToAddRecWithPredicates(const SCEV *S, const Loop *L,
SCEVUnionPredicate &Preds);
const SCEVAddRecExpr *
convertSCEVToAddRecWithPredicates(const SCEV *S, const Loop *L,
SCEVUnionPredicate &Preds);

private:
/// Compute the backedge taken count knowing the interval difference, the
Expand Down Expand Up @@ -1495,8 +1496,10 @@ namespace llvm {
/// \brief Adds a new predicate.
void addPredicate(const SCEVPredicate &Pred);
/// \brief Attempts to produce an AddRecExpr for V by adding additional
/// SCEV predicates.
const SCEV *getAsAddRec(Value *V);
/// 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.
const SCEVAddRecExpr *getAsAddRec(Value *V);
/// \brief Proves that V doesn't overflow by adding SCEV predicate.
void setNoOverflow(Value *V, SCEVWrapPredicate::IncrementWrapFlags Flags);
/// \brief Returns true if we've proved that V doesn't wrap by means of a
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/LoopAccessAnalysis.cpp
Expand Up @@ -837,7 +837,7 @@ int llvm::isStridedPtr(PredicatedScalarEvolution &PSE, Value *Ptr,

const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(PtrScev);
if (Assume && !AR)
AR = dyn_cast<SCEVAddRecExpr>(PSE.getAsAddRec(Ptr));
AR = PSE.getAsAddRec(Ptr);

if (!AR) {
DEBUG(dbgs() << "LAA: Bad stride - Not an AddRecExpr pointer " << *Ptr
Expand Down
22 changes: 18 additions & 4 deletions llvm/lib/Analysis/ScalarEvolution.cpp
Expand Up @@ -9908,10 +9908,20 @@ const SCEV *ScalarEvolution::rewriteUsingPredicate(const SCEV *S, const Loop *L,
return SCEVPredicateRewriter::rewrite(S, L, *this, Preds, false);
}

const SCEV *
const SCEVAddRecExpr *
ScalarEvolution::convertSCEVToAddRecWithPredicates(const SCEV *S, const Loop *L,
SCEVUnionPredicate &Preds) {
return SCEVPredicateRewriter::rewrite(S, L, *this, Preds, true);
SCEVUnionPredicate TransformPreds;
S = SCEVPredicateRewriter::rewrite(S, L, *this, TransformPreds, true);
auto *AddRec = dyn_cast<SCEVAddRecExpr>(S);

if (!AddRec)
return nullptr;

// Since the transformation was successful, we can now transfer the SCEV
// predicates.
Preds.add(&TransformPreds);
return AddRec;
}

/// SCEV predicates
Expand Down Expand Up @@ -10126,9 +10136,13 @@ bool PredicatedScalarEvolution::hasNoOverflow(
return Flags == SCEVWrapPredicate::IncrementAnyWrap;
}

const SCEV *PredicatedScalarEvolution::getAsAddRec(Value *V) {
const SCEVAddRecExpr *PredicatedScalarEvolution::getAsAddRec(Value *V) {
const SCEV *Expr = this->getSCEV(V);
const SCEV *New = SE.convertSCEVToAddRecWithPredicates(Expr, &L, Preds);
auto *New = SE.convertSCEVToAddRecWithPredicates(Expr, &L, Preds);

if (!New)
return nullptr;

updateGeneration();
RewriteMap[SE.getSCEV(V)] = {Generation, New};
return New;
Expand Down

0 comments on commit d68ed85

Please sign in to comment.