mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[SCEV] Change the SCEV Predicates interfaces for conversion to AddRecExpr 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
This commit is contained in:
parent
79fec3ae99
commit
42dfa7b3ff
@ -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
|
||||
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user