blob: c64e9a262f0fbda1d692af0fedd8ff3014649e5a [file] [log] [blame]
/*
* 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;
}