ScopInfo: Add isStrideX to unify stride checking

llvm-svn: 148810
diff --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h
index 7da5dbf..dcd4c7c 100755
--- a/polly/include/polly/ScopInfo.h
+++ b/polly/include/polly/ScopInfo.h
@@ -140,15 +140,18 @@
 
   /// @brief Get the stride of this memory access in the specified domain
   ///        subset.
-  isl_set *getStride(const isl_set *domainSubset) const;
+  isl_set *getStride(__isl_take const isl_set *domainSubset) const;
+
+  /// @brief Is the stride of the access equal to a certain width.
+  bool isStrideX(__isl_take const isl_set *DomainSubset, int StrideWidth) const;
 
   /// @brief Is consecutive memory accessed for a given
   ///        statement instance set?
-  bool isStrideOne(const isl_set *domainSubset) const;
+  bool isStrideOne(__isl_take const isl_set *domainSubset) const;
 
   /// @brief Is always the same memory accessed for a given
   ///        statement instance set?
-  bool isStrideZero(const isl_set *domainSubset) const;
+  bool isStrideZero(__isl_take const isl_set *domainSubset) const;
 
   /// @brief Get the statement that contains this memory access.
   ScopStmt *getStatement() const { return statement; }
diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp
index 6d58b3f..d4b2dda 100644
--- a/polly/lib/Analysis/ScopInfo.cpp
+++ b/polly/lib/Analysis/ScopInfo.cpp
@@ -429,9 +429,9 @@
   return isl_map_from_basic_map(bmap);
 }
 
-isl_set *MemoryAccess::getStride(const isl_set *domainSubset) const {
+isl_set *MemoryAccess::getStride(__isl_take const isl_set *domainSubset) const {
   isl_map *accessRelation = getAccessRelation();
-  isl_set *scatteringDomain = isl_set_copy(const_cast<isl_set*>(domainSubset));
+  isl_set *scatteringDomain = const_cast<isl_set*>(domainSubset);
   isl_map *scattering = getStatement()->getScattering();
 
   scattering = isl_map_reverse(scattering);
@@ -458,34 +458,28 @@
   return isl_map_deltas(nextScatt);
 }
 
-bool MemoryAccess::isStrideZero(const isl_set *DomainSubset) const {
-  isl_set *Stride, *StrideZero;
-  bool IsStrideZero;
+bool MemoryAccess::isStrideX(__isl_take const isl_set *DomainSubset,
+                             int StrideWidth) const {
+  isl_set *Stride, *StrideX;
+  bool IsStrideX;
 
   Stride = getStride(DomainSubset);
-  StrideZero = isl_set_universe(isl_set_get_space(Stride));
-  StrideZero = isl_set_fix_si(StrideZero, isl_dim_set, 0, 0);
-  IsStrideZero = isl_set_is_equal(Stride, StrideZero);
+  StrideX = isl_set_universe(isl_set_get_space(Stride));
+  StrideX = isl_set_fix_si(StrideX, isl_dim_set, 0, StrideWidth);
+  IsStrideX = isl_set_is_equal(Stride, StrideX);
 
-  isl_set_free(StrideZero);
+  isl_set_free(StrideX);
   isl_set_free(Stride);
 
-  return IsStrideZero;
+  return IsStrideX;
+}
+
+bool MemoryAccess::isStrideZero(const isl_set *DomainSubset) const {
+  return isStrideX(DomainSubset, 0);
 }
 
 bool MemoryAccess::isStrideOne(const isl_set *DomainSubset) const {
-  isl_set *Stride, *StrideOne;
-  bool IsStrideOne;
-
-  Stride = getStride(DomainSubset);
-  StrideOne = isl_set_universe(isl_set_get_space(Stride));
-  StrideOne = isl_set_fix_si(StrideOne, isl_dim_set, 0, 1);
-  IsStrideOne = isl_set_is_equal(Stride, StrideOne);
-
-  isl_set_free(StrideOne);
-  isl_set_free(Stride);
-
-  return IsStrideOne;
+  return isStrideX(DomainSubset, 1);
 }
 
 void MemoryAccess::setNewAccessRelation(isl_map *newAccess) {
diff --git a/polly/lib/CodeGeneration.cpp b/polly/lib/CodeGeneration.cpp
index d586a99..393b7e8 100644
--- a/polly/lib/CodeGeneration.cpp
+++ b/polly/lib/CodeGeneration.cpp
@@ -456,9 +456,9 @@
 
     assert(scatteringDomain && "No scattering domain available");
 
-    if (Access.isStrideZero(scatteringDomain))
+    if (Access.isStrideZero(isl_set_copy(scatteringDomain)))
       newLoad = generateStrideZeroLoad(load, scalarMaps[0], vectorWidth);
-    else if (Access.isStrideOne(scatteringDomain))
+    else if (Access.isStrideOne(isl_set_copy(scatteringDomain)))
       newLoad = generateStrideOneLoad(load, scalarMaps[0], vectorWidth);
     else
       newLoad = generateUnknownStrideLoad(load, scalarMaps, vectorWidth);
@@ -515,7 +515,7 @@
     const Value *pointer = store->getPointerOperand();
     Value *vector = getOperand(store->getValueOperand(), BBMap, &vectorMap);
 
-    if (Access.isStrideOne(scatteringDomain)) {
+    if (Access.isStrideOne(isl_set_copy(scatteringDomain))) {
       Type *vectorPtrType = getVectorPtrTy(pointer, vectorWidth);
       Value *newPointer = getOperand(pointer, BBMap, &vectorMap);
 
@@ -1259,7 +1259,8 @@
     for (int i = 1; i < vectorWidth; i++)
       IVS[i] = Builder.CreateAdd(IVS[i-1], StrideValue, "p_vector_iv");
 
-    isl_set *scatteringDomain = isl_set_from_cloog_domain(f->domain);
+    isl_set *scatteringDomain =
+      isl_set_copy(isl_set_from_cloog_domain(f->domain));
 
     // Add loop iv to symbols.
     (*clastVars)[f->iterator] = LB;
@@ -1273,6 +1274,7 @@
     }
 
     // Loop is finished, so remove its iv from the live symbols.
+    isl_set_free(scatteringDomain);
     clastVars->erase(f->iterator);
   }