isl_map_subtract: handle duplicate divs in subtrahend
authorSven Verdoolaege <skimo@kotnet.org>
Mon, 13 Aug 2012 16:42:04 +0000 (18:42 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Mon, 13 Aug 2012 16:42:04 +0000 (18:42 +0200)
A simplified basic map is not expected to have duplicate divs,
but it may still happen if a div is discovered by isl_basic_map_gauss
without subsequently being compared to other divs.

Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
isl_map_subtract.c

index d43cf3d..f5ed8d6 100644 (file)
 #include "isl_tab.h"
 #include <isl_point_private.h>
 
+/* Expand the constraint "c" into "v".  The initial "dim" dimensions
+ * are the same, but "v" may have more divs than "c" and the divs of "c"
+ * may appear in different positions in "v".
+ * The number of divs in "c" is given by "n_div" and the mapping
+ * of divs in "c" to divs in "v" is given by "div_map".
+ *
+ * Although it shouldn't happen in practice, it is theoretically
+ * possible that two or more divs in "c" are mapped to the same div in "v".
+ * These divs are then necessarily the same, so we simply add their
+ * coefficients.
+ */
 static void expand_constraint(isl_vec *v, unsigned dim,
        isl_int *c, int *div_map, unsigned n_div)
 {
@@ -22,8 +33,10 @@ static void expand_constraint(isl_vec *v, unsigned dim,
        isl_seq_cpy(v->el, c, 1 + dim);
        isl_seq_clr(v->el + 1 + dim, v->size - (1 + dim));
 
-       for (i = 0; i < n_div; ++i)
-               isl_int_set(v->el[1 + dim + div_map[i]], c[1 + dim + i]);
+       for (i = 0; i < n_div; ++i) {
+               int pos = 1 + dim + div_map[i];
+               isl_int_add(v->el[pos], v->el[pos], c[1 + dim + i]);
+       }
 }
 
 /* Add all constraints of bmap to tab.  The equalities of bmap