add isl_basic_set_expand_divs
authorSven Verdoolaege <skimo@kotnet.org>
Thu, 12 May 2011 11:03:10 +0000 (13:03 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Mon, 16 May 2011 16:01:22 +0000 (18:01 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
isl_map.c
isl_map_private.h

index d64f231..b648cec 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -6330,6 +6330,54 @@ error:
        return NULL;
 }
 
+/* Apply the expansion computed by isl_merge_divs.
+ * The expansion itself is given by "exp" while the resulting
+ * list of divs is given by "div".
+ */
+__isl_give isl_basic_set *isl_basic_set_expand_divs(
+       __isl_take isl_basic_set *bset, __isl_take isl_mat *div, int *exp)
+{
+       int i, j;
+       int n_div;
+
+       bset = isl_basic_set_cow(bset);
+       if (!bset || !div)
+               goto error;
+
+       if (div->n_row < bset->n_div)
+               isl_die(isl_mat_get_ctx(div), isl_error_invalid,
+                       "not an expansion", goto error);
+
+       bset = isl_basic_map_extend_dim(bset, isl_dim_copy(bset->dim),
+                                       div->n_row - bset->n_div, 0,
+                                       2 * (div->n_row - bset->n_div));
+
+       n_div = bset->n_div;
+       for (i = n_div; i < div->n_row; ++i)
+               if (isl_basic_set_alloc_div(bset) < 0)
+                       goto error;
+
+       j = n_div - 1;
+       for (i = div->n_row - 1; i >= 0; --i) {
+               if (j >= 0 && exp[j] == i) {
+                       if (i != j)
+                               isl_basic_map_swap_div(bset, i, j);
+                       j--;
+               } else {
+                       isl_seq_cpy(bset->div[i], div->row[i], div->n_col);
+                       if (isl_basic_map_add_div_constraints(bset, i) < 0)
+                               goto error;
+               }
+       }
+
+       isl_mat_free(div);
+       return bset;
+error:
+       isl_basic_set_free(bset);
+       isl_mat_free(div);
+       return NULL;
+}
+
 /* Look for a div in dst that corresponds to the div "div" in src.
  * The divs before "div" in src and dst are assumed to be the same.
  * 
index a2d9089..0ced8c6 100644 (file)
@@ -297,5 +297,7 @@ __isl_give isl_basic_set *isl_basic_set_from_local_space(
        __isl_take isl_local_space *ls);
 __isl_give isl_basic_map *isl_basic_map_from_local_space(
        __isl_take isl_local_space *ls);
+__isl_give isl_basic_set *isl_basic_set_expand_divs(
+       __isl_take isl_basic_set *bset, __isl_take isl_mat *div, int *exp);
 
 #endif