only delinearize when the access function is not affine
llvm-svn: 205971
diff --git a/polly/lib/Analysis/ScopDetection.cpp b/polly/lib/Analysis/ScopDetection.cpp
index 5f03e7a..9ce0fc7 100644
--- a/polly/lib/Analysis/ScopDetection.cpp
+++ b/polly/lib/Analysis/ScopDetection.cpp
@@ -364,12 +364,19 @@
return invalid<ReportVariantBasePtr>(Context, /*Assert=*/false, BaseValue);
AccessFunction = SE->getMinusSCEV(AccessFunction, BasePointer);
- const SCEVAddRecExpr *AF = dyn_cast<SCEVAddRecExpr>(AccessFunction);
if (AllowNonAffine) {
// Do not check whether AccessFunction is affine.
- } else if (PollyDelinearize && AF) {
- // Try to delinearize AccessFunction.
+ } else if (!isAffineExpr(&Context.CurRegion, AccessFunction, *SE,
+ BaseValue)) {
+ const SCEVAddRecExpr *AF = dyn_cast<SCEVAddRecExpr>(AccessFunction);
+ if (!PollyDelinearize || !AF)
+ return invalid<ReportNonAffineAccess>(Context, /*Assert=*/true,
+ AccessFunction);
+
+ // Try to delinearize AccessFunction only when the expression is known to
+ // not be affine: as all affine functions can be represented without
+ // problems in Polly, we do not have to delinearize them.
SmallVector<const SCEV *, 4> Subscripts, Sizes;
AF->delinearize(*SE, Subscripts, Sizes);
int size = Subscripts.size();
@@ -378,10 +385,6 @@
if (!isAffineExpr(&Context.CurRegion, Subscripts[i], *SE, BaseValue))
return invalid<ReportNonAffineAccess>(Context, /*Assert=*/true,
AccessFunction);
- } else if (!isAffineExpr(&Context.CurRegion, AccessFunction, *SE,
- BaseValue)) {
- return invalid<ReportNonAffineAccess>(Context, /*Assert=*/true,
- AccessFunction);
}
// FIXME: Alias Analysis thinks IntToPtrInst aliases with alloca instructions