/* * Copyright 2012 Ecole Normale Superieure * Copyright 2017 Sven Verdoolaege * * Use of this software is governed by the MIT license * * Written by Sven Verdoolaege, * Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France */ #define xFN(TYPE,NAME) TYPE ## _ ## NAME #define FN(TYPE,NAME) xFN(TYPE,NAME) /* Drop the "n" domain dimensions starting at "first" from "obj", * after checking that they do not appear in the affine expression. */ static __isl_give TYPE *FN(TYPE,drop_domain)(__isl_take TYPE *obj, unsigned first, unsigned n) { isl_bool involves; involves = FN(TYPE,involves_dims)(obj, isl_dim_in, first, n); if (involves < 0) return FN(TYPE,free)(obj); if (involves) isl_die(FN(TYPE,get_ctx)(obj), isl_error_invalid, "affine expression involves some of the domain dimensions", return FN(TYPE,free)(obj)); return FN(TYPE,drop_dims)(obj, isl_dim_in, first, n); } /* Check that the domain of "obj" is a product. */ static isl_stat FN(TYPE,check_domain_product)(__isl_keep TYPE *obj) { isl_bool is_product; is_product = FN(TYPE,domain_is_product)(obj); if (is_product < 0) return isl_stat_error; if (!is_product) isl_die(FN(TYPE,get_ctx)(obj), isl_error_invalid, "domain is not a product", return isl_stat_error); return isl_stat_ok; } /* Given an affine function with a domain of the form [A -> B] that * does not depend on B, return the same function on domain A. */ __isl_give TYPE *FN(TYPE,domain_factor_domain)(__isl_take TYPE *obj) { isl_space *space; isl_size n, n_in; if (FN(TYPE,check_domain_product)(obj) < 0) return FN(TYPE,free)(obj); space = FN(TYPE,get_domain_space)(obj); n = isl_space_dim(space, isl_dim_set); space = isl_space_factor_domain(space); n_in = isl_space_dim(space, isl_dim_set); if (n < 0 || n_in < 0) obj = FN(TYPE,free)(obj); else obj = FN(TYPE,drop_domain)(obj, n_in, n - n_in); obj = FN(TYPE,reset_domain_space)(obj, space); return obj; }