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