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