X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=isl_map_simplify.c;h=984eb58798ed4cfe9d484bc7a1201835633c8c54;hb=fe8f991cf09ecb1aed45cd2599f23a490ac46501;hp=036b36f91b1cd8dfbd18d2232b073e5419d11d03;hpb=c907963310bfbda458204cc933f2b8a339bd7f5a;p=platform%2Fupstream%2Fisl.git diff --git a/isl_map_simplify.c b/isl_map_simplify.c index 036b36f..984eb58 100644 --- a/isl_map_simplify.c +++ b/isl_map_simplify.c @@ -7,10 +7,11 @@ * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium */ +#include +#include #include "isl_equalities.h" -#include "isl_map.h" -#include "isl_map_private.h" -#include "isl_seq.h" +#include +#include #include "isl_tab.h" #include #include @@ -812,7 +813,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 +834,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); @@ -1015,7 +1016,7 @@ static struct isl_basic_map *check_for_div_constraints( } static struct isl_basic_map *remove_duplicate_constraints( - struct isl_basic_map *bmap, int *progress) + struct isl_basic_map *bmap, int *progress, int detect_divs) { unsigned int size; isl_int ***index; @@ -1058,8 +1059,9 @@ static struct isl_basic_map *remove_duplicate_constraints( l = index[h] - &bmap->ineq[0]; isl_int_add(sum, bmap->ineq[k][0], bmap->ineq[l][0]); if (isl_int_is_pos(sum)) { - bmap = check_for_div_constraints(bmap, k, l, sum, - progress); + if (detect_divs) + bmap = check_for_div_constraints(bmap, k, l, + sum, progress); continue; } if (isl_int_is_zero(sum)) { @@ -1097,7 +1099,7 @@ struct isl_basic_map *isl_basic_map_simplify(struct isl_basic_map *bmap) bmap = isl_basic_map_gauss(bmap, &progress); /* requires equalities in normal form */ bmap = normalize_divs(bmap, &progress); - bmap = remove_duplicate_constraints(bmap, &progress); + bmap = remove_duplicate_constraints(bmap, &progress, 1); } return bmap; } @@ -1340,7 +1342,7 @@ struct isl_basic_map *isl_basic_map_eliminate_vars( } if (n_lower > 0 && n_upper > 0) { bmap = isl_basic_map_normalize_constraints(bmap); - bmap = remove_duplicate_constraints(bmap, NULL); + bmap = remove_duplicate_constraints(bmap, NULL, 0); bmap = isl_basic_map_gauss(bmap, NULL); bmap = isl_basic_map_remove_redundancies(bmap); if (!bmap) @@ -1557,7 +1559,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; @@ -1565,7 +1567,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) @@ -1701,6 +1703,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) @@ -1715,14 +1724,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; @@ -1732,7 +1742,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) { @@ -1814,13 +1824,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; } @@ -1855,7 +1865,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); @@ -1870,11 +1880,17 @@ __isl_give isl_map *isl_map_gist_basic_map(__isl_take isl_map *map, map = isl_map_compute_divs(map); for (i = 0; i < map->n; ++i) context = isl_basic_map_align_divs(context, map->p[i]); - for (i = 0; i < map->n; ++i) { + for (i = map->n - 1; i >= 0; --i) { map->p[i] = isl_basic_map_gist(map->p[i], isl_basic_map_copy(context)); if (!map->p[i]) goto error; + 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]; + map->n--; + } } isl_basic_map_free(context); ISL_F_CLR(map, ISL_MAP_NORMALIZED); @@ -1918,8 +1934,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; @@ -1983,26 +1999,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; @@ -2011,12 +2028,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. @@ -2258,7 +2281,7 @@ static struct isl_basic_map *drop_more_redundant_divs( if (remove < 0) return bmap; - bmap = isl_basic_map_remove(bmap, isl_dim_div, remove, 1); + bmap = isl_basic_map_remove_dims(bmap, isl_dim_div, remove, 1); return isl_basic_map_drop_redundant_divs(bmap); error: free(pairs);