isl: vector code generation based on ISL ast

Original patch by Tobias Grosser, slightly modified by Sebastian Pop.

llvm-svn: 170420
diff --git a/polly/lib/CodeGen/CodeGeneration.cpp b/polly/lib/CodeGen/CodeGeneration.cpp
index 60302cb..ad70375 100644
--- a/polly/lib/CodeGen/CodeGeneration.cpp
+++ b/polly/lib/CodeGen/CodeGeneration.cpp
@@ -768,45 +768,9 @@
   return true;
 }
 
-int ClastStmtCodeGen::getNumberOfIterations(const clast_for *f) {
-  isl_set *loopDomain = isl_set_copy(isl_set_from_cloog_domain(f->domain));
-  isl_set *tmp = isl_set_copy(loopDomain);
-
-  // Calculate a map similar to the identity map, but with the last input
-  // and output dimension not related.
-  //  [i0, i1, i2, i3] -> [i0, i1, i2, o0]
-  isl_space *Space = isl_set_get_space(loopDomain);
-  Space = isl_space_drop_outputs(Space,
-                                 isl_set_dim(loopDomain, isl_dim_set) - 2, 1);
-  Space = isl_space_map_from_set(Space);
-  isl_map *identity = isl_map_identity(Space);
-  identity = isl_map_add_dims(identity, isl_dim_in, 1);
-  identity = isl_map_add_dims(identity, isl_dim_out, 1);
-
-  isl_map *map = isl_map_from_domain_and_range(tmp, loopDomain);
-  map = isl_map_intersect(map, identity);
-
-  isl_map *lexmax = isl_map_lexmax(isl_map_copy(map));
-  isl_map *lexmin = isl_map_lexmin(map);
-  isl_map *sub = isl_map_sum(lexmax, isl_map_neg(lexmin));
-
-  isl_set *elements = isl_map_range(sub);
-
-  if (!isl_set_is_singleton(elements)) {
-    isl_set_free(elements);
-    return -1;
-  }
-
-  isl_point *p = isl_set_sample_point(elements);
-
-  isl_int v;
-  isl_int_init(v);
-  isl_point_get_coordinate(p, isl_dim_set, isl_set_n_dim(loopDomain) - 1, &v);
-  int numberIterations = isl_int_get_si(v);
-  isl_int_clear(v);
-  isl_point_free(p);
-
-  return (numberIterations) / isl_int_get_si(f->stride) + 1;
+int ClastStmtCodeGen::getNumberOfIterations(const clast_for *For) {
+  isl_set *LoopDomain = isl_set_copy(isl_set_from_cloog_domain(For->domain));
+  return polly::getNumberOfIterations(LoopDomain) / isl_int_get_si(For->stride) + 1;
 }
 
 void ClastStmtCodeGen::codegenForVector(const clast_for *F) {