+static int tab_add_divs(struct isl_tab *tab, __isl_keep isl_basic_map *bmap,
+ int **div_map)
+{
+ int i, j;
+ struct isl_vec *vec;
+ unsigned total;
+ unsigned dim;
+
+ if (!bmap)
+ return -1;
+ if (!bmap->n_div)
+ return 0;
+
+ if (!*div_map)
+ *div_map = isl_alloc_array(bmap->ctx, int, bmap->n_div);
+ if (!*div_map)
+ return -1;
+
+ total = isl_basic_map_total_dim(tab->bmap);
+ dim = total - tab->bmap->n_div;
+ vec = isl_vec_alloc(bmap->ctx, 2 + total + bmap->n_div);
+ if (!vec)
+ return -1;
+
+ for (i = 0; i < bmap->n_div; ++i) {
+ isl_seq_cpy(vec->el, bmap->div[i], 2 + dim);
+ isl_seq_clr(vec->el + 2 + dim, tab->bmap->n_div);
+ for (j = 0; j < i; ++j)
+ isl_int_set(vec->el[2 + dim + (*div_map)[j]],
+ bmap->div[i][2 + dim + j]);
+ for (j = 0; j < tab->bmap->n_div; ++j)
+ if (isl_seq_eq(tab->bmap->div[j],
+ vec->el, 2 + dim + tab->bmap->n_div))
+ break;
+ (*div_map)[i] = j;
+ if (j == tab->bmap->n_div) {
+ vec->size = 2 + dim + tab->bmap->n_div;
+ if (isl_tab_add_div(tab, vec, NULL, NULL) < 0)
+ goto error;
+ }
+ }
+
+ isl_vec_free(vec);
+
+ return 0;
+error:
+ isl_vec_free(vec);
+
+ return -1;
+}
+