X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=doc%2Fuser.pod;h=83d0a4f731559df199a9a3cb164a0469db627846;hb=b0a600c3dbb267704fd3799ca50077d6471d2444;hp=8e1d66d410ae0d8954309dc6363a266fe81fa8db;hpb=1ccd34d8c81af5794ae2b73b79b331e24be17136;p=platform%2Fupstream%2Fisl.git diff --git a/doc/user.pod b/doc/user.pod index 8e1d66d..83d0a4f 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -153,6 +153,21 @@ dimension manipulation on the result. =back +=head3 Changes since isl-0.09 + +=over + +=item * The C option has been replaced +by the C option. + +=item * The first argument of C is now +an C instead of an C. +A call C can be replaced by + + isl_pw_aff_cond(isl_set_indicator_function(a), b, c) + +=back + =head1 Installation The source of C can be obtained either as a tarball @@ -649,6 +664,8 @@ of the original object. __isl_keep isl_pw_multi_aff *pma); __isl_give isl_space *isl_pw_multi_aff_get_space( __isl_keep isl_pw_multi_aff *pma); + __isl_give isl_space *isl_union_pw_multi_aff_get_space( + __isl_keep isl_union_pw_multi_aff *upma); #include __isl_give isl_space *isl_point_get_space( @@ -667,11 +684,15 @@ using the following functions. __isl_give isl_id *isl_space_get_dim_id( __isl_keep isl_space *space, enum isl_dim_type type, unsigned pos); - __isl_give isl_space *isl_space_set_dim_name(__isl_take isl_space *space, - enum isl_dim_type type, unsigned pos, - __isl_keep const char *name); - __isl_keep const char *isl_space_get_dim_name(__isl_keep isl_space *space, - enum isl_dim_type type, unsigned pos); + __isl_give isl_space *isl_space_set_dim_name( + __isl_take isl_space *space, + enum isl_dim_type type, unsigned pos, + __isl_keep const char *name); + int isl_space_has_dim_name(__isl_keep isl_space *space, + enum isl_dim_type type, unsigned pos); + __isl_keep const char *isl_space_get_dim_name( + __isl_keep isl_space *space, + enum isl_dim_type type, unsigned pos); Note that C returns a pointer to some internal data structure, so the result can only be used while the @@ -710,6 +731,8 @@ using the following functions. __isl_give isl_space *isl_space_set_tuple_name( __isl_take isl_space *space, enum isl_dim_type type, const char *s); + int isl_space_has_tuple_name(__isl_keep isl_space *space, + enum isl_dim_type type); const char *isl_space_get_tuple_name(__isl_keep isl_space *space, enum isl_dim_type type); @@ -768,6 +791,8 @@ using the following functions. __isl_take isl_space *domain, __isl_take isl_space *range); __isl_give isl_space *isl_space_zip(__isl_take isl_space *space); + __isl_give isl_space *isl_space_curry( + __isl_take isl_space *space); Note that if dimensions are added or removed from a space, then the name and the internal structure are lost. @@ -776,9 +801,13 @@ the name and the internal structure are lost. A local space is essentially a space with zero or more existentially quantified variables. -The local space of a basic set or relation can be obtained +The local space of a (constraint of a) basic set or relation can be obtained using the following functions. + #include + __isl_give isl_local_space *isl_constraint_get_local_space( + __isl_keep isl_constraint *constraint); + #include __isl_give isl_local_space *isl_basic_set_get_local_space( __isl_keep isl_basic_set *bset); @@ -801,6 +830,9 @@ They can be inspected, modified, copied and freed using the following functions. int isl_local_space_is_set(__isl_keep isl_local_space *ls); int isl_local_space_dim(__isl_keep isl_local_space *ls, enum isl_dim_type type); + int isl_local_space_has_dim_name( + __isl_keep isl_local_space *ls, + enum isl_dim_type type, unsigned pos) const char *isl_local_space_get_dim_name( __isl_keep isl_local_space *ls, enum isl_dim_type type, unsigned pos); @@ -953,6 +985,13 @@ be created. __isl_give char *isl_printer_get_str( __isl_keep isl_printer *printer); +The printer can be inspected using the following functions. + + FILE *isl_printer_get_file( + __isl_keep isl_printer *printer); + int isl_printer_get_output_format( + __isl_keep isl_printer *p); + The behavior of the printer can be modified in various ways __isl_give isl_printer *isl_printer_set_output_format( @@ -1257,14 +1296,16 @@ C and C for sets and of C, C, C, C and C for relations. -A (basic) set or relation can also be constructed from a (piecewise) -(multiple) affine expression +A (basic or union) set or relation can also be constructed from a +(union) (piecewise) (multiple) affine expression or a list of affine expressions (See L<"Piecewise Quasi Affine Expressions"> and L<"Piecewise Multiple Quasi Affine Expressions">). __isl_give isl_basic_map *isl_basic_map_from_aff( __isl_take isl_aff *aff); + __isl_give isl_map *isl_map_from_aff( + __isl_take isl_aff *aff); __isl_give isl_set *isl_set_from_pw_aff( __isl_take isl_pw_aff *pwaff); __isl_give isl_map *isl_map_from_pw_aff( @@ -1274,10 +1315,15 @@ L<"Piecewise Multiple Quasi Affine Expressions">). __isl_take isl_aff_list *list); __isl_give isl_basic_map *isl_basic_map_from_multi_aff( __isl_take isl_multi_aff *maff) + __isl_give isl_map *isl_map_from_multi_aff( + __isl_take isl_multi_aff *maff) __isl_give isl_set *isl_set_from_pw_multi_aff( __isl_take isl_pw_multi_aff *pma); __isl_give isl_map *isl_map_from_pw_multi_aff( __isl_take isl_pw_multi_aff *pma); + __isl_give isl_union_map * + isl_union_map_from_union_pw_multi_aff( + __isl_take isl_union_pw_multi_aff *upma); The C argument describes the domain of the resulting basic relation. It is required because the C may consist @@ -1385,6 +1431,12 @@ To iterate over the constraints of a basic set or map, use #include + int isl_basic_set_n_constraint( + __isl_keep isl_basic_set *bset); + int isl_basic_set_foreach_constraint( + __isl_keep isl_basic_set *bset, + int (*fn)(__isl_take isl_constraint *c, void *user), + void *user); int isl_basic_map_foreach_constraint( __isl_keep isl_basic_map *bmap, int (*fn)(__isl_take isl_constraint *c, void *user), @@ -1404,6 +1456,12 @@ represents an equality. If not, it represents an inequality. The coefficients of the constraints can be inspected using the following functions. + int isl_constraint_is_lower_bound( + __isl_keep isl_constraint *constraint, + enum isl_dim_type type, unsigned pos); + int isl_constraint_is_upper_bound( + __isl_keep isl_constraint *constraint, + enum isl_dim_type type, unsigned pos); void isl_constraint_get_constant( __isl_keep isl_constraint *constraint, isl_int *v); void isl_constraint_get_coefficient( @@ -1512,6 +1570,7 @@ or relation can be read off or set using the following functions. __isl_keep isl_basic_set *bset); __isl_give isl_basic_set *isl_basic_set_set_tuple_name( __isl_take isl_basic_set *set, const char *s); + int isl_set_has_tuple_name(__isl_keep isl_set *set); const char *isl_set_get_tuple_name( __isl_keep isl_set *set); const char *isl_basic_map_get_tuple_name( @@ -1529,6 +1588,9 @@ an internal data structure. The identifiers, positions or names of individual dimensions can be read off using the following functions. + __isl_give isl_id *isl_basic_set_get_dim_id( + __isl_keep isl_basic_set *bset, + enum isl_dim_type type, unsigned pos); __isl_give isl_set *isl_set_set_dim_id( __isl_take isl_set *set, enum isl_dim_type type, unsigned pos, __isl_take isl_id *id); @@ -1564,6 +1626,8 @@ read off using the following functions. const char *isl_basic_set_get_dim_name( __isl_keep isl_basic_set *bset, enum isl_dim_type type, unsigned pos); + int isl_set_has_dim_name(__isl_keep isl_set *set, + enum isl_dim_type type, unsigned pos); const char *isl_set_get_dim_name( __isl_keep isl_set *set, enum isl_dim_type type, unsigned pos); @@ -1611,6 +1675,10 @@ is already known to be empty. =item * Single-valuedness + int isl_basic_map_is_single_valued( + __isl_keep isl_basic_map *bmap); + int isl_map_plain_is_single_valued( + __isl_keep isl_map *map); int isl_map_is_single_valued(__isl_keep isl_map *map); int isl_union_map_is_single_valued(__isl_keep isl_union_map *umap); @@ -1671,6 +1739,14 @@ Check whether the product of domain and range of the given relation can be computed, i.e., whether both domain and range are nested relations. +=item * Currying + + int isl_basic_map_can_curry( + __isl_keep isl_basic_map *bmap); + int isl_map_can_curry(__isl_keep isl_map *map); + +Check whether the domain of the (basic) relation is a wrapped relation. + =back =head3 Binary Properties @@ -1704,6 +1780,9 @@ i.e., whether both domain and range are nested relations. =item * Subset + int isl_basic_set_is_subset( + __isl_keep isl_basic_set *bset1, + __isl_keep isl_basic_set *bset2); int isl_set_is_subset(__isl_keep isl_set *set1, __isl_keep isl_set *set2); int isl_set_is_strict_subset( @@ -1744,6 +1823,8 @@ i.e., whether both domain and range are nested relations. __isl_give isl_set *isl_set_complement( __isl_take isl_set *set); + __isl_give isl_map *isl_map_complement( + __isl_take isl_map *map); =item * Inverse map @@ -1843,12 +1924,20 @@ dimension has the fixed given value. __isl_give isl_basic_map *isl_basic_map_lower_bound_si( __isl_take isl_basic_map *bmap, enum isl_dim_type type, unsigned pos, int value); + __isl_give isl_set *isl_set_lower_bound( + __isl_take isl_set *set, + enum isl_dim_type type, unsigned pos, + isl_int value); __isl_give isl_set *isl_set_lower_bound_si( __isl_take isl_set *set, enum isl_dim_type type, unsigned pos, int value); __isl_give isl_map *isl_map_lower_bound_si( __isl_take isl_map *map, enum isl_dim_type type, unsigned pos, int value); + __isl_give isl_set *isl_set_upper_bound( + __isl_take isl_set *set, + enum isl_dim_type type, unsigned pos, + isl_int value); __isl_give isl_set *isl_set_upper_bound_si( __isl_take isl_set *set, enum isl_dim_type type, unsigned pos, int value); @@ -1857,11 +1946,15 @@ dimension has the fixed given value. enum isl_dim_type type, unsigned pos, int value); Intersect the set or relation with the half-space where the given -dimension has a value bounded the fixed given value. +dimension has a value bounded by the fixed given value. __isl_give isl_set *isl_set_equate(__isl_take isl_set *set, enum isl_dim_type type1, int pos1, enum isl_dim_type type2, int pos2); + __isl_give isl_basic_map *isl_basic_map_equate( + __isl_take isl_basic_map *bmap, + enum isl_dim_type type1, int pos1, + enum isl_dim_type type2, int pos2); __isl_give isl_map *isl_map_equate(__isl_take isl_map *map, enum isl_dim_type type1, int pos1, enum isl_dim_type type2, int pos2); @@ -1876,6 +1969,13 @@ dimensions are equal to each other. Intersect the relation with the hyperplane where the given dimensions have opposite values. + __isl_give isl_map *isl_map_order_gt(__isl_take isl_map *map, + enum isl_dim_type type1, int pos1, + enum isl_dim_type type2, int pos2); + +Intersect the relation with the half-space where the given +dimensions satisfy the given ordering. + =item * Identity __isl_give isl_map *isl_set_identity( @@ -1919,6 +2019,17 @@ basic set or relation. __isl_give isl_union_map *isl_union_map_coalesce( __isl_take isl_union_map *umap); +One of the methods for combining pairs of basic sets or relations +can result in coefficients that are much larger than those that appear +in the constraints of the input. By default, the coefficients are +not allowed to grow larger, but this can be changed by unsetting +the following option. + + int isl_options_set_coalesce_bounded_wrapping( + isl_ctx *ctx, int val); + int isl_options_get_coalesce_bounded_wrapping( + isl_ctx *ctx); + =item * Detecting equalities __isl_give isl_basic_set *isl_basic_set_detect_equalities( @@ -2013,6 +2124,20 @@ that contains the whole input set or relation. In case of union sets and relations, the polyhedral hull is computed per space. +=item * Feasibility + + __isl_give isl_basic_set *isl_basic_set_sample( + __isl_take isl_basic_set *bset); + __isl_give isl_basic_set *isl_set_sample( + __isl_take isl_set *set); + __isl_give isl_basic_map *isl_basic_map_sample( + __isl_take isl_basic_map *bmap); + __isl_give isl_basic_map *isl_map_sample( + __isl_take isl_map *map); + +If the input (basic) set or relation is non-empty, then return +a singleton subset of the input. Otherwise, return an empty set. + =item * Optimization #include @@ -2071,6 +2196,15 @@ dualization algorithms or skip the elimination step. =item * Power + __isl_give isl_map *isl_map_fixed_power( + __isl_take isl_map *map, isl_int exp); + __isl_give isl_union_map *isl_union_map_fixed_power( + __isl_take isl_union_map *umap, isl_int exp); + +Compute the given power of C, where C is assumed to be non-zero. +If the exponent C is negative, then the -C th power of the inverse +of C is computed. + __isl_give isl_map *isl_map_power(__isl_take isl_map *map, int *exact); __isl_give isl_union_map *isl_union_map_power( @@ -2192,6 +2326,20 @@ can be constructed using the following function. Given a relation with nested relations for domain and range, interchange the range of the domain with the domain of the range. +=item * Currying + + __isl_give isl_basic_map *isl_basic_map_curry( + __isl_take isl_basic_map *bmap); + __isl_give isl_map *isl_map_curry( + __isl_take isl_map *map); + __isl_give isl_union_map *isl_union_map_curry( + __isl_take isl_union_map *umap); + +Given a relation with a nested relation for domain, +move the range of the nested relation out of the domain +and use it as the domain of a nested relation in the range, +with the original range as range of this nested relation. + =item * Aligning parameters __isl_give isl_set *isl_set_align_params( @@ -2486,6 +2634,9 @@ instead. __isl_give isl_union_map *isl_union_map_gist_domain( __isl_take isl_union_map *umap, __isl_take isl_union_set *uset); + __isl_give isl_union_map *isl_union_map_gist_range( + __isl_take isl_union_map *umap, + __isl_take isl_union_set *uset); The gist operation returns a set or relation that has the same intersection with the context as the input set or relation. @@ -2664,6 +2815,35 @@ Lists can be printed using __isl_take isl_printer *p, __isl_keep isl_set_list *list); +=head2 Vectors + +Vectors can be created, copied and freed using the following functions. + + #include + __isl_give isl_vec *isl_vec_alloc(isl_ctx *ctx, + unsigned size); + __isl_give isl_vec *isl_vec_copy(__isl_keep isl_vec *vec); + void isl_vec_free(__isl_take isl_vec *vec); + +Note that the elements of a newly created vector may have arbitrary values. +The elements can be changed and inspected using the following functions. + + isl_ctx *isl_vec_get_ctx(__isl_keep isl_vec *vec); + int isl_vec_size(__isl_keep isl_vec *vec); + int isl_vec_get_element(__isl_keep isl_vec *vec, + int pos, isl_int *v); + __isl_give isl_vec *isl_vec_set_element( + __isl_take isl_vec *vec, int pos, isl_int v); + __isl_give isl_vec *isl_vec_set_element_si( + __isl_take isl_vec *vec, int pos, int v); + __isl_give isl_vec *isl_vec_set(__isl_take isl_vec *vec, + isl_int v); + __isl_give isl_vec *isl_vec_set_si(__isl_take isl_vec *vec, + int v); + +C will return a negative value if anything went wrong. +In that case, the value of C<*v> is undefined. + =head2 Matrices Matrices can be created, copied and freed using the following functions. @@ -2725,6 +2905,13 @@ be created using the following functions. __isl_give isl_pw_aff *isl_pw_aff_from_aff( __isl_take isl_aff *aff); +A piecewise quasi affine expression that is equal to 1 on a set +and 0 outside the set can be created using the following function. + + #include + __isl_give isl_pw_aff *isl_set_indicator_function( + __isl_take isl_set *set); + Quasi affine expressions can be copied and freed using #include @@ -2789,6 +2976,7 @@ The expression can be inspected using __isl_give isl_aff *isl_aff_get_div( __isl_keep isl_aff *aff, int pos); + int isl_pw_aff_n_piece(__isl_keep isl_pw_aff *pwaff); int isl_pw_aff_foreach_piece(__isl_keep isl_pw_aff *pwaff, int (*fn)(__isl_take isl_set *set, __isl_take isl_aff *aff, @@ -2933,10 +3121,16 @@ Operations include __isl_give isl_pw_aff *isl_pw_aff_coalesce( __isl_take isl_pw_aff *pwqp); + __isl_give isl_aff *isl_aff_align_params( + __isl_take isl_aff *aff, + __isl_take isl_space *model); __isl_give isl_pw_aff *isl_pw_aff_align_params( __isl_take isl_pw_aff *pwaff, __isl_take isl_space *model); + __isl_give isl_aff *isl_aff_project_domain_on_params( + __isl_take isl_aff *aff); + __isl_give isl_aff *isl_aff_gist_params( __isl_take isl_aff *aff, __isl_take isl_set *context); @@ -3033,14 +3227,14 @@ of C where C is non-negative. #include __isl_give isl_pw_aff *isl_pw_aff_cond( - __isl_take isl_set *cond, + __isl_take isl_pw_aff *cond, __isl_take isl_pw_aff *pwaff_true, __isl_take isl_pw_aff *pwaff_false); The function C performs a conditional operator and returns an expression that is equal to C -for elements in C and equal to C for elements -not in C. +for elements where C is non-zero and equal to C for elements +where C is zero. #include __isl_give isl_pw_aff *isl_pw_aff_union_min( @@ -3091,16 +3285,39 @@ following function. __isl_take isl_space *space, __isl_take isl_aff_list *list); -An empty piecewise multiple quasi affine expression (one with no cells) or -a piecewise multiple quasi affine expression with a single cell can -be created using the following functions. +An empty piecewise multiple quasi affine expression (one with no cells), +the zero piecewise multiple quasi affine expression (with value zero +for each output dimension), +a piecewise multiple quasi affine expression with a single cell (with +either a universe or a specified domain) or +a zero-dimensional piecewise multiple quasi affine expression +on a given domain +can be created using the following functions. #include __isl_give isl_pw_multi_aff *isl_pw_multi_aff_empty( __isl_take isl_space *space); + __isl_give isl_multi_aff *isl_multi_aff_zero( + __isl_take isl_space *space); + __isl_give isl_pw_multi_aff * + isl_pw_multi_aff_from_multi_aff( + __isl_take isl_multi_aff *ma); __isl_give isl_pw_multi_aff *isl_pw_multi_aff_alloc( __isl_take isl_set *set, __isl_take isl_multi_aff *maff); + __isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_domain( + __isl_take isl_set *set); + + __isl_give isl_union_pw_multi_aff * + isl_union_pw_multi_aff_empty( + __isl_take isl_space *space); + __isl_give isl_union_pw_multi_aff * + isl_union_pw_multi_aff_add_pw_multi_aff( + __isl_take isl_union_pw_multi_aff *upma, + __isl_take isl_pw_multi_aff *pma); + __isl_give isl_union_pw_multi_aff * + isl_union_pw_multi_aff_from_domain( + __isl_take isl_union_set *uset); A piecewise multiple quasi affine expression can also be initialized from an C or C, provided the C is a singleton @@ -3123,6 +3340,12 @@ Multiple quasi affine expressions can be copied and freed using void *isl_pw_multi_aff_free( __isl_take isl_pw_multi_aff *pma); + __isl_give isl_union_pw_multi_aff * + isl_union_pw_multi_aff_copy( + __isl_keep isl_union_pw_multi_aff *upma); + void *isl_union_pw_multi_aff_free( + __isl_take isl_union_pw_multi_aff *upma); + The expression can be inspected using #include @@ -3130,6 +3353,8 @@ The expression can be inspected using __isl_keep isl_multi_aff *maff); isl_ctx *isl_pw_multi_aff_get_ctx( __isl_keep isl_pw_multi_aff *pma); + isl_ctx *isl_union_pw_multi_aff_get_ctx( + __isl_keep isl_union_pw_multi_aff *upma); unsigned isl_multi_aff_dim(__isl_keep isl_multi_aff *maff, enum isl_dim_type type); unsigned isl_pw_multi_aff_dim( @@ -3164,16 +3389,31 @@ The expression can be inspected using __isl_take isl_multi_aff *maff, void *user), void *user); + int isl_union_pw_multi_aff_foreach_pw_multi_aff( + __isl_keep isl_union_pw_multi_aff *upma, + int (*fn)(__isl_take isl_pw_multi_aff *pma, + void *user), void *user); + It can be modified using #include + __isl_give isl_multi_aff *isl_multi_aff_set_aff( + __isl_take isl_multi_aff *multi, int pos, + __isl_take isl_aff *aff); __isl_give isl_multi_aff *isl_multi_aff_set_dim_name( __isl_take isl_multi_aff *maff, enum isl_dim_type type, unsigned pos, const char *s); + __isl_give isl_multi_aff *isl_multi_aff_set_tuple_id( + __isl_take isl_multi_aff *maff, + enum isl_dim_type type, __isl_take isl_id *id); __isl_give isl_pw_multi_aff *isl_pw_multi_aff_set_tuple_id( __isl_take isl_pw_multi_aff *pma, enum isl_dim_type type, __isl_take isl_id *id); + __isl_give isl_multi_aff *isl_multi_aff_drop_dims( + __isl_take isl_multi_aff *maff, + enum isl_dim_type type, unsigned first, unsigned n); + To check whether two multiple affine expressions are obviously equal to each other, use @@ -3192,6 +3432,9 @@ Operations include __isl_give isl_pw_multi_aff *isl_pw_multi_aff_add( __isl_take isl_pw_multi_aff *pma1, __isl_take isl_pw_multi_aff *pma2); + __isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_add( + __isl_take isl_union_pw_multi_aff *upma1, + __isl_take isl_union_pw_multi_aff *upma2); __isl_give isl_pw_multi_aff *isl_pw_multi_aff_union_add( __isl_take isl_pw_multi_aff *pma1, __isl_take isl_pw_multi_aff *pma2); @@ -3207,6 +3450,8 @@ Operations include __isl_give isl_multi_aff *isl_multi_aff_lift( __isl_take isl_multi_aff *maff, __isl_give isl_local_space **ls); + __isl_give isl_pw_multi_aff *isl_pw_multi_aff_coalesce( + __isl_take isl_pw_multi_aff *pma); __isl_give isl_multi_aff *isl_multi_aff_gist_params( __isl_take isl_multi_aff *maff, __isl_take isl_set *context); @@ -3219,6 +3464,21 @@ Operations include __isl_give isl_pw_multi_aff *isl_pw_multi_aff_gist( __isl_take isl_pw_multi_aff *pma, __isl_take isl_set *set); + __isl_give isl_set *isl_pw_multi_aff_domain( + __isl_take isl_pw_multi_aff *pma); + __isl_give isl_union_set *isl_union_pw_multi_aff_domain( + __isl_take isl_union_pw_multi_aff *upma); + __isl_give isl_multi_aff *isl_multi_aff_flat_range_product( + __isl_take isl_multi_aff *ma1, + __isl_take isl_multi_aff *ma2); + __isl_give isl_pw_multi_aff * + isl_pw_multi_aff_flat_range_product( + __isl_take isl_pw_multi_aff *pma1, + __isl_take isl_pw_multi_aff *pma2); + __isl_give isl_union_pw_multi_aff * + isl_union_pw_multi_aff_flat_range_product( + __isl_take isl_union_pw_multi_aff *upma1, + __isl_take isl_union_pw_multi_aff *upma2); If the C argument of C is not C, then it is assigned the local space that lies at the basis of @@ -3241,6 +3501,9 @@ An expression can be printed using __isl_give isl_printer *isl_printer_print_pw_multi_aff( __isl_take isl_printer *p, __isl_keep isl_pw_multi_aff *pma); + __isl_give isl_printer *isl_printer_print_union_pw_multi_aff( + __isl_take isl_printer *p, + __isl_keep isl_union_pw_multi_aff *upma); =head2 Points @@ -3459,7 +3722,7 @@ functions. __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_copy( __isl_keep isl_union_pw_qpolynomial *upwqp); - void isl_union_pw_qpolynomial_free( + void *isl_union_pw_qpolynomial_free( __isl_take isl_union_pw_qpolynomial *upwqp); =head3 Inspecting (Piecewise) Quasipolynomials @@ -3718,7 +3981,7 @@ following functions. __isl_take isl_qpolynomial_fold *fold); void *isl_pw_qpolynomial_fold_free( __isl_take isl_pw_qpolynomial_fold *pwf); - void isl_union_pw_qpolynomial_fold_free( + void *isl_union_pw_qpolynomial_fold_free( __isl_take isl_union_pw_qpolynomial_fold *upwf); =head3 Printing Piecewise Quasipolynomial Reductions @@ -4036,7 +4299,7 @@ the following operation. Given a relation between sink iterations and potential soure iterations from a particular source domain, what is the last potential source iteration corresponding to each sink iteration. It can sometimes be convenient to adjust -the set of potential source iterations before each such operation. +the set of potential source iterations before or after each such operation. The prototypical example is fuzzy array dataflow analysis, where we need to analyze if, based on data-dependent constraints, the sink iteration can ever be executed without one or more of @@ -4048,29 +4311,63 @@ function. #include - typedef __isl_give isl_set *(*isl_access_restrict_sources)( - __isl_take isl_map *source_map, - void *sink_user, void *source_user); - __isl_give isl_access_info * - isl_access_info_set_restrict_sources( + typedef __isl_give isl_restriction *(*isl_access_restrict)( + __isl_keep isl_map *source_map, + __isl_keep isl_set *sink, void *source_user, + void *user); + __isl_give isl_access_info *isl_access_info_set_restrict( __isl_take isl_access_info *acc, - isl_access_restrict_sources fn); + isl_access_restrict fn, void *user); -The function C should be called -before C and registers a callback function +The function C should be called +before calling C and registers a callback function that will be called any time C is about to compute the last potential source. The first argument is the (reverse) proto-dependence, mapping sink iterations to potential source iterations. -The other two arguments are the tokens corresponding to the sink -and the source. The callback is expected to return a set -that restricts the source iterations. The potential source iterations -will be intersected with this set. If no restrictions are required -for a given C, then the callback should return +The second argument represents the sink iterations for which +we want to compute the last source iteration. +The third argument is the token corresponding to the source +and the final argument is the token passed to C. +The callback is expected to return a restriction on either the input or +the output of the operation computing the last potential source. +If the input needs to be restricted then restrictions are needed +for both the source and the sink iterations. The sink iterations +and the potential source iterations will be intersected with these sets. +If the output needs to be restricted then only a restriction on the source +iterations is required. +If any error occurs, the callback should return C. +An C object can be created and freed using the following +functions. - isl_set_universe( - isl_space_range(isl_map_get_space(source_map))); + #include -If any error occurs, the callback should return C. + __isl_give isl_restriction *isl_restriction_input( + __isl_take isl_set *source_restr, + __isl_take isl_set *sink_restr); + __isl_give isl_restriction *isl_restriction_output( + __isl_take isl_set *source_restr); + __isl_give isl_restriction *isl_restriction_none( + __isl_keep isl_map *source_map); + __isl_give isl_restriction *isl_restriction_empty( + __isl_keep isl_map *source_map); + void *isl_restriction_free( + __isl_take isl_restriction *restr); + +C and C are special +cases of C. C +is essentially equivalent to + + isl_restriction_input(isl_set_universe( + isl_space_range(isl_map_get_space(source_map))), + isl_set_universe( + isl_space_domain(isl_map_get_space(source_map)))); + +whereas C is essentially equivalent to + + isl_restriction_input(isl_set_empty( + isl_space_range(isl_map_get_space(source_map))), + isl_set_universe( + isl_space_domain(isl_map_get_space(source_map)))); =head2 Scheduling @@ -4167,6 +4464,23 @@ That is, if the dependence distances of the proximity dependences are all zero in that direction (for fixed iterations of outer bands). +A band can be tiled using the following function. + + #include + int isl_band_tile(__isl_keep isl_band *band, + __isl_take isl_vec *sizes); + + int isl_options_set_tile_scale_tile_loops(isl_ctx *ctx, + int val); + int isl_options_get_tile_scale_tile_loops(isl_ctx *ctx); + +The C function tiles the band using the given tile sizes +inside its schedule. +A new child band is created to represent the point loops and it is +inserted between the modified band and its children. +The C option specifies whether the tile +loops iterators should be scaled by the tile sizes. + A representation of the band can be printed using #include @@ -4177,6 +4491,10 @@ A representation of the band can be printed using =head3 Options #include + int isl_options_set_schedule_max_coefficient( + isl_ctx *ctx, int val); + int isl_options_get_schedule_max_coefficient( + isl_ctx *ctx); int isl_options_set_schedule_max_constant_term( isl_ctx *ctx, int val); int isl_options_get_schedule_max_constant_term( @@ -4189,9 +4507,9 @@ A representation of the band can be printed using isl_ctx *ctx, int val); int isl_options_get_schedule_outer_zero_distance( isl_ctx *ctx); - int isl_options_set_schedule_split_parallel( + int isl_options_set_schedule_split_scaled( isl_ctx *ctx, int val); - int isl_options_get_schedule_split_parallel( + int isl_options_get_schedule_split_scaled( isl_ctx *ctx); int isl_options_set_schedule_algorithm( isl_ctx *ctx, int val); @@ -4201,6 +4519,15 @@ A representation of the band can be printed using =over +=item * schedule_max_coefficient + +This option enforces that the coefficients for variable and parameter +dimensions in the calculated schedule are not larger than the specified value. +This option can significantly increase the speed of the scheduling calculation +and may also prevent fusing of unrelated dimensions. A value of -1 means that +this option does not introduce bounds on the variable or parameter +coefficients. + =item * schedule_max_constant_term This option enforces that the constant coefficients in the calculated schedule @@ -4224,13 +4551,14 @@ where the outermost scheduling dimension in each band results in a zero dependence distance over the proximity dependences. -=item * schedule_split_parallel +=item * schedule_split_scaled If this option is set, then we try to construct schedules in which the constant term is split off from the linear part if the linear parts of -the scheduling rows for all nodes in the graphs are the same. +the scheduling rows for all nodes in the graphs have a common non-trivial +divisor. The constant term is then placed in a separate band and the linear -part is simplified. +part is reduced. =item * schedule_algorithm