1 1.1 mrg /* 2 1.1 mrg * Copyright 2012 Ecole Normale Superieure 3 1.1 mrg * Copyright 2017 Sven Verdoolaege 4 1.1 mrg * 5 1.1 mrg * Use of this software is governed by the MIT license 6 1.1 mrg * 7 1.1 mrg * Written by Sven Verdoolaege, 8 1.1 mrg * Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France 9 1.1 mrg */ 10 1.1 mrg 11 1.1 mrg #define xFN(TYPE,NAME) TYPE ## _ ## NAME 12 1.1 mrg #define FN(TYPE,NAME) xFN(TYPE,NAME) 13 1.1 mrg 14 1.1 mrg /* Drop the "n" domain dimensions starting at "first" from "obj", 15 1.1 mrg * after checking that they do not appear in the affine expression. 16 1.1 mrg */ 17 1.1 mrg static __isl_give TYPE *FN(TYPE,drop_domain)(__isl_take TYPE *obj, 18 1.1 mrg unsigned first, unsigned n) 19 1.1 mrg { 20 1.1 mrg isl_bool involves; 21 1.1 mrg 22 1.1 mrg involves = FN(TYPE,involves_dims)(obj, isl_dim_in, first, n); 23 1.1 mrg if (involves < 0) 24 1.1 mrg return FN(TYPE,free)(obj); 25 1.1 mrg if (involves) 26 1.1 mrg isl_die(FN(TYPE,get_ctx)(obj), isl_error_invalid, 27 1.1 mrg "affine expression involves some of the domain dimensions", 28 1.1 mrg return FN(TYPE,free)(obj)); 29 1.1 mrg return FN(TYPE,drop_dims)(obj, isl_dim_in, first, n); 30 1.1 mrg } 31 1.1 mrg 32 1.1 mrg /* Check that the domain of "obj" is a product. 33 1.1 mrg */ 34 1.1 mrg static isl_stat FN(TYPE,check_domain_product)(__isl_keep TYPE *obj) 35 1.1 mrg { 36 1.1 mrg isl_bool is_product; 37 1.1 mrg 38 1.1 mrg is_product = FN(TYPE,domain_is_product)(obj); 39 1.1 mrg if (is_product < 0) 40 1.1 mrg return isl_stat_error; 41 1.1 mrg if (!is_product) 42 1.1 mrg isl_die(FN(TYPE,get_ctx)(obj), isl_error_invalid, 43 1.1 mrg "domain is not a product", return isl_stat_error); 44 1.1 mrg return isl_stat_ok; 45 1.1 mrg } 46 1.1 mrg 47 1.1 mrg /* Given an affine function with a domain of the form [A -> B] that 48 1.1 mrg * does not depend on B, return the same function on domain A. 49 1.1 mrg */ 50 1.1 mrg __isl_give TYPE *FN(TYPE,domain_factor_domain)(__isl_take TYPE *obj) 51 1.1 mrg { 52 1.1 mrg isl_space *space; 53 1.1 mrg isl_size n, n_in; 54 1.1 mrg 55 1.1 mrg if (FN(TYPE,check_domain_product)(obj) < 0) 56 1.1 mrg return FN(TYPE,free)(obj); 57 1.1 mrg space = FN(TYPE,get_domain_space)(obj); 58 1.1 mrg n = isl_space_dim(space, isl_dim_set); 59 1.1 mrg space = isl_space_factor_domain(space); 60 1.1 mrg n_in = isl_space_dim(space, isl_dim_set); 61 1.1 mrg if (n < 0 || n_in < 0) 62 1.1 mrg obj = FN(TYPE,free)(obj); 63 1.1 mrg else 64 1.1 mrg obj = FN(TYPE,drop_domain)(obj, n_in, n - n_in); 65 1.1 mrg obj = FN(TYPE,reset_domain_space)(obj, space); 66 1.1 mrg return obj; 67 1.1 mrg } 68