X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=isl_map_simplify.c;h=984d6efc6e27154b22ac2e5c4d8f6962b8112ba4;hb=06bfff1a3e464c6d9035b43b0eece85e1f3ea06d;hp=302c12343ba1ebf5f11757c60c265b2342e8b80d;hpb=3a37260f65351a47d453f33e057c8f1e9ff0fba8;p=platform%2Fupstream%2Fisl.git diff --git a/isl_map_simplify.c b/isl_map_simplify.c index 302c123..984d6ef 100644 --- a/isl_map_simplify.c +++ b/isl_map_simplify.c @@ -7,6 +7,7 @@ * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium */ +#include #include #include "isl_equalities.h" #include @@ -31,11 +32,6 @@ static void swap_inequality(struct isl_basic_map *bmap, int a, int b) } } -static void set_swap_inequality(struct isl_basic_set *bset, int a, int b) -{ - swap_inequality((struct isl_basic_map *)bset, a, b); -} - static void constraint_drop_vars(isl_int *c, unsigned n, unsigned rem) { isl_seq_cpy(c, c + n, rem); @@ -812,7 +808,7 @@ static struct isl_basic_map *normalize_divs( return bmap; if (div_eq < bmap->n_eq) { - B = isl_mat_sub_alloc(bmap->ctx, bmap->eq, div_eq, + B = isl_mat_sub_alloc6(bmap->ctx, bmap->eq, div_eq, bmap->n_eq - div_eq, 0, 1 + total); C = isl_mat_variable_compression(B, &C2); if (!C || !C2) @@ -833,7 +829,7 @@ static struct isl_basic_map *normalize_divs( --j; isl_int_set(d->block.data[i], bmap->eq[i][1 + total + j]); } - B = isl_mat_sub_alloc(bmap->ctx, bmap->eq, 0, div_eq, 0, 1 + total); + B = isl_mat_sub_alloc6(bmap->ctx, bmap->eq, 0, div_eq, 0, 1 + total); if (C) { B = isl_mat_product(B, C); @@ -1558,7 +1554,7 @@ static struct isl_basic_set *normalize_constraints_in_compressed_space( return NULL; total = isl_basic_set_total_dim(bset); - B = isl_mat_sub_alloc(bset->ctx, bset->eq, 0, bset->n_eq, 0, 1 + total); + B = isl_mat_sub_alloc6(bset->ctx, bset->eq, 0, bset->n_eq, 0, 1 + total); C = isl_mat_variable_compression(B, NULL); if (!C) return bset; @@ -1566,7 +1562,7 @@ static struct isl_basic_set *normalize_constraints_in_compressed_space( isl_mat_free(C); return isl_basic_set_set_to_empty(bset); } - B = isl_mat_sub_alloc(bset->ctx, bset->ineq, + B = isl_mat_sub_alloc6(bset->ctx, bset->ineq, 0, bset->n_ineq, 0, 1 + total); C = isl_mat_product(B, C); if (!C) @@ -1702,6 +1698,13 @@ error: * We first compute the integer affine hull of the intersection, * compute the gist inside this affine hull and then add back * those equalities that are not implied by the context. + * + * If two constraints are mutually redundant, then uset_gist_full + * will remove the second of those constraints. We therefore first + * sort the constraints so that constraints not involving existentially + * quantified variables are given precedence over those that do. + * We have to perform this sorting before the variable compression, + * because that may effect the order of the variables. */ static __isl_give isl_basic_set *uset_gist(__isl_take isl_basic_set *bset, __isl_take isl_basic_set *context) @@ -1716,14 +1719,15 @@ static __isl_give isl_basic_set *uset_gist(__isl_take isl_basic_set *bset, goto error; bset = isl_basic_set_intersect(bset, isl_basic_set_copy(context)); - if (isl_basic_set_fast_is_empty(bset)) { + if (isl_basic_set_plain_is_empty(bset)) { isl_basic_set_free(context); return bset; } + bset = isl_basic_set_sort_constraints(bset); aff = isl_basic_set_affine_hull(isl_basic_set_copy(bset)); if (!aff) goto error; - if (isl_basic_set_fast_is_empty(aff)) { + if (isl_basic_set_plain_is_empty(aff)) { isl_basic_set_free(aff); isl_basic_set_free(context); return bset; @@ -1733,7 +1737,7 @@ static __isl_give isl_basic_set *uset_gist(__isl_take isl_basic_set *bset, return uset_gist_full(bset, context); } total = isl_basic_set_total_dim(bset); - eq = isl_mat_sub_alloc(bset->ctx, aff->eq, 0, aff->n_eq, 0, 1 + total); + eq = isl_mat_sub_alloc6(bset->ctx, aff->eq, 0, aff->n_eq, 0, 1 + total); eq = isl_mat_cow(eq); T = isl_mat_variable_compression(eq, &T2); if (T && T->n_col == 0) { @@ -1815,13 +1819,13 @@ struct isl_basic_map *isl_basic_map_gist(struct isl_basic_map *bmap, isl_basic_map_free(context); return bmap; } - if (isl_basic_map_fast_is_empty(context)) { + if (isl_basic_map_plain_is_empty(context)) { struct isl_dim *dim = isl_dim_copy(bmap->dim); isl_basic_map_free(context); isl_basic_map_free(bmap); return isl_basic_map_universe(dim); } - if (isl_basic_map_fast_is_empty(bmap)) { + if (isl_basic_map_plain_is_empty(bmap)) { isl_basic_map_free(context); return bmap; } @@ -1856,7 +1860,7 @@ __isl_give isl_map *isl_map_gist_basic_map(__isl_take isl_map *map, if (!map || !context) goto error;; - if (isl_basic_map_fast_is_empty(context)) { + if (isl_basic_map_plain_is_empty(context)) { struct isl_dim *dim = isl_dim_copy(map->dim); isl_basic_map_free(context); isl_map_free(map); @@ -1876,7 +1880,7 @@ __isl_give isl_map *isl_map_gist_basic_map(__isl_take isl_map *map, isl_basic_map_copy(context)); if (!map->p[i]) goto error; - if (isl_basic_map_fast_is_empty(map->p[i])) { + if (isl_basic_map_plain_is_empty(map->p[i])) { isl_basic_map_free(map->p[i]); if (i != map->n - 1) map->p[i] = map->p[map->n - 1]; @@ -1925,8 +1929,8 @@ __isl_give isl_set *isl_set_gist(__isl_take isl_set *set, * one basic map in the context of the equalities of the other * basic map and check if we get a contradiction. */ -int isl_basic_map_fast_is_disjoint(struct isl_basic_map *bmap1, - struct isl_basic_map *bmap2) +int isl_basic_map_plain_is_disjoint(__isl_keep isl_basic_map *bmap1, + __isl_keep isl_basic_map *bmap2) { struct isl_vec *v = NULL; int *elim = NULL; @@ -1990,26 +1994,27 @@ error: return -1; } -int isl_basic_set_fast_is_disjoint(struct isl_basic_set *bset1, - struct isl_basic_set *bset2) +int isl_basic_set_plain_is_disjoint(__isl_keep isl_basic_set *bset1, + __isl_keep isl_basic_set *bset2) { - return isl_basic_map_fast_is_disjoint((struct isl_basic_map *)bset1, + return isl_basic_map_plain_is_disjoint((struct isl_basic_map *)bset1, (struct isl_basic_map *)bset2); } -int isl_map_fast_is_disjoint(struct isl_map *map1, struct isl_map *map2) +int isl_map_plain_is_disjoint(__isl_keep isl_map *map1, + __isl_keep isl_map *map2) { int i, j; if (!map1 || !map2) return -1; - if (isl_map_fast_is_equal(map1, map2)) + if (isl_map_plain_is_equal(map1, map2)) return 0; for (i = 0; i < map1->n; ++i) { for (j = 0; j < map2->n; ++j) { - int d = isl_basic_map_fast_is_disjoint(map1->p[i], + int d = isl_basic_map_plain_is_disjoint(map1->p[i], map2->p[j]); if (d != 1) return d; @@ -2018,12 +2023,18 @@ int isl_map_fast_is_disjoint(struct isl_map *map1, struct isl_map *map2) return 1; } -int isl_set_fast_is_disjoint(struct isl_set *set1, struct isl_set *set2) +int isl_set_plain_is_disjoint(__isl_keep isl_set *set1, + __isl_keep isl_set *set2) { - return isl_map_fast_is_disjoint((struct isl_map *)set1, + return isl_map_plain_is_disjoint((struct isl_map *)set1, (struct isl_map *)set2); } +int isl_set_fast_is_disjoint(__isl_keep isl_set *set1, __isl_keep isl_set *set2) +{ + return isl_set_plain_is_disjoint(set1, set2); +} + /* Check if we can combine a given div with lower bound l and upper * bound u with some other div and if so return that other div. * Otherwise return -1.