brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · 3178998 Raw
82 lines · c
1/*2 * Copyright 2017      Sven Verdoolaege3 *4 * Use of this software is governed by the MIT license5 *6 * Written by Sven Verdoolaege.7 */8 9#include <isl_multi_macro.h>10 11/* Compute the sum of "multi1" and "multi2" on the union of their domains,12 * with the actual sum on the shared domain and13 * the defined expression on the symmetric difference of the domains.14 *15 * We simply iterate over the elements in both arguments and16 * call isl_union_pw_aff_union_add on each of them, if there is17 * at least one element.18 *19 * Otherwise, the two expressions have an explicit domain and20 * the union of these explicit domains is computed.21 * This assumes that the explicit domains are either both in terms22 * of specific domains elements or both in terms of parameters.23 * However, if one of the expressions does not have any constraints24 * on its explicit domain, then this is allowed as well and the result25 * is the expression with no constraints on its explicit domain.26 */27__isl_give MULTI(BASE) *FN(MULTI(BASE),union_add)(28	__isl_take MULTI(BASE) *multi1, __isl_take MULTI(BASE) *multi2)29{30	isl_bool has_domain, is_params1, is_params2;31 32	if (!multi1)33		goto error;34	if (multi1->n > 0)35		return FN(MULTI(BASE),bin_op)(multi1, multi2,36					    &FN(EL,union_add));37	FN(MULTI(BASE),align_params_bin)(&multi1, &multi2);38	if (FN(MULTI(BASE),check_equal_space)(multi1, multi2) < 0)39		goto error;40	if (FN(MULTI(BASE),check_has_explicit_domain)(multi1) < 0 ||41	    FN(MULTI(BASE),check_has_explicit_domain)(multi2) < 0)42		goto error;43 44	has_domain = FN(MULTI(BASE),has_non_trivial_domain)(multi1);45	if (has_domain < 0)46		goto error;47	if (!has_domain) {48		FN(MULTI(BASE),free)(multi2);49		return multi1;50	}51	has_domain = FN(MULTI(BASE),has_non_trivial_domain)(multi2);52	if (has_domain < 0)53		goto error;54	if (!has_domain) {55		FN(MULTI(BASE),free)(multi1);56		return multi2;57	}58 59	is_params1 = FN(DOM,is_params)(multi1->u.dom);60	is_params2 = FN(DOM,is_params)(multi2->u.dom);61	if (is_params1 < 0 || is_params2 < 0)62		goto error;63	if (is_params1 != is_params2)64		isl_die(FN(MULTI(BASE),get_ctx)(multi1),65			isl_error_invalid,66			"cannot compute union of concrete domain and "67			"parameter constraints", goto error);68	multi1 = FN(MULTI(BASE),cow)(multi1);69	if (!multi1)70		goto error;71	multi1->u.dom = FN(DOM,union)(multi1->u.dom,72					FN(DOM,copy)(multi2->u.dom));73	if (!multi1->u.dom)74		goto error;75	FN(MULTI(BASE),free)(multi2);76	return multi1;77error:78	FN(MULTI(BASE),free)(multi1);79	FN(MULTI(BASE),free)(multi2);80	return NULL;81}82