Home | History | Annotate | Line # | Download | only in dist
      1 /*
      2  * Copyright 2017      Sven Verdoolaege
      3  *
      4  * Use of this software is governed by the MIT license
      5  *
      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 and
     13  * the defined expression on the symmetric difference of the domains.
     14  *
     15  * We simply iterate over the elements in both arguments and
     16  * call isl_union_pw_aff_union_add on each of them, if there is
     17  * at least one element.
     18  *
     19  * Otherwise, the two expressions have an explicit domain and
     20  * the union of these explicit domains is computed.
     21  * This assumes that the explicit domains are either both in terms
     22  * of specific domains elements or both in terms of parameters.
     23  * However, if one of the expressions does not have any constraints
     24  * on its explicit domain, then this is allowed as well and the result
     25  * 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;
     77 error:
     78 	FN(MULTI(BASE),free)(multi1);
     79 	FN(MULTI(BASE),free)(multi2);
     80 	return NULL;
     81 }
     82