From e8df94274de35a40b8da10206222fd72f658d106 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Sun, 19 Aug 2012 19:29:48 +0200 Subject: [PATCH] generalize isl_multi_aff_drop_dims Signed-off-by: Sven Verdoolaege --- isl_aff.c | 31 ------------------------------- isl_multi_templ.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/isl_aff.c b/isl_aff.c index 0b9bf883..209a32fc 100644 --- a/isl_aff.c +++ b/isl_aff.c @@ -2687,37 +2687,6 @@ int isl_multi_aff_plain_is_equal(__isl_keep isl_multi_aff *maff1, return 1; } -__isl_give isl_multi_aff *isl_multi_aff_drop_dims(__isl_take isl_multi_aff *maff, - enum isl_dim_type type, unsigned first, unsigned n) -{ - int i; - - maff = isl_multi_aff_cow(maff); - if (!maff) - return NULL; - - maff->space = isl_space_drop_dims(maff->space, type, first, n); - if (!maff->space) - return isl_multi_aff_free(maff); - - if (type == isl_dim_out) { - for (i = 0; i < n; ++i) - isl_aff_free(maff->p[first + i]); - for (i = first; i + n < maff->n; ++i) - maff->p[i] = maff->p[i + n]; - maff->n -= n; - return maff; - } - - for (i = 0; i < maff->n; ++i) { - maff->p[i] = isl_aff_drop_dims(maff->p[i], type, first, n); - if (!maff->p[i]) - return isl_multi_aff_free(maff); - } - - return maff; -} - /* Return the set of domain elements where "ma1" is lexicographically * smaller than or equal to "ma2". */ diff --git a/isl_multi_templ.c b/isl_multi_templ.c index 6bf940c7..8638aab7 100644 --- a/isl_multi_templ.c +++ b/isl_multi_templ.c @@ -516,3 +516,43 @@ __isl_give MULTI(BASE) *FN(MULTI(BASE),zero)(__isl_take isl_space *space) return multi; } + +__isl_give MULTI(BASE) *FN(MULTI(BASE),drop_dims)( + __isl_take MULTI(BASE) *multi, + enum isl_dim_type type, unsigned first, unsigned n) +{ + int i; + unsigned dim; + + multi = FN(MULTI(BASE),cow)(multi); + if (!multi) + return NULL; + + dim = FN(MULTI(BASE),dim)(multi, type); + if (first + n > dim || first + n < first) + isl_die(FN(MULTI(BASE),get_ctx)(multi), isl_error_invalid, + "index out of bounds", + return FN(MULTI(BASE),cow)(multi)); + + multi->space = isl_space_drop_dims(multi->space, type, first, n); + if (!multi->space) + return FN(MULTI(BASE),cow)(multi); + + if (type == isl_dim_out) { + for (i = 0; i < n; ++i) + FN(EL,free)(multi->p[first + i]); + for (i = first; i + n < multi->n; ++i) + multi->p[i] = multi->p[i + n]; + multi->n -= n; + + return multi; + } + + for (i = 0; i < multi->n; ++i) { + multi->p[i] = FN(EL,drop_dims)(multi->p[i], type, first, n); + if (!multi->p[i]) + return FN(MULTI(BASE),cow)(multi); + } + + return multi; +} -- 2.11.4.GIT