| 1 | /* |
| 2 | * Copyright 2018 Cerebras Systems |
| 3 | * |
| 4 | * Use of this software is governed by the MIT license |
| 5 | * |
| 6 | * Written by Sven Verdoolaege, |
| 7 | * Cerebras Systems, 175 S San Antonio Rd, Los Altos, CA, USA |
| 8 | */ |
| 9 | |
| 10 | #undef TYPE |
| 11 | #define TYPE CAT(isl_,BASE) |
| 12 | #define xFN(TYPE,NAME) TYPE ## _ ## NAME |
| 13 | #define FN(TYPE,NAME) xFN(TYPE,NAME) |
| 14 | |
| 15 | /* Compute the optima of the set or output dimensions as a function of the |
| 16 | * parameters (and input dimensions), but independently of |
| 17 | * the other set or output dimensions, |
| 18 | * given a function "opt" that computes this optimum |
| 19 | * for a single dimension. |
| 20 | * |
| 21 | * If the resulting multi piecewise affine expression has |
| 22 | * an explicit domain, then assign it the (parameter) domain of the input. |
| 23 | * In other cases, the (parameter) domain is stored in the individual elements. |
| 24 | */ |
| 25 | static __isl_give isl_multi_pw_aff *FN(BASE,opt_mpa)(__isl_take TYPE *obj, |
| 26 | __isl_give isl_pw_aff *(*opt)(__isl_take TYPE *obj, int pos)) |
| 27 | { |
| 28 | int i; |
| 29 | isl_size n; |
| 30 | isl_multi_pw_aff *mpa; |
| 31 | |
| 32 | mpa = isl_multi_pw_aff_alloc(FN(TYPE,get_space)(map: obj)); |
| 33 | n = isl_multi_pw_aff_size(multi: mpa); |
| 34 | if (n < 0) |
| 35 | mpa = isl_multi_pw_aff_free(multi: mpa); |
| 36 | for (i = 0; i < n; ++i) { |
| 37 | isl_pw_aff *pa; |
| 38 | |
| 39 | pa = opt(FN(TYPE,copy)(map: obj), i); |
| 40 | mpa = isl_multi_pw_aff_set_pw_aff(multi: mpa, pos: i, el: pa); |
| 41 | } |
| 42 | if (isl_multi_pw_aff_has_explicit_domain(multi: mpa)) { |
| 43 | isl_set *dom; |
| 44 | |
| 45 | dom = FN(TYPE,domain)(FN(TYPE,copy)(map: obj)); |
| 46 | mpa = isl_multi_pw_aff_intersect_domain(multi: mpa, domain: dom); |
| 47 | } |
| 48 | FN(TYPE,free)(map: obj); |
| 49 | |
| 50 | return mpa; |
| 51 | } |
| 52 | |