brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 5486061 Raw
125 lines · c
1/*2 * Copyright 2012      Ecole Normale Superieure3 *4 * Use of this software is governed by the MIT license5 *6 * Written by Sven Verdoolaege,7 * Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France8 */9 10#include <isl_pw_macro.h>11 12#undef SUFFIX13#define SUFFIX	multi_aff14#undef ARG115#define ARG1	PW16#undef ARG217#define ARG2	isl_multi_aff18 19static20#include "isl_align_params_templ.c"21 22#undef SUFFIX23#define SUFFIX	pw_multi_aff24#undef ARG125#define ARG1	PW26#undef ARG227#define ARG2	isl_pw_multi_aff28 29static30#include "isl_align_params_templ.c"31 32/* Compute the pullback of "pw" by the function represented by "ma".33 * In other words, plug in "ma" in "pw".34 */35__isl_give PW *FN(PW,pullback_multi_aff)(__isl_take PW *pw,36	__isl_take isl_multi_aff *ma)37{38	int i;39	isl_size n;40	isl_space *space = NULL;41 42	FN(PW,align_params_multi_aff)(&pw, &ma);43	ma = isl_multi_aff_align_divs(ma);44	n = FN(PW,n_piece)(pw);45	if (n < 0 || !ma)46		goto error;47 48	space = isl_space_join(isl_multi_aff_get_space(ma),49				FN(PW,get_space)(pw));50 51	for (i = 0; i < n; ++i) {52		isl_set *domain;53		EL *el;54 55		domain = FN(PW,take_domain_at)(pw, i);56		domain = isl_set_preimage_multi_aff(domain,57						    isl_multi_aff_copy(ma));58		pw = FN(PW,restore_domain_at)(pw, i, domain);59		el = FN(PW,take_base_at)(pw, i);60		el = FN(EL,pullback_multi_aff)(el, isl_multi_aff_copy(ma));61		pw = FN(PW,restore_base_at)(pw, i, el);62	}63 64	pw = FN(PW,reset_space)(pw, space);65	isl_multi_aff_free(ma);66	return pw;67error:68	isl_space_free(space);69	isl_multi_aff_free(ma);70	FN(PW,free)(pw);71	return NULL;72}73 74/* Compute the pullback of "pw" by the function represented by "pma".75 * In other words, plug in "pma" in "pw".76 */77static __isl_give PW *FN(PW,pullback_pw_multi_aff_aligned)(__isl_take PW *pw,78	__isl_take isl_pw_multi_aff *pma)79{80	int i;81	PW *res;82 83	if (!pma)84		goto error;85 86	if (pma->n == 0) {87		isl_space *space;88		space = isl_space_join(isl_pw_multi_aff_get_space(pma),89					FN(PW,get_space)(pw));90		isl_pw_multi_aff_free(pma);91		res = FN(PW,empty)(space);92		FN(PW,free)(pw);93		return res;94	}95 96	res = FN(PW,pullback_multi_aff)(FN(PW,copy)(pw),97					isl_multi_aff_copy(pma->p[0].maff));98	res = FN(PW,intersect_domain)(res, isl_set_copy(pma->p[0].set));99 100	for (i = 1; i < pma->n; ++i) {101		PW *res_i;102 103		res_i = FN(PW,pullback_multi_aff)(FN(PW,copy)(pw),104					isl_multi_aff_copy(pma->p[i].maff));105		res_i = FN(PW,intersect_domain)(res_i,106					isl_set_copy(pma->p[i].set));107		res = FN(PW,add_disjoint)(res, res_i);108	}109 110	isl_pw_multi_aff_free(pma);111	FN(PW,free)(pw);112	return res;113error:114	isl_pw_multi_aff_free(pma);115	FN(PW,free)(pw);116	return NULL;117}118 119__isl_give PW *FN(PW,pullback_pw_multi_aff)(__isl_take PW *pw,120	__isl_take isl_pw_multi_aff *pma)121{122	FN(PW,align_params_pw_multi_aff)(&pw, &pma);123	return FN(PW,pullback_pw_multi_aff_aligned)(pw, pma);124}125