brintos

brintos / llvm-project-archived public Read only

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