From 6eb5b11ffcddcbbe1d7e4820f9bb87b0be02e607 Mon Sep 17 00:00:00 2001 From: Tobias Grosser Date: Fri, 20 Apr 2018 09:03:38 +0200 Subject: [PATCH] Add isl_*_drop_unused_params Add functions to drop parameters that are not referenced by the isl object. When using named parameters and (align_params), isl objects tend to accumulate many parameter dimensions over time. To improve the performance on later operations (due to working on lower dimensional objects) and because the printed sets are more readable, it is useful to be able to drop unused parameter dimensions. These functions require all parameters to be named as otherwise it would be difficult to tell what the meaning is of the remaining parameters. Signed-off-by: Tobias Grosser Signed-off-by: Sven Verdoolaege --- doc/user.pod | 34 ++++++++++++++++++++++++++ include/isl/aff.h | 4 +++ include/isl/map.h | 3 +++ include/isl/polynomial.h | 6 +++++ include/isl/set.h | 3 +++ isl_map.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++ isl_pw_templ.c | 22 +++++++++++++++++ isl_test.c | 59 +++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 194 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index 5e7b8d0c..8498e02b 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -5683,6 +5683,40 @@ All parameters need to be named. __isl_take isl_qpolynomial *qp, __isl_take isl_space *model); +=item * Drop unused parameters + +Drop parameters that are not referenced by the isl object. +All parameters need to be named. + + #include + __isl_give isl_basic_set * + isl_basic_set_drop_unused_params( + __isl_take isl_basic_set *bset); + __isl_give isl_set *isl_set_drop_unused_params( + __isl_take isl_set *set); + + #include + __isl_give isl_basic_map * + isl_basic_map_drop_unused_params( + __isl_take isl_basic_map *bmap); + __isl_give isl_map *isl_map_drop_unused_params( + __isl_take isl_map *map); + + #include + __isl_give isl_pw_aff *isl_pw_aff_drop_unused_params( + __isl_take isl_pw_aff *pa); + __isl_give isl_pw_multi_aff * + isl_pw_multi_aff_drop_unused_params( + __isl_take isl_pw_multi_aff *pma); + + #include + __isl_give isl_pw_qpolynomial * + isl_pw_qpolynomial_drop_unused_params( + __isl_take isl_pw_qpolynomial *pwqp); + __isl_give isl_pw_qpolynomial_fold * + isl_pw_qpolynomial_fold_drop_unused_params( + __isl_take isl_pw_qpolynomial_fold *pwf); + =item * Unary Arithmetic Operations #include diff --git a/include/isl/aff.h b/include/isl/aff.h index c56b347d..91a143d7 100644 --- a/include/isl/aff.h +++ b/include/isl/aff.h @@ -246,6 +246,8 @@ __isl_give isl_pw_aff *isl_pw_aff_project_domain_on_params( __isl_give isl_pw_aff *isl_pw_aff_align_params(__isl_take isl_pw_aff *pwaff, __isl_take isl_space *model); +__isl_give isl_pw_aff *isl_pw_aff_drop_unused_params( + __isl_take isl_pw_aff *pa); isl_bool isl_pw_aff_has_tuple_id(__isl_keep isl_pw_aff *pa, enum isl_dim_type type); @@ -602,6 +604,8 @@ __isl_give isl_pw_multi_aff *isl_pw_multi_aff_project_domain_on_params( __isl_give isl_pw_multi_aff *isl_pw_multi_aff_align_params( __isl_take isl_pw_multi_aff *pma, __isl_take isl_space *model); +__isl_give isl_pw_multi_aff *isl_pw_multi_aff_drop_unused_params( + __isl_take isl_pw_multi_aff *pma); __isl_give isl_pw_multi_aff *isl_pw_multi_aff_coalesce( __isl_take isl_pw_multi_aff *pma); diff --git a/include/isl/map.h b/include/isl/map.h index e89b72b6..cbfa8d67 100644 --- a/include/isl/map.h +++ b/include/isl/map.h @@ -642,6 +642,9 @@ __isl_give isl_basic_map *isl_basic_map_align_params( __isl_take isl_basic_map *bmap, __isl_take isl_space *model); __isl_give isl_map *isl_map_align_params(__isl_take isl_map *map, __isl_take isl_space *model); +__isl_give isl_basic_map *isl_basic_map_drop_unused_params( + __isl_take isl_basic_map *bmap); +__isl_give isl_map *isl_map_drop_unused_params(__isl_take isl_map *map); __isl_give isl_mat *isl_basic_map_equalities_matrix( __isl_keep isl_basic_map *bmap, enum isl_dim_type c1, diff --git a/include/isl/polynomial.h b/include/isl/polynomial.h index 72b015d2..80babc5e 100644 --- a/include/isl/polynomial.h +++ b/include/isl/polynomial.h @@ -195,6 +195,9 @@ __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_split_dims( __isl_take isl_pw_qpolynomial *pwqp, enum isl_dim_type type, unsigned first, unsigned n); +__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_drop_unused_params( + __isl_take isl_pw_qpolynomial *pwqp); + __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add( __isl_take isl_pw_qpolynomial *pwqp1, __isl_take isl_pw_qpolynomial *pwqp2); @@ -423,6 +426,9 @@ __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_move_dims( enum isl_dim_type dst_type, unsigned dst_pos, enum isl_dim_type src_type, unsigned src_pos, unsigned n); +__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_drop_unused_params( + __isl_take isl_pw_qpolynomial_fold *pwf); + __isl_give isl_val *isl_pw_qpolynomial_fold_eval( __isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_point *pnt); diff --git a/include/isl/set.h b/include/isl/set.h index 02db2c92..407914ac 100644 --- a/include/isl/set.h +++ b/include/isl/set.h @@ -482,6 +482,9 @@ __isl_give isl_basic_set *isl_basic_set_align_params( __isl_take isl_basic_set *bset, __isl_take isl_space *model); __isl_give isl_set *isl_set_align_params(__isl_take isl_set *set, __isl_take isl_space *model); +__isl_give isl_basic_set *isl_basic_set_drop_unused_params( + __isl_take isl_basic_set *bset); +__isl_give isl_set *isl_set_drop_unused_params(__isl_take isl_set *set); __isl_give isl_mat *isl_basic_set_equalities_matrix( __isl_keep isl_basic_set *bset, enum isl_dim_type c1, diff --git a/isl_map.c b/isl_map.c index 912a246f..31945f5b 100644 --- a/isl_map.c +++ b/isl_map.c @@ -11839,6 +11839,69 @@ __isl_give isl_basic_set *isl_basic_set_align_params( return isl_basic_map_align_params(bset, model); } +/* Drop all parameters not referenced by "map". + */ +__isl_give isl_map *isl_map_drop_unused_params(__isl_take isl_map *map) +{ + int i; + + if (isl_map_check_named_params(map) < 0) + return isl_map_free(map); + + for (i = isl_map_dim(map, isl_dim_param) - 1; i >= 0; i--) { + isl_bool involves; + + involves = isl_map_involves_dims(map, isl_dim_param, i, 1); + if (involves < 0) + return isl_map_free(map); + if (!involves) + map = isl_map_project_out(map, isl_dim_param, i, 1); + } + + return map; +} + +/* Drop all parameters not referenced by "set". + */ +__isl_give isl_set *isl_set_drop_unused_params( + __isl_take isl_set *set) +{ + return set_from_map(isl_map_drop_unused_params(set_to_map(set))); +} + +/* Drop all parameters not referenced by "bmap". + */ +__isl_give isl_basic_map *isl_basic_map_drop_unused_params( + __isl_take isl_basic_map *bmap) +{ + int i; + + if (isl_basic_map_check_named_params(bmap) < 0) + return isl_basic_map_free(bmap); + + for (i = isl_basic_map_dim(bmap, isl_dim_param) - 1; i >= 0; i--) { + isl_bool involves; + + involves = isl_basic_map_involves_dims(bmap, + isl_dim_param, i, 1); + if (involves < 0) + return isl_basic_map_free(bmap); + if (!involves) + bmap = isl_basic_map_drop(bmap, isl_dim_param, i, 1); + } + + return bmap; +} + +/* Drop all parameters not referenced by "bset". + */ +__isl_give isl_basic_set *isl_basic_set_drop_unused_params( + __isl_take isl_basic_set *bset) +{ + return bset_from_bmap(isl_basic_map_drop_unused_params( + bset_to_bmap(bset))); +} + __isl_give isl_mat *isl_basic_map_equalities_matrix( __isl_keep isl_basic_map *bmap, enum isl_dim_type c1, enum isl_dim_type c2, enum isl_dim_type c3, diff --git a/isl_pw_templ.c b/isl_pw_templ.c index cce47025..6d09682a 100644 --- a/isl_pw_templ.c +++ b/isl_pw_templ.c @@ -1297,6 +1297,28 @@ __isl_give PW *FN(PW,project_domain_on_params)(__isl_take PW *pw) return pw; } +/* Drop all parameters not referenced by "pw". + */ +__isl_give PW *FN(PW,drop_unused_params)(__isl_take PW *pw) +{ + int i; + + if (FN(PW,check_named_params)(pw) < 0) + return FN(PW,free)(pw); + + for (i = FN(PW,dim)(pw, isl_dim_param) - 1; i >= 0; i--) { + isl_bool involves; + + involves = FN(PW,involves_dims)(pw, isl_dim_param, i, 1); + if (involves < 0) + return FN(PW,free)(pw); + if (!involves) + pw = FN(PW,drop_dims)(pw, isl_dim_param, i, 1); + } + + return pw; +} + #ifndef NO_INSERT_DIMS __isl_give PW *FN(PW,insert_dims)(__isl_take PW *pw, enum isl_dim_type type, unsigned first, unsigned n) diff --git a/isl_test.c b/isl_test.c index 63e84a7c..b8976821 100644 --- a/isl_test.c +++ b/isl_test.c @@ -7168,6 +7168,64 @@ int test_align_parameters(isl_ctx *ctx) return 0; } +/* Check that isl_*_drop_unused_params actually drops the unused parameters + * by comparing the result using isl_*_plain_is_equal. + * Note that this assumes that isl_*_plain_is_equal does not consider + * objects that only differ by unused parameters to be equal. + */ +int test_drop_unused_parameters(isl_ctx *ctx) +{ + const char *str_with, *str_without; + isl_basic_set *bset1, *bset2; + isl_set *set1, *set2; + isl_pw_aff *pwa1, *pwa2; + int equal; + + str_with = "[n, m, o] -> { [m] }"; + str_without = "[m] -> { [m] }"; + + bset1 = isl_basic_set_read_from_str(ctx, str_with); + bset2 = isl_basic_set_read_from_str(ctx, str_without); + bset1 = isl_basic_set_drop_unused_params(bset1); + equal = isl_basic_set_plain_is_equal(bset1, bset2); + isl_basic_set_free(bset1); + isl_basic_set_free(bset2); + + if (equal < 0) + return -1; + if (!equal) + isl_die(ctx, isl_error_unknown, + "result not as expected", return -1); + + set1 = isl_set_read_from_str(ctx, str_with); + set2 = isl_set_read_from_str(ctx, str_without); + set1 = isl_set_drop_unused_params(set1); + equal = isl_set_plain_is_equal(set1, set2); + isl_set_free(set1); + isl_set_free(set2); + + if (equal < 0) + return -1; + if (!equal) + isl_die(ctx, isl_error_unknown, + "result not as expected", return -1); + + pwa1 = isl_pw_aff_read_from_str(ctx, str_with); + pwa2 = isl_pw_aff_read_from_str(ctx, str_without); + pwa1 = isl_pw_aff_drop_unused_params(pwa1); + equal = isl_pw_aff_plain_is_equal(pwa1, pwa2); + isl_pw_aff_free(pwa1); + isl_pw_aff_free(pwa2); + + if (equal < 0) + return -1; + if (!equal) + isl_die(ctx, isl_error_unknown, + "result not as expected", return -1); + + return 0; +} + static int test_list(isl_ctx *ctx) { isl_id *a, *b, *c, *d, *id; @@ -8908,6 +8966,7 @@ struct { { "conversion", &test_conversion }, { "list", &test_list }, { "align parameters", &test_align_parameters }, + { "drop unused parameters", &test_drop_unused_parameters }, { "preimage", &test_preimage }, { "pullback", &test_pullback }, { "AST", &test_ast }, -- 2.11.4.GIT