2323#include " llvm/ADT/SmallVector.h"
2424#include " llvm/Analysis/AliasAnalysis.h"
2525#include " llvm/Analysis/AliasSetTracker.h"
26+ #include " llvm/Analysis/IVDescriptors.h"
2627#include " llvm/Analysis/LoopAnalysisManager.h"
2728#include " llvm/Analysis/LoopInfo.h"
2829#include " llvm/Analysis/LoopIterator.h"
@@ -854,7 +855,8 @@ static bool isNoWrap(PredicatedScalarEvolution &PSE, const SCEVAddRecExpr *AR,
854855 if (AR->getNoWrapFlags (SCEV::NoWrapMask))
855856 return true ;
856857
857- if (Ptr && PSE.hasNoOverflow (Ptr, SCEVWrapPredicate::IncrementNUSW))
858+ if (Ptr && isa<SCEVAddRecExpr>(PSE.getSCEV (Ptr)) &&
859+ PSE.hasNoOverflow (Ptr, SCEVWrapPredicate::IncrementNUSW))
858860 return true ;
859861
860862 // The address calculation must not wrap. Otherwise, a dependence could be
@@ -1088,6 +1090,20 @@ static void findForkedSCEVs(
10881090 }
10891091}
10901092
1093+ // Conservatively replace SCEV of Ptr value if it can't be computed directly,
1094+ // e.g. for monotonic values (they can be treated as affine AddRecs that are
1095+ // updated under some predicate).
1096+ static const SCEV *
1097+ replacePtrSCEV (PredicatedScalarEvolution &PSE, Value *Ptr,
1098+ const DenseMap<Value *, const SCEV *> &StridesMap,
1099+ const Loop *L) {
1100+ ScalarEvolution *SE = PSE.getSE ();
1101+ if (MonotonicDescriptor MD;
1102+ MonotonicDescriptor::isMonotonicVal (Ptr, L, MD, *SE))
1103+ return MD.getExpr ();
1104+ return replaceSymbolicStrideSCEV (PSE, StridesMap, Ptr);
1105+ }
1106+
10911107static SmallVector<PointerIntPair<const SCEV *, 1 , bool >>
10921108findForkedPointer (PredicatedScalarEvolution &PSE,
10931109 const DenseMap<Value *, const SCEV *> &StridesMap, Value *Ptr,
@@ -1110,7 +1126,7 @@ findForkedPointer(PredicatedScalarEvolution &PSE,
11101126 return Scevs;
11111127 }
11121128
1113- return {{replaceSymbolicStrideSCEV (PSE, StridesMap, Ptr ), false }};
1129+ return {{replacePtrSCEV (PSE, Ptr, StridesMap, L ), false }};
11141130}
11151131
11161132bool AccessAnalysis::createCheckForAccess (
@@ -1141,8 +1157,7 @@ bool AccessAnalysis::createCheckForAccess(
11411157 // If there's only one option for Ptr, look it up after bounds and wrap
11421158 // checking, because assumptions might have been added to PSE.
11431159 if (TranslatedPtrs.size () == 1 ) {
1144- AR =
1145- cast<SCEVAddRecExpr>(replaceSymbolicStrideSCEV (PSE, StridesMap, Ptr));
1160+ AR = cast<SCEVAddRecExpr>(replacePtrSCEV (PSE, Ptr, StridesMap, TheLoop));
11461161 P.setPointer (AR);
11471162 }
11481163
0 commit comments