Update isl to isl-0.15-30-g3518765

This updated contains various changes to isl, including improvements to the
AST generator. For Polly, the most important change is a fix that unbreaks
builds on darwin (reported by: Jack Howard)

llvm-svn: 241048
This commit is contained in:
Tobias Grosser 2015-06-30 08:22:14 +00:00
parent 886fbad410
commit 4db553199c
51 changed files with 903 additions and 145 deletions

View File

@ -1 +1 @@
isl-0.15-3-g532568a
isl-0.15-30-g3518765

View File

@ -102,6 +102,7 @@ libisl_la_SOURCES = \
isl_factorization.c \
isl_factorization.h \
isl_farkas.c \
isl_ffs.c \
isl_flow.c \
isl_fold.c \
isl_hash.c \

View File

@ -178,7 +178,7 @@ am__libisl_la_SOURCES_DIST = mp_get_memory_functions.c isl_int_gmp.h \
isl_coalesce.c isl_constraint.c isl_constraint_private.h \
isl_convex_hull.c isl_ctx.c isl_ctx_private.h isl_deprecated.c \
isl_dim_map.h isl_dim_map.c isl_equalities.c isl_equalities.h \
isl_factorization.c isl_factorization.h isl_farkas.c \
isl_factorization.c isl_factorization.h isl_farkas.c isl_ffs.c \
isl_flow.c isl_fold.c isl_hash.c isl_id_to_ast_expr.c \
isl_id_to_pw_aff.c isl_ilp.c isl_ilp_private.h isl_input.c \
isl_int.h isl_local_space_private.h isl_local_space.c isl_lp.c \
@ -225,19 +225,20 @@ am_libisl_la_OBJECTS = $(am__objects_4) $(am__objects_5) isl_aff.lo \
isl_bound.lo isl_coalesce.lo isl_constraint.lo \
isl_convex_hull.lo isl_ctx.lo isl_deprecated.lo isl_dim_map.lo \
isl_equalities.lo isl_factorization.lo isl_farkas.lo \
isl_flow.lo isl_fold.lo isl_hash.lo isl_id_to_ast_expr.lo \
isl_id_to_pw_aff.lo isl_ilp.lo isl_input.lo isl_local_space.lo \
isl_lp.lo isl_map.lo isl_map_list.lo isl_map_simplify.lo \
isl_map_subtract.lo isl_map_to_basic_set.lo isl_mat.lo \
isl_morph.lo isl_id.lo isl_obj.lo isl_options.lo isl_output.lo \
isl_point.lo isl_polynomial.lo isl_printer.lo print.lo \
isl_range.lo isl_reordering.lo isl_sample.lo isl_scan.lo \
isl_schedule.lo isl_schedule_band.lo isl_schedule_node.lo \
isl_schedule_read.lo isl_schedule_tree.lo isl_scheduler.lo \
isl_set_list.lo isl_sort.lo isl_space.lo isl_stream.lo \
isl_seq.lo isl_tab.lo isl_tab_pip.lo isl_tarjan.lo \
isl_transitive_closure.lo isl_union_map.lo isl_val.lo \
isl_vec.lo isl_version.lo isl_vertices.lo
isl_ffs.lo isl_flow.lo isl_fold.lo isl_hash.lo \
isl_id_to_ast_expr.lo isl_id_to_pw_aff.lo isl_ilp.lo \
isl_input.lo isl_local_space.lo isl_lp.lo isl_map.lo \
isl_map_list.lo isl_map_simplify.lo isl_map_subtract.lo \
isl_map_to_basic_set.lo isl_mat.lo isl_morph.lo isl_id.lo \
isl_obj.lo isl_options.lo isl_output.lo isl_point.lo \
isl_polynomial.lo isl_printer.lo print.lo isl_range.lo \
isl_reordering.lo isl_sample.lo isl_scan.lo isl_schedule.lo \
isl_schedule_band.lo isl_schedule_node.lo isl_schedule_read.lo \
isl_schedule_tree.lo isl_scheduler.lo isl_set_list.lo \
isl_sort.lo isl_space.lo isl_stream.lo isl_seq.lo isl_tab.lo \
isl_tab_pip.lo isl_tarjan.lo isl_transitive_closure.lo \
isl_union_map.lo isl_val.lo isl_vec.lo isl_version.lo \
isl_vertices.lo
libisl_la_OBJECTS = $(am_libisl_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@ -844,6 +845,7 @@ libisl_la_SOURCES = \
isl_factorization.c \
isl_factorization.h \
isl_farkas.c \
isl_ffs.c \
isl_flow.c \
isl_fold.c \
isl_hash.c \
@ -1287,6 +1289,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_equalities.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_factorization.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_farkas.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_ffs.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_flow.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_fold.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_gmp.Plo@am__quote@

0
polly/lib/External/isl/compile vendored Normal file → Executable file
View File

0
polly/lib/External/isl/config.guess vendored Normal file → Executable file
View File

0
polly/lib/External/isl/config.sub vendored Normal file → Executable file
View File

101
polly/lib/External/isl/configure vendored Normal file → Executable file
View File

@ -17466,6 +17466,9 @@ fi
;;
esac
if test "x$with_int" = "ximath-32" -a "x$GCC" = "xyes"; then
MP_CPPFLAGS="-std=gnu99 $MP_CPPFLAGS"
fi
if test x$with_int = ximath -o x$with_int = ximath-32; then
IMATH_FOR_MP_TRUE=
@ -17523,6 +17526,104 @@ cat >>confdefs.h <<_ACEOF
#define HAVE_DECL___BUILTIN_FFS $ac_have_decl
_ACEOF
ac_fn_c_check_decl "$LINENO" "_BitScanForward" "ac_cv_have_decl__BitScanForward" "#include <intrin.h>
"
if test "x$ac_cv_have_decl__BitScanForward" = xyes; then :
ac_have_decl=1
else
ac_have_decl=0
fi
cat >>confdefs.h <<_ACEOF
#define HAVE_DECL__BITSCANFORWARD $ac_have_decl
_ACEOF
if test "x$ac_cv_have_decl_ffs" = xno -a \
"x$ac_cv_have_decl___builtin_ffs" = xno -a \
"x$ac_cv_have_decl__BitScanForward" = xno; then
as_fn_error $? "No ffs implementation found" "$LINENO" 5
fi
ac_fn_c_check_decl "$LINENO" "strcasecmp" "ac_cv_have_decl_strcasecmp" "#include <strings.h>
"
if test "x$ac_cv_have_decl_strcasecmp" = xyes; then :
ac_have_decl=1
else
ac_have_decl=0
fi
cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_STRCASECMP $ac_have_decl
_ACEOF
ac_fn_c_check_decl "$LINENO" "strncasecmp" "ac_cv_have_decl_strncasecmp" "#include <strings.h>
"
if test "x$ac_cv_have_decl_strncasecmp" = xyes; then :
ac_have_decl=1
else
ac_have_decl=0
fi
cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_STRNCASECMP $ac_have_decl
_ACEOF
ac_fn_c_check_decl "$LINENO" "_stricmp" "ac_cv_have_decl__stricmp" "#include <string.h>
"
if test "x$ac_cv_have_decl__stricmp" = xyes; then :
ac_have_decl=1
else
ac_have_decl=0
fi
cat >>confdefs.h <<_ACEOF
#define HAVE_DECL__STRICMP $ac_have_decl
_ACEOF
ac_fn_c_check_decl "$LINENO" "_strnicmp" "ac_cv_have_decl__strnicmp" "#include <string.h>
"
if test "x$ac_cv_have_decl__strnicmp" = xyes; then :
ac_have_decl=1
else
ac_have_decl=0
fi
cat >>confdefs.h <<_ACEOF
#define HAVE_DECL__STRNICMP $ac_have_decl
_ACEOF
if test "x$ac_cv_have_decl_strcasecmp" = xno -a \
"x$ac_cv_have_decl__stricmp" = xno; then
as_fn_error $? "No strcasecmp implementation found" "$LINENO" 5
fi
if test "x$ac_cv_have_decl_strncasecmp" = xno -a \
"x$ac_cv_have_decl__strnicmp" = xno; then
as_fn_error $? "No strncasecmp implementation found" "$LINENO" 5
fi
ac_fn_c_check_decl "$LINENO" "snprintf" "ac_cv_have_decl_snprintf" "#include <stdio.h>
"
if test "x$ac_cv_have_decl_snprintf" = xyes; then :
ac_have_decl=1
else
ac_have_decl=0
fi
cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_SNPRINTF $ac_have_decl
_ACEOF
ac_fn_c_check_decl "$LINENO" "_snprintf" "ac_cv_have_decl__snprintf" "#include <stdio.h>
"
if test "x$ac_cv_have_decl__snprintf" = xyes; then :
ac_have_decl=1
else
ac_have_decl=0
fi
cat >>confdefs.h <<_ACEOF
#define HAVE_DECL__SNPRINTF $ac_have_decl
_ACEOF
if test "x$ac_cv_have_decl_snprintf" = xno -a \
"x$ac_cv_have_decl__snprintf" = xno; then
as_fn_error $? "No snprintf implementation found" "$LINENO" 5
fi

View File

@ -59,6 +59,9 @@ imath|imath-32)
AX_DETECT_IMATH
;;
esac
if test "x$with_int" = "ximath-32" -a "x$GCC" = "xyes"; then
MP_CPPFLAGS="-std=gnu99 $MP_CPPFLAGS"
fi
AM_CONDITIONAL(IMATH_FOR_MP, test x$with_int = ximath -o x$with_int = ximath-32)
AM_CONDITIONAL(GMP_FOR_MP, test x$with_int = xgmp)
@ -70,6 +73,27 @@ AS_IF([test "x$with_int" == "ximath-32"], [
AC_CHECK_DECLS(ffs,[],[],[#include <strings.h>])
AC_CHECK_DECLS(__builtin_ffs,[],[],[])
AC_CHECK_DECLS([_BitScanForward],[],[],[#include <intrin.h>])
if test "x$ac_cv_have_decl_ffs" = xno -a \
"x$ac_cv_have_decl___builtin_ffs" = xno -a \
"x$ac_cv_have_decl__BitScanForward" = xno; then
AC_MSG_ERROR([No ffs implementation found])
fi
AC_CHECK_DECLS([strcasecmp,strncasecmp],[],[],[#include <strings.h>])
AC_CHECK_DECLS([_stricmp,_strnicmp],[],[],[#include <string.h>])
if test "x$ac_cv_have_decl_strcasecmp" = xno -a \
"x$ac_cv_have_decl__stricmp" = xno; then
AC_MSG_ERROR([No strcasecmp implementation found])
fi
if test "x$ac_cv_have_decl_strncasecmp" = xno -a \
"x$ac_cv_have_decl__strnicmp" = xno; then
AC_MSG_ERROR([No strncasecmp implementation found])
fi
AC_CHECK_DECLS([snprintf,_snprintf],[],[],[#include <stdio.h>])
if test "x$ac_cv_have_decl_snprintf" = xno -a \
"x$ac_cv_have_decl__snprintf" = xno; then
AC_MSG_ERROR([No snprintf implementation found])
fi
AC_SUBST(CLANG_CXXFLAGS)
AC_SUBST(CLANG_LDFLAGS)

0
polly/lib/External/isl/depcomp vendored Normal file → Executable file
View File

Binary file not shown.

View File

@ -641,6 +641,8 @@ They can be inspected using the following functions.
#include <isl/val.h>
long isl_val_get_num_si(__isl_keep isl_val *v);
long isl_val_get_den_si(__isl_keep isl_val *v);
__isl_give isl_val *isl_val_get_den_val(
__isl_keep isl_val *v);
double isl_val_get_d(__isl_keep isl_val *v);
size_t isl_val_n_abs_num_chunks(__isl_keep isl_val *v,
size_t size);
@ -2179,6 +2181,14 @@ from
#include <isl/map.h>
int isl_map_n_basic_map(__isl_keep isl_map *map);
It is also possible to obtain a list of basic sets from a set
#include <isl/set.h>
__isl_give isl_basic_set_list *isl_set_get_basic_set_list(
__isl_keep isl_set *set);
The returned list can be manipulated using the functions in L<"Lists">.
To iterate over the constraints of a basic set or map, use
#include <isl/constraint.h>
@ -6261,7 +6271,7 @@ The functions C<isl_space_range_factor_domain> and
C<isl_space_range_factor_range> extract the two arguments from
the result of a call to C<isl_space_range_product>.
The arguments of a call to C<isl_map_range_product> can be extracted
The arguments of a call to a product can be extracted
from the result using the following functions.
#include <isl/map.h>
@ -6294,6 +6304,8 @@ from the result using the following functions.
__isl_take isl_union_map *umap);
#include <isl/val.h>
__isl_give isl_multi_val *isl_multi_val_factor_range(
__isl_take isl_multi_val *mv);
__isl_give isl_multi_val *
isl_multi_val_range_factor_domain(
__isl_take isl_multi_val *mv);
@ -6302,6 +6314,8 @@ from the result using the following functions.
__isl_take isl_multi_val *mv);
#include <isl/aff.h>
__isl_give isl_multi_aff *isl_multi_aff_factor_range(
__isl_take isl_multi_aff *ma);
__isl_give isl_multi_aff *
isl_multi_aff_range_factor_domain(
__isl_take isl_multi_aff *ma);
@ -6309,12 +6323,18 @@ from the result using the following functions.
isl_multi_aff_range_factor_range(
__isl_take isl_multi_aff *ma);
__isl_give isl_multi_pw_aff *
isl_multi_pw_aff_factor_range(
__isl_take isl_multi_pw_aff *mpa);
__isl_give isl_multi_pw_aff *
isl_multi_pw_aff_range_factor_domain(
__isl_take isl_multi_pw_aff *mpa);
__isl_give isl_multi_pw_aff *
isl_multi_pw_aff_range_factor_range(
__isl_take isl_multi_pw_aff *mpa);
__isl_give isl_multi_union_pw_aff *
isl_multi_union_pw_aff_factor_range(
__isl_take isl_multi_union_pw_aff *mupa);
__isl_give isl_multi_union_pw_aff *
isl_multi_union_pw_aff_range_factor_domain(
__isl_take isl_multi_union_pw_aff *mupa);
__isl_give isl_multi_union_pw_aff *
@ -6324,6 +6344,11 @@ from the result using the following functions.
The splice functions are a generalization of the flat product functions,
where the second argument may be inserted at any position inside
the first argument rather than being placed at the end.
The functions C<isl_multi_val_factor_range>,
C<isl_multi_aff_factor_range>,
C<isl_multi_pw_aff_factor_range> and
C<isl_multi_union_pw_aff_factor_range>
take functions that live in a set space.
#include <isl/val.h>
__isl_give isl_multi_val *isl_multi_val_range_splice(
@ -6520,6 +6545,9 @@ to simplify the expression associated to each cell.
=item * Binary Arithmethic Operations
#include <isl/val.h>
__isl_give isl_multi_val *isl_multi_val_add(
__isl_take isl_multi_val *mv1,
__isl_take isl_multi_val *mv2);
__isl_give isl_multi_val *isl_multi_val_sub(
__isl_take isl_multi_val *mv1,
__isl_take isl_multi_val *mv2);
@ -6534,6 +6562,9 @@ to simplify the expression associated to each cell.
__isl_give isl_pw_aff *isl_pw_aff_add(
__isl_take isl_pw_aff *pwaff1,
__isl_take isl_pw_aff *pwaff2);
__isl_give isl_multi_pw_aff *isl_multi_pw_aff_add(
__isl_take isl_multi_pw_aff *mpa1,
__isl_take isl_multi_pw_aff *mpa2);
__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);
@ -6543,6 +6574,10 @@ to simplify the expression associated to each cell.
__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_multi_union_pw_aff *
isl_multi_union_pw_aff_add(
__isl_take isl_multi_union_pw_aff *mupa1,
__isl_take isl_multi_union_pw_aff *mupa2);
__isl_give isl_pw_aff *isl_pw_aff_min(
__isl_take isl_pw_aff *pwaff1,
__isl_take isl_pw_aff *pwaff2);
@ -8098,7 +8133,7 @@ introduced expansion node. Grouping instances of different statements
ensures that they will be treated as a single statement by the
AST generator up to the point of the expansion node.
The partial schedule of a band node can be scaled (down) using
The partial schedule of a band node can be scaled (down) or reduced using
the following functions.
#include <isl/schedule_node.h>
@ -8110,11 +8145,26 @@ the following functions.
isl_schedule_node_band_scale_down(
__isl_take isl_schedule_node *node,
__isl_take isl_multi_val *mv);
__isl_give isl_schedule_node *
isl_schedule_node_band_mod(
__isl_take isl_schedule_node *node,
__isl_take isl_multi_val *mv);
The spaces of the two arguments need to match.
After scaling, the partial schedule is replaced by its greatest
integer part to ensure that the schedule remains integral.
The partial schedule of a band node can be shifted by an
C<isl_multi_union_pw_aff> with a domain that is a superset
of the domain of the partial schedule using
the following function.
#include <isl/schedule_node.h>
__isl_give isl_schedule_node *
isl_schedule_node_band_shift(
__isl_take isl_schedule_node *node,
__isl_take isl_multi_union_pw_aff *shift);
A band node can be tiled using the following function.
#include <isl/schedule_node.h>

View File

@ -340,9 +340,6 @@ __isl_give isl_multi_aff *isl_multi_aff_multi_val_on_space(
__isl_give isl_multi_aff *isl_multi_aff_floor(__isl_take isl_multi_aff *ma);
__isl_give isl_multi_aff *isl_multi_aff_add(__isl_take isl_multi_aff *maff1,
__isl_take isl_multi_aff *maff2);
__isl_give isl_multi_aff *isl_multi_aff_product(
__isl_take isl_multi_aff *ma1, __isl_take isl_multi_aff *ma2);

View File

@ -79,6 +79,8 @@ __isl_give isl_multi_##BASE *isl_multi_##BASE##_flat_range_product( \
__isl_give isl_multi_##BASE *isl_multi_##BASE##_range_product( \
__isl_take isl_multi_##BASE *multi1, \
__isl_take isl_multi_##BASE *multi2); \
__isl_give isl_multi_##BASE *isl_multi_##BASE##_factor_range( \
__isl_take isl_multi_##BASE *multi); \
isl_bool isl_multi_##BASE##_range_is_wrapping( \
__isl_keep isl_multi_##BASE *multi); \
__isl_give isl_multi_##BASE *isl_multi_##BASE##_range_factor_domain( \
@ -98,6 +100,9 @@ __isl_give isl_multi_##BASE *isl_multi_##BASE##_scale_down_multi_val( \
__isl_give isl_multi_##BASE *isl_multi_##BASE##_mod_multi_val( \
__isl_take isl_multi_##BASE *multi, \
__isl_take isl_multi_val *mv); \
__isl_give isl_multi_##BASE *isl_multi_##BASE##_add( \
__isl_take isl_multi_##BASE *multi1, \
__isl_take isl_multi_##BASE *multi2); \
__isl_give isl_multi_##BASE *isl_multi_##BASE##_sub( \
__isl_take isl_multi_##BASE *multi1, \
__isl_take isl_multi_##BASE *multi2); \

View File

@ -123,6 +123,11 @@ __isl_give isl_schedule_node *isl_schedule_node_band_scale(
__isl_take isl_schedule_node *node, __isl_take isl_multi_val *mv);
__isl_give isl_schedule_node *isl_schedule_node_band_scale_down(
__isl_take isl_schedule_node *node, __isl_take isl_multi_val *mv);
__isl_give isl_schedule_node *isl_schedule_node_band_mod(
__isl_take isl_schedule_node *node, __isl_take isl_multi_val *mv);
__isl_give isl_schedule_node *isl_schedule_node_band_shift(
__isl_take isl_schedule_node *node,
__isl_take isl_multi_union_pw_aff *shift);
__isl_give isl_schedule_node *isl_schedule_node_band_tile(
__isl_take isl_schedule_node *node, __isl_take isl_multi_val *sizes);
__isl_give isl_schedule_node *isl_schedule_node_band_sink(

View File

@ -433,6 +433,8 @@ int isl_set_n_basic_set(__isl_keep isl_set *set);
__isl_export
isl_stat isl_set_foreach_basic_set(__isl_keep isl_set *set,
isl_stat (*fn)(__isl_take isl_basic_set *bset, void *user), void *user);
__isl_give isl_basic_set_list *isl_set_get_basic_set_list(
__isl_keep isl_set *set);
isl_stat isl_set_foreach_point(__isl_keep isl_set *set,
isl_stat (*fn)(__isl_take isl_point *pnt, void *user), void *user);

View File

@ -40,6 +40,7 @@ __isl_null isl_val *isl_val_free(__isl_take isl_val *v);
isl_ctx *isl_val_get_ctx(__isl_keep isl_val *val);
long isl_val_get_num_si(__isl_keep isl_val *v);
long isl_val_get_den_si(__isl_keep isl_val *v);
__isl_give isl_val *isl_val_get_den_val(__isl_keep isl_val *v);
double isl_val_get_d(__isl_keep isl_val *v);
size_t isl_val_n_abs_num_chunks(__isl_keep isl_val *v, size_t size);
int isl_val_get_abs_num_chunks(__isl_keep isl_val *v, size_t size,

0
polly/lib/External/isl/install-sh vendored Normal file → Executable file
View File

View File

@ -3950,25 +3950,6 @@ __isl_give isl_pw_multi_aff *isl_pw_multi_aff_identity(
return isl_pw_multi_aff_from_multi_aff(isl_multi_aff_identity(space));
}
/* Add "ma2" to "ma1" and return the result.
*
* The parameters of "ma1" and "ma2" are assumed to have been aligned.
*/
static __isl_give isl_multi_aff *isl_multi_aff_add_aligned(
__isl_take isl_multi_aff *maff1, __isl_take isl_multi_aff *maff2)
{
return isl_multi_aff_bin_op(maff1, maff2, &isl_aff_add);
}
/* Add "ma2" to "ma1" and return the result.
*/
__isl_give isl_multi_aff *isl_multi_aff_add(__isl_take isl_multi_aff *ma1,
__isl_take isl_multi_aff *ma2)
{
return isl_multi_aff_align_params_multi_multi_and(ma1, ma2,
&isl_multi_aff_add_aligned);
}
/* Exploit the equalities in "eq" to simplify the affine expressions.
*/
static __isl_give isl_multi_aff *isl_multi_aff_substitute_equalities(

View File

@ -13,6 +13,7 @@
#include <isl/arg.h>
#include <isl/ctx.h>
#include <isl_config.h>
static struct isl_arg help_arg[] = {
ISL_ARG_PHANTOM_BOOL('h', "help", NULL, "print this help, then exit")

View File

@ -18,6 +18,7 @@
#include <isl/union_map.h>
#include <isl_ast_build_private.h>
#include <isl_ast_private.h>
#include <isl_config.h>
/* Construct a map that isolates the current dimension.
*

View File

@ -661,6 +661,12 @@ static int mod_constraint_is_simpler(struct isl_extract_mod_data *data,
* not to involve any coefficients that are multiples of d, "c" may
* very well involve such coefficients. This means that we may actually
* miss some cases.
*
* If the constant term is "too large", then the constraint is rejected,
* where "too large" is fairly arbitrarily set to 1 << 15.
* We do this to avoid picking up constraints that bound a variable
* by a very large number, say the largest or smallest possible
* variable in the representation of some integer type.
*/
static isl_stat check_parallel_or_opposite(__isl_take isl_constraint *c,
void *user)
@ -684,6 +690,15 @@ static isl_stat check_parallel_or_opposite(__isl_take isl_constraint *c,
}
}
if (parallel || opposite) {
isl_val *v;
v = isl_val_abs(isl_constraint_get_constant_val(c));
if (isl_val_cmp_si(v, 1 << 15) > 0)
parallel = opposite = 0;
isl_val_free(v);
}
for (t = 0; t < 2; ++t) {
for (i = 0; i < n[t]; ++i) {
isl_val *v1, *v2;
@ -1467,55 +1482,62 @@ __isl_give isl_ast_expr *isl_ast_build_expr_from_basic_set(
return res;
}
struct isl_expr_from_set_data {
isl_ast_build *build;
int first;
isl_ast_expr *res;
};
/* Construct an isl_ast_expr that evaluates the conditions defining "bset"
* and add it to data->res.
* The result is simplified in terms of data->build->domain.
*/
static isl_stat expr_from_set(__isl_take isl_basic_set *bset, void *user)
{
struct isl_expr_from_set_data *data = user;
isl_ast_expr *expr;
expr = isl_ast_build_expr_from_basic_set(data->build, bset);
if (data->first)
data->res = expr;
else
data->res = isl_ast_expr_or(data->res, expr);
data->first = 0;
if (!data->res)
return isl_stat_error;
return isl_stat_ok;
}
/* Construct an isl_ast_expr that evaluates the conditions defining "set".
* The result is simplified in terms of build->domain.
*
* If "set" is an (obviously) empty set, then return the expression "0".
*
* If there are multiple disjuncts in the description of the set,
* then subsequent disjuncts are simplified in a context where
* the previous disjuncts have been removed from build->domain.
* In particular, constraints that ensure that there is no overlap
* with these previous disjuncts, can be removed.
*
* "set" lives in the internal schedule space.
*/
__isl_give isl_ast_expr *isl_ast_build_expr_from_set_internal(
__isl_keep isl_ast_build *build, __isl_take isl_set *set)
{
struct isl_expr_from_set_data data = { build, 1, NULL };
int i, n;
isl_basic_set *bset;
isl_basic_set_list *list;
isl_set *domain;
isl_ast_expr *res;
if (isl_set_foreach_basic_set(set, &expr_from_set, &data) < 0)
data.res = isl_ast_expr_free(data.res);
else if (data.first) {
list = isl_set_get_basic_set_list(set);
isl_set_free(set);
if (!list)
return NULL;
n = isl_basic_set_list_n_basic_set(list);
if (n == 0) {
isl_ctx *ctx = isl_ast_build_get_ctx(build);
data.res = isl_ast_expr_from_val(isl_val_zero(ctx));
isl_basic_set_list_free(list);
return isl_ast_expr_from_val(isl_val_zero(ctx));
}
domain = isl_ast_build_get_domain(build);
bset = isl_basic_set_list_get_basic_set(list, 0);
set = isl_set_from_basic_set(isl_basic_set_copy(bset));
res = isl_ast_build_expr_from_basic_set(build, bset);
for (i = 1; i < n; ++i) {
isl_ast_expr *expr;
domain = isl_set_subtract(domain, set);
bset = isl_basic_set_list_get_basic_set(list, i);
set = isl_set_from_basic_set(isl_basic_set_copy(bset));
bset = isl_basic_set_gist(bset,
isl_set_simple_hull(isl_set_copy(domain)));
expr = isl_ast_build_expr_from_basic_set(build, bset);
res = isl_ast_expr_or(res, expr);
}
isl_set_free(domain);
isl_set_free(set);
return data.res;
isl_basic_set_list_free(list);
return res;
}
/* Construct an isl_ast_expr that evaluates the conditions defining "set".

View File

@ -1689,7 +1689,7 @@ static int shift_div(struct isl_coalesce_info *info, int div, isl_int shift)
{
unsigned total;
info->bmap = isl_basic_map_shift_div(info->bmap, div, shift);
info->bmap = isl_basic_map_shift_div(info->bmap, div, 0, shift);
if (!info->bmap)
return -1;
@ -2464,7 +2464,7 @@ static enum isl_change coalesce_pair(int i, int j,
/* Return the maximum of "a" and "b".
*/
static inline int max(int a, int b)
static int isl_max(int a, int b)
{
return a > b ? a : b;
}
@ -2491,7 +2491,7 @@ static int coalesce_range(isl_ctx *ctx, struct isl_coalesce_info *info,
for (i = end1 - 1; i >= start1; --i) {
if (info[i].removed)
continue;
for (j = max(i + 1, start2); j < end2; ++j) {
for (j = isl_max(i + 1, start2); j < end2; ++j) {
enum isl_change changed;
if (info[j].removed)

View File

@ -44,6 +44,34 @@
to 0 if you don't. */
#undef HAVE_DECL_MP_GET_MEMORY_FUNCTIONS
/* Define to 1 if you have the declaration of `snprintf', and to 0 if you
don't. */
#undef HAVE_DECL_SNPRINTF
/* Define to 1 if you have the declaration of `strcasecmp', and to 0 if you
don't. */
#undef HAVE_DECL_STRCASECMP
/* Define to 1 if you have the declaration of `strncasecmp', and to 0 if you
don't. */
#undef HAVE_DECL_STRNCASECMP
/* Define to 1 if you have the declaration of `_BitScanForward', and to 0 if
you don't. */
#undef HAVE_DECL__BITSCANFORWARD
/* Define to 1 if you have the declaration of `_snprintf', and to 0 if you
don't. */
#undef HAVE_DECL__SNPRINTF
/* Define to 1 if you have the declaration of `_stricmp', and to 0 if you
don't. */
#undef HAVE_DECL__STRICMP
/* Define to 1 if you have the declaration of `_strnicmp', and to 0 if you
don't. */
#undef HAVE_DECL__STRNICMP
/* Define to 1 if you have the declaration of `__builtin_ffs', and to 0 if you
don't. */
#undef HAVE_DECL___BUILTIN_FFS

View File

@ -2,10 +2,35 @@
#define __attribute__(x)
#endif
#if HAVE_DECL_FFS
#include <strings.h>
#endif
#if (HAVE_DECL_FFS==0) && (HAVE_DECL___BUILTIN_FFS==1)
#define ffs __builtin_ffs
#endif
#if !HAVE_DECL_FFS && !HAVE_DECL___BUILTIN_FFS && HAVE_DECL__BITSCANFORWARD
int isl_ffs(int i);
#define ffs isl_ffs
#endif
#if HAVE_DECL_STRCASECMP || HAVE_DECL_STRNCASECMP
#include <strings.h>
#endif
#if !HAVE_DECL_STRCASECMP && HAVE_DECL__STRICMP
#define strcasecmp _stricmp
#endif
#if !HAVE_DECL_STRNCASECMP && HAVE_DECL__STRNICMP
#define strncasecmp _strnicmp
#endif
#if !HAVE_DECL_SNPRINTF && HAVE_DECL__SNPRINTF
#define snprintf _snprintf
#endif
#ifdef GCC_WARN_UNUSED_RESULT
#define WARN_UNUSED GCC_WARN_UNUSED_RESULT
#else

24
polly/lib/External/isl/isl_ffs.c vendored Normal file
View File

@ -0,0 +1,24 @@
#include <isl_config.h>
#if !HAVE_DECL_FFS && !HAVE_DECL___BUILTIN_FFS && HAVE_DECL__BITSCANFORWARD
#include <intrin.h>
/* Implementation of ffs in terms of _BitScanForward.
*
* ffs returns the position of the least significant bit set in i,
* with the least significant bit is position 1, or 0 if not bits are set.
*
* _BitScanForward returns 1 if mask is non-zero and sets index
* to the position of the least significant bit set in i,
* with the least significant bit is position 0.
*/
int isl_ffs(int i)
{
unsigned char non_zero;
unsigned long index, mask = i;
non_zero = _BitScanForward(&index, mask);
return non_zero ? 1 + index : 0;
}
#endif

View File

@ -8,7 +8,6 @@
*/
#include <stdlib.h>
#include <strings.h>
#include <isl/hash.h>
#include <isl/ctx.h>
#include "isl_config.h"

View File

@ -1,4 +1,4 @@
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <isl_int.h>

View File

@ -9832,6 +9832,28 @@ isl_stat isl_set_foreach_basic_set(__isl_keep isl_set *set,
return isl_stat_ok;
}
/* Return a list of basic sets, the union of which is equal to "set".
*/
__isl_give isl_basic_set_list *isl_set_get_basic_set_list(
__isl_keep isl_set *set)
{
int i;
isl_basic_set_list *list;
if (!set)
return NULL;
list = isl_basic_set_list_alloc(isl_set_get_ctx(set), set->n);
for (i = 0; i < set->n; ++i) {
isl_basic_set *bset;
bset = isl_basic_set_copy(set->p[i]);
list = isl_basic_set_list_add(list, bset);
}
return list;
}
__isl_give isl_basic_set *isl_basic_set_lift(__isl_take isl_basic_set *bset)
{
isl_space *dim;

View File

@ -458,7 +458,7 @@ __isl_give isl_basic_map *isl_basic_map_reduce_coefficients(
__isl_take isl_basic_map *bmap);
__isl_give isl_basic_map *isl_basic_map_shift_div(
__isl_take isl_basic_map *bmap, int div, isl_int shift);
__isl_take isl_basic_map *bmap, int div, int pos, isl_int shift);
__isl_give isl_basic_map_list *isl_map_get_basic_map_list(
__isl_keep isl_map *map);

View File

@ -12,7 +12,6 @@
* B.P. 105 - 78153 Le Chesnay, France
*/
#include <strings.h>
#include <isl_ctx_private.h>
#include <isl_map_private.h>
#include "isl_equalities.h"
@ -376,6 +375,80 @@ struct isl_basic_set *isl_basic_set_normalize_constraints(
(struct isl_basic_map *)bset);
}
/* Assuming the variable at position "pos" has an integer coefficient
* in integer division "div", extract it from this integer division.
* "pos" is as determined by isl_basic_map_offset, i.e., pos == 0
* corresponds to the constant term.
*
* That is, the integer division is of the form
*
* floor((... + c * d * x_pos + ...)/d)
*
* Replace it by
*
* floor((... + 0 * x_pos + ...)/d) + c * x_pos
*/
static __isl_give isl_basic_map *remove_var_from_div(
__isl_take isl_basic_map *bmap, int div, int pos)
{
isl_int shift;
isl_int_init(shift);
isl_int_divexact(shift, bmap->div[div][1 + pos], bmap->div[div][0]);
isl_int_neg(shift, shift);
bmap = isl_basic_map_shift_div(bmap, div, pos, shift);
isl_int_clear(shift);
return bmap;
}
/* Check if integer division "div" has any integral coefficient
* (or constant term). If so, extract them from the integer division.
*/
static __isl_give isl_basic_map *remove_independent_vars_from_div(
__isl_take isl_basic_map *bmap, int div)
{
int i;
unsigned total = 1 + isl_basic_map_total_dim(bmap);
for (i = 0; i < total; ++i) {
if (isl_int_is_zero(bmap->div[div][1 + i]))
continue;
if (!isl_int_is_divisible_by(bmap->div[div][1 + i],
bmap->div[div][0]))
continue;
bmap = remove_var_from_div(bmap, div, i);
if (!bmap)
break;
}
return bmap;
}
/* Check if any known integer division has any integral coefficient
* (or constant term). If so, extract them from the integer division.
*/
static __isl_give isl_basic_map *remove_independent_vars_from_divs(
__isl_take isl_basic_map *bmap)
{
int i;
if (!bmap)
return NULL;
if (bmap->n_div == 0)
return bmap;
for (i = 0; i < bmap->n_div; ++i) {
if (isl_int_is_zero(bmap->div[i][0]))
continue;
bmap = remove_independent_vars_from_div(bmap, i);
if (!bmap)
break;
}
return bmap;
}
/* Remove any common factor in numerator and denominator of the div expression,
* not taking into account the constant term.
* That is, if the div is of the form
@ -1319,6 +1392,7 @@ struct isl_basic_map *isl_basic_map_simplify(struct isl_basic_map *bmap)
if (isl_basic_map_plain_is_empty(bmap))
break;
bmap = isl_basic_map_normalize_constraints(bmap);
bmap = remove_independent_vars_from_divs(bmap);
bmap = normalize_div_expressions(bmap);
bmap = remove_duplicate_divs(bmap, &progress);
bmap = eliminate_unit_divs(bmap, &progress);
@ -3479,7 +3553,10 @@ error:
return isl_basic_map_free(bmap);
}
/* Shift the integer division at position "div" of "bmap" by "shift".
/* Shift the integer division at position "div" of "bmap"
* by "shift" times the variable at position "pos".
* "pos" is as determined by isl_basic_map_offset, i.e., pos == 0
* corresponds to the constant term.
*
* That is, if the integer division has the form
*
@ -3487,10 +3564,10 @@ error:
*
* then replace it by
*
* floor((f(x) + shift * d)/d) - shift
* floor((f(x) + shift * d * x_pos)/d) - shift * x_pos
*/
__isl_give isl_basic_map *isl_basic_map_shift_div(
__isl_take isl_basic_map *bmap, int div, isl_int shift)
__isl_take isl_basic_map *bmap, int div, int pos, isl_int shift)
{
int i;
unsigned total;
@ -3501,18 +3578,18 @@ __isl_give isl_basic_map *isl_basic_map_shift_div(
total = isl_basic_map_dim(bmap, isl_dim_all);
total -= isl_basic_map_dim(bmap, isl_dim_div);
isl_int_addmul(bmap->div[div][1], shift, bmap->div[div][0]);
isl_int_addmul(bmap->div[div][1 + pos], shift, bmap->div[div][0]);
for (i = 0; i < bmap->n_eq; ++i) {
if (isl_int_is_zero(bmap->eq[i][1 + total + div]))
continue;
isl_int_submul(bmap->eq[i][0],
isl_int_submul(bmap->eq[i][pos],
shift, bmap->eq[i][1 + total + div]);
}
for (i = 0; i < bmap->n_ineq; ++i) {
if (isl_int_is_zero(bmap->ineq[i][1 + total + div]))
continue;
isl_int_submul(bmap->ineq[i][0],
isl_int_submul(bmap->ineq[i][pos],
shift, bmap->ineq[i][1 + total + div]);
}
for (i = 0; i < bmap->n_div; ++i) {
@ -3520,7 +3597,7 @@ __isl_give isl_basic_map *isl_basic_map_shift_div(
continue;
if (isl_int_is_zero(bmap->div[i][1 + 1 + total + div]))
continue;
isl_int_submul(bmap->div[i][1],
isl_int_submul(bmap->div[i][1 + pos],
shift, bmap->div[i][1 + 1 + total + div]);
}

View File

@ -869,6 +869,30 @@ __isl_give MULTI(BASE) *FN(MULTI(BASE),range_factor_range)(
return multi;
}
/* Given a function [B -> C], extract the function C.
*/
__isl_give MULTI(BASE) *FN(MULTI(BASE),factor_range)(
__isl_take MULTI(BASE) *multi)
{
isl_space *space;
int total, keep;
if (!multi)
return NULL;
if (!isl_space_is_wrapping(multi->space))
isl_die(FN(MULTI(BASE),get_ctx)(multi), isl_error_invalid,
"not a product", return FN(MULTI(BASE),free)(multi));
space = FN(MULTI(BASE),get_space)(multi);
total = isl_space_dim(space, isl_dim_out);
space = isl_space_factor_range(space);
keep = isl_space_dim(space, isl_dim_out);
multi = FN(MULTI(BASE),drop_dims)(multi, isl_dim_out, 0, total - keep);
multi = FN(MULTI(BASE),reset_space)(multi, space);
return multi;
}
#ifndef NO_PRODUCT
/* Given two MULTI(BASE)s A -> B and C -> D,
* construct a MULTI(BASE) [A -> C] -> [B -> D].
@ -1092,6 +1116,25 @@ error:
return NULL;
}
/* Add "multi2" from "multi1" and return the result.
*
* The parameters of "multi1" and "multi2" are assumed to have been aligned.
*/
static __isl_give MULTI(BASE) *FN(MULTI(BASE),add_aligned)(
__isl_take MULTI(BASE) *multi1, __isl_take MULTI(BASE) *multi2)
{
return FN(MULTI(BASE),bin_op)(multi1, multi2, &FN(EL,add));
}
/* Add "multi2" from "multi1" and return the result.
*/
__isl_give MULTI(BASE) *FN(MULTI(BASE),add)(__isl_take MULTI(BASE) *multi1,
__isl_take MULTI(BASE) *multi2)
{
return FN(MULTI(BASE),align_params_multi_multi_and)(multi1, multi2,
&FN(MULTI(BASE),add_aligned));
}
/* Subtract "multi2" from "multi1" and return the result.
*
* The parameters of "multi1" and "multi2" are assumed to have been aligned.

View File

@ -137,16 +137,24 @@ error:
return -2;
}
static __isl_give isl_qpolynomial *bound2poly(__isl_take isl_constraint *bound,
__isl_take isl_space *dim, unsigned pos, int sign)
/* Return a positive ("sign" > 0) or negative ("sign" < 0) infinite polynomial
* with domain space "space".
*/
static __isl_give isl_qpolynomial *signed_infty(__isl_take isl_space *space,
int sign)
{
if (!bound) {
if (sign > 0)
return isl_qpolynomial_infty_on_domain(dim);
else
return isl_qpolynomial_neginfty_on_domain(dim);
}
isl_space_free(dim);
if (sign > 0)
return isl_qpolynomial_infty_on_domain(space);
else
return isl_qpolynomial_neginfty_on_domain(space);
}
static __isl_give isl_qpolynomial *bound2poly(__isl_take isl_constraint *bound,
__isl_take isl_space *space, unsigned pos, int sign)
{
if (!bound)
return signed_infty(space, sign);
isl_space_free(space);
return isl_qpolynomial_from_constraint(bound, isl_dim_set, pos);
}
@ -270,6 +278,52 @@ static isl_stat add_guarded_poly(__isl_take isl_basic_set *bset,
return isl_stat_ok;
}
/* Plug in "sub" for the variable at position "pos" in "poly".
*
* If "sub" is an infinite polynomial and if the variable actually
* appears in "poly", then calling isl_qpolynomial_substitute
* to perform the substitution may result in a NaN result.
* In such cases, return positive or negative infinity instead,
* depending on whether an upper bound or a lower bound is being computed,
* and mark the result as not being tight.
*/
static __isl_give isl_qpolynomial *plug_in_at_pos(
__isl_take isl_qpolynomial *poly, int pos,
__isl_take isl_qpolynomial *sub, struct range_data *data)
{
isl_bool involves, infty;
involves = isl_qpolynomial_involves_dims(poly, isl_dim_in, pos, 1);
if (involves < 0)
goto error;
if (!involves) {
isl_qpolynomial_free(sub);
return poly;
}
infty = isl_qpolynomial_is_infty(sub);
if (infty >= 0 && !infty)
infty = isl_qpolynomial_is_neginfty(sub);
if (infty < 0)
goto error;
if (infty) {
isl_space *space = isl_qpolynomial_get_domain_space(poly);
data->tight = 0;
isl_qpolynomial_free(poly);
isl_qpolynomial_free(sub);
return signed_infty(space, data->sign);
}
poly = isl_qpolynomial_substitute(poly, isl_dim_in, pos, 1, &sub);
isl_qpolynomial_free(sub);
return poly;
error:
isl_qpolynomial_free(poly);
isl_qpolynomial_free(sub);
return NULL;
}
/* Given a lower and upper bound on the final variable and constraints
* on the remaining variables where these bounds are active,
* eliminate the variable from data->poly based on these bounds.
@ -312,10 +366,8 @@ static isl_stat propagate_on_bound_pair(__isl_take isl_constraint *lower,
isl_constraint_free(upper);
}
poly = isl_qpolynomial_copy(data->poly);
poly = isl_qpolynomial_substitute(poly, isl_dim_in, nvar, 1, &sub);
poly = plug_in_at_pos(poly, nvar, sub, data);
poly = isl_qpolynomial_drop_dims(poly, isl_dim_in, nvar, 1);
isl_qpolynomial_free(sub);
} else {
isl_qpolynomial *l, *u;
isl_qpolynomial *pos, *neg;
@ -331,14 +383,11 @@ static isl_stat propagate_on_bound_pair(__isl_take isl_constraint *lower,
pos = isl_qpolynomial_terms_of_sign(data->poly, data->signs, sign);
neg = isl_qpolynomial_terms_of_sign(data->poly, data->signs, -sign);
pos = isl_qpolynomial_substitute(pos, isl_dim_in, nvar, 1, &u);
neg = isl_qpolynomial_substitute(neg, isl_dim_in, nvar, 1, &l);
pos = plug_in_at_pos(pos, nvar, u, data);
neg = plug_in_at_pos(neg, nvar, l, data);
poly = isl_qpolynomial_add(pos, neg);
poly = isl_qpolynomial_drop_dims(poly, isl_dim_in, nvar, 1);
isl_qpolynomial_free(u);
isl_qpolynomial_free(l);
}
if (isl_basic_set_dim(bset, isl_dim_set) == 0)

View File

@ -950,6 +950,61 @@ error:
return NULL;
}
/* Reduce the partial schedule of "band" modulo the factors in "mv".
*/
__isl_give isl_schedule_band *isl_schedule_band_mod(
__isl_take isl_schedule_band *band, __isl_take isl_multi_val *mv)
{
band = isl_schedule_band_cow(band);
if (!band || !mv)
goto error;
band->mupa = isl_multi_union_pw_aff_mod_multi_val(band->mupa, mv);
if (!band->mupa)
return isl_schedule_band_free(band);
return band;
error:
isl_schedule_band_free(band);
isl_multi_val_free(mv);
return NULL;
}
/* Shift the partial schedule of "band" by "shift" after checking
* that the domain of the partial schedule would not be affected
* by this shift.
*/
__isl_give isl_schedule_band *isl_schedule_band_shift(
__isl_take isl_schedule_band *band,
__isl_take isl_multi_union_pw_aff *shift)
{
isl_union_set *dom1, *dom2;
isl_bool subset;
band = isl_schedule_band_cow(band);
if (!band || !shift)
goto error;
dom1 = isl_multi_union_pw_aff_domain(
isl_multi_union_pw_aff_copy(band->mupa));
dom2 = isl_multi_union_pw_aff_domain(
isl_multi_union_pw_aff_copy(shift));
subset = isl_union_set_is_subset(dom1, dom2);
isl_union_set_free(dom1);
isl_union_set_free(dom2);
if (subset < 0)
goto error;
if (!subset)
isl_die(isl_schedule_band_get_ctx(band), isl_error_invalid,
"domain of shift needs to include domain of "
"partial schedule", goto error);
band->mupa = isl_multi_union_pw_aff_add(band->mupa, shift);
if (!band->mupa)
return isl_schedule_band_free(band);
return band;
error:
isl_schedule_band_free(band);
isl_multi_union_pw_aff_free(shift);
return NULL;
}
/* Given the schedule of a band, construct the corresponding
* schedule for the tile loops based on the given tile sizes
* and return the result.

View File

@ -94,11 +94,16 @@ __isl_give isl_schedule_band *isl_schedule_band_scale(
__isl_take isl_schedule_band *band, __isl_take isl_multi_val *mv);
__isl_give isl_schedule_band *isl_schedule_band_scale_down(
__isl_take isl_schedule_band *band, __isl_take isl_multi_val *mv);
__isl_give isl_schedule_band *isl_schedule_band_mod(
__isl_take isl_schedule_band *band, __isl_take isl_multi_val *mv);
__isl_give isl_schedule_band *isl_schedule_band_tile(
__isl_take isl_schedule_band *band, __isl_take isl_multi_val *sizes);
__isl_give isl_schedule_band *isl_schedule_band_point(
__isl_take isl_schedule_band *band, __isl_keep isl_schedule_band *tile,
__isl_take isl_multi_val *sizes);
__isl_give isl_schedule_band *isl_schedule_band_shift(
__isl_take isl_schedule_band *band,
__isl_take isl_multi_union_pw_aff *shift);
__isl_give isl_schedule_band *isl_schedule_band_drop(
__isl_take isl_schedule_band *band, int pos, int n);
__isl_give isl_schedule_band *isl_schedule_band_gist(

View File

@ -1764,6 +1764,91 @@ error:
return NULL;
}
/* Reduce the partial schedule of the band node "node"
* modulo the factors in "mv".
*/
__isl_give isl_schedule_node *isl_schedule_node_band_mod(
__isl_take isl_schedule_node *node, __isl_take isl_multi_val *mv)
{
isl_schedule_tree *tree;
isl_bool anchored;
if (!node || !mv)
goto error;
if (check_space_multi_val(node, mv) < 0)
goto error;
anchored = isl_schedule_node_is_subtree_anchored(node);
if (anchored < 0)
goto error;
if (anchored)
isl_die(isl_schedule_node_get_ctx(node), isl_error_invalid,
"cannot perform mod on band node with anchored subtree",
goto error);
tree = isl_schedule_node_get_tree(node);
tree = isl_schedule_tree_band_mod(tree, mv);
return isl_schedule_node_graft_tree(node, tree);
error:
isl_multi_val_free(mv);
isl_schedule_node_free(node);
return NULL;
}
/* Make sure that that spaces of "node" and "mupa" are the same.
* Return isl_stat_error on error, reporting the error to the user.
*/
static isl_stat check_space_multi_union_pw_aff(
__isl_keep isl_schedule_node *node,
__isl_keep isl_multi_union_pw_aff *mupa)
{
isl_space *node_space, *mupa_space;
isl_bool equal;
node_space = isl_schedule_node_band_get_space(node);
mupa_space = isl_multi_union_pw_aff_get_space(mupa);
equal = isl_space_tuple_is_equal(node_space, isl_dim_set,
mupa_space, isl_dim_set);
isl_space_free(mupa_space);
isl_space_free(node_space);
if (equal < 0)
return isl_stat_error;
if (!equal)
isl_die(isl_schedule_node_get_ctx(node), isl_error_invalid,
"spaces don't match", return isl_stat_error);
return isl_stat_ok;
}
/* Shift the partial schedule of the band node "node" by "shift".
*/
__isl_give isl_schedule_node *isl_schedule_node_band_shift(
__isl_take isl_schedule_node *node,
__isl_take isl_multi_union_pw_aff *shift)
{
isl_schedule_tree *tree;
int anchored;
if (!node || !shift)
goto error;
if (check_space_multi_union_pw_aff(node, shift) < 0)
goto error;
anchored = isl_schedule_node_is_subtree_anchored(node);
if (anchored < 0)
goto error;
if (anchored)
isl_die(isl_schedule_node_get_ctx(node), isl_error_invalid,
"cannot shift band node with anchored subtree",
goto error);
tree = isl_schedule_node_get_tree(node);
tree = isl_schedule_tree_band_shift(tree, shift);
return isl_schedule_node_graft_tree(node, tree);
error:
isl_multi_union_pw_aff_free(shift);
isl_schedule_node_free(node);
return NULL;
}
/* Tile "node" with tile sizes "sizes".
*
* The current node is replaced by two nested nodes corresponding

View File

@ -2032,6 +2032,60 @@ error:
return NULL;
}
/* Reduce the partial schedule of the band root node of "tree"
* modulo the factors in "mv".
*/
__isl_give isl_schedule_tree *isl_schedule_tree_band_mod(
__isl_take isl_schedule_tree *tree, __isl_take isl_multi_val *mv)
{
if (!tree || !mv)
goto error;
if (tree->type != isl_schedule_node_band)
isl_die(isl_schedule_tree_get_ctx(tree), isl_error_invalid,
"not a band node", goto error);
tree = isl_schedule_tree_cow(tree);
if (!tree)
goto error;
tree->band = isl_schedule_band_mod(tree->band, mv);
if (!tree->band)
return isl_schedule_tree_free(tree);
return tree;
error:
isl_schedule_tree_free(tree);
isl_multi_val_free(mv);
return NULL;
}
/* Shift the partial schedule of the band root node of "tree" by "shift".
*/
__isl_give isl_schedule_tree *isl_schedule_tree_band_shift(
__isl_take isl_schedule_tree *tree,
__isl_take isl_multi_union_pw_aff *shift)
{
if (!tree || !shift)
goto error;
if (tree->type != isl_schedule_node_band)
isl_die(isl_schedule_tree_get_ctx(tree), isl_error_invalid,
"not a band node", goto error);
tree = isl_schedule_tree_cow(tree);
if (!tree)
goto error;
tree->band = isl_schedule_band_shift(tree->band, shift);
if (!tree->band)
return isl_schedule_tree_free(tree);
return tree;
error:
isl_schedule_tree_free(tree);
isl_multi_union_pw_aff_free(shift);
return NULL;
}
/* Given two trees with sequence roots, replace the child at position
* "pos" of "tree" with the children of "child".
*/

View File

@ -223,8 +223,13 @@ __isl_give isl_schedule_tree *isl_schedule_tree_band_scale(
__isl_take isl_schedule_tree *tree, __isl_take isl_multi_val *mv);
__isl_give isl_schedule_tree *isl_schedule_tree_band_scale_down(
__isl_take isl_schedule_tree *tree, __isl_take isl_multi_val *mv);
__isl_give isl_schedule_tree *isl_schedule_tree_band_mod(
__isl_take isl_schedule_tree *tree, __isl_take isl_multi_val *mv);
__isl_give isl_schedule_tree *isl_schedule_tree_band_tile(
__isl_take isl_schedule_tree *tree, __isl_take isl_multi_val *sizes);
__isl_give isl_schedule_tree *isl_schedule_tree_band_shift(
__isl_take isl_schedule_tree *tree,
__isl_take isl_multi_union_pw_aff *shift);
__isl_give isl_schedule_tree *isl_schedule_tree_band_split(
__isl_take isl_schedule_tree *tree, int pos);
__isl_give isl_schedule_tree *isl_schedule_tree_band_gist(

View File

@ -1288,15 +1288,6 @@ __isl_give isl_space *isl_space_factor_domain(__isl_take isl_space *space)
return space;
}
/* Given a space of the form [A -> B] -> [C -> D], return the space B -> D.
*/
__isl_give isl_space *isl_space_factor_range(__isl_take isl_space *space)
{
space = isl_space_domain_factor_range(space);
space = isl_space_range_factor_range(space);
return space;
}
/* Given a space of the form [A -> B] -> C, return the space A -> C.
*/
__isl_give isl_space *isl_space_domain_factor_domain(
@ -1413,19 +1404,18 @@ error:
return NULL;
}
/* Given a space of the form A -> [B -> C], return the space A -> C.
/* Internal function that selects the range of the map that is
* embedded in either a set space or the range of a map space.
* In particular, given a space of the form [A -> B], return the space B.
* Given a space of the form A -> [B -> C], return the space A -> C.
*/
__isl_give isl_space *isl_space_range_factor_range(
__isl_take isl_space *space)
static __isl_give isl_space *range_factor_range(__isl_take isl_space *space)
{
isl_space *nested;
isl_space *range;
if (!space)
return NULL;
if (!isl_space_range_is_wrapping(space))
isl_die(isl_space_get_ctx(space), isl_error_invalid,
"range not a product", return isl_space_free(space));
nested = space->nested[1];
range = isl_space_copy(space);
@ -1451,6 +1441,47 @@ error:
return NULL;
}
/* Given a space of the form A -> [B -> C], return the space A -> C.
*/
__isl_give isl_space *isl_space_range_factor_range(
__isl_take isl_space *space)
{
if (!space)
return NULL;
if (!isl_space_range_is_wrapping(space))
isl_die(isl_space_get_ctx(space), isl_error_invalid,
"range not a product", return isl_space_free(space));
return range_factor_range(space);
}
/* Given a space of the form [A -> B], return the space B.
*/
static __isl_give isl_space *set_factor_range(__isl_take isl_space *space)
{
if (!space)
return NULL;
if (!isl_space_is_wrapping(space))
isl_die(isl_space_get_ctx(space), isl_error_invalid,
"not a product", return isl_space_free(space));
return range_factor_range(space);
}
/* Given a space of the form [A -> B] -> [C -> D], return the space B -> D.
* Given a space of the form [A -> B], return the space B.
*/
__isl_give isl_space *isl_space_factor_range(__isl_take isl_space *space)
{
if (!space)
return NULL;
if (isl_space_is_set(space))
return set_factor_range(space);
space = isl_space_domain_factor_range(space);
space = isl_space_range_factor_range(space);
return space;
}
__isl_give isl_space *isl_space_map_from_set(__isl_take isl_space *dim)
{
isl_ctx *ctx;

View File

@ -9,7 +9,6 @@
#include <ctype.h>
#include <string.h>
#include <strings.h>
#include <isl/ctx.h>
#include <isl_stream_private.h>
#include <isl/map.h>

View File

@ -2606,33 +2606,30 @@ static int test_union(isl_ctx *ctx)
/* Check that computing a bound of a non-zero polynomial over an unbounded
* domain does not produce a rational value.
* Ideally, we want the value to be infinity, but we accept NaN for now.
* We certainly do not want to obtain the value zero.
* In particular, check that the upper bound is infinity.
*/
static int test_bound_unbounded_domain(isl_ctx *ctx)
{
const char *str;
isl_set *dom;
isl_point *pnt;
isl_pw_qpolynomial *pwqp;
isl_pw_qpolynomial_fold *pwf;
isl_val *v;
int is_rat;
isl_pw_qpolynomial_fold *pwf, *pwf2;
isl_bool equal;
str = "{ [m,n] -> -m * n }";
pwqp = isl_pw_qpolynomial_read_from_str(ctx, str);
pwf = isl_pw_qpolynomial_bound(pwqp, isl_fold_max, NULL);
dom = isl_pw_qpolynomial_fold_domain(isl_pw_qpolynomial_fold_copy(pwf));
pnt = isl_set_sample_point(dom);
v = isl_pw_qpolynomial_fold_eval(pwf, pnt);
is_rat = isl_val_is_rat(v);
isl_val_free(v);
str = "{ infty }";
pwqp = isl_pw_qpolynomial_read_from_str(ctx, str);
pwf2 = isl_pw_qpolynomial_bound(pwqp, isl_fold_max, NULL);
equal = isl_pw_qpolynomial_fold_plain_is_equal(pwf, pwf2);
isl_pw_qpolynomial_fold_free(pwf);
isl_pw_qpolynomial_fold_free(pwf2);
if (is_rat < 0)
if (equal < 0)
return -1;
if (is_rat)
if (!equal)
isl_die(ctx, isl_error_unknown,
"unexpected rational value", return -1);
"expecting infinite polynomial bound", return -1);
return 0;
}

View File

@ -75,12 +75,13 @@ static void int_test_single_value()
static void invoke_alternate_representations_2args(char *arg1, char *arg2,
void (*fn)(isl_int, isl_int))
{
int j;
isl_int int1, int2;
isl_int_init(int1);
isl_int_init(int2);
for (int j = 0; j < 4; ++j) {
for (j = 0; j < 4; ++j) {
isl_int_read(int1, arg1);
isl_int_read(int2, arg2);
@ -104,13 +105,14 @@ static void invoke_alternate_representations_2args(char *arg1, char *arg2,
static void invoke_alternate_representations_3args(char *arg1, char *arg2,
char *arg3, void (*fn)(isl_int, isl_int, isl_int))
{
int j;
isl_int int1, int2, int3;
isl_int_init(int1);
isl_int_init(int2);
isl_int_init(int3);
for (int j = 0; j < 8; ++j) {
for (j = 0; j < 8; ++j) {
isl_int_read(int1, arg1);
isl_int_read(int2, arg2);
isl_int_read(int3, arg3);

View File

@ -323,6 +323,20 @@ long isl_val_get_den_si(__isl_keep isl_val *v)
return isl_int_get_si(v->d);
}
/* Extract the denominator of a rational value "v" as an isl_val.
*
* If "v" is not a rational value, then the result is undefined.
*/
__isl_give isl_val *isl_val_get_den_val(__isl_keep isl_val *v)
{
if (!v)
return NULL;
if (!isl_val_is_rat(v))
isl_die(isl_val_get_ctx(v), isl_error_invalid,
"expecting rational value", return NULL);
return isl_val_int_from_isl_int(isl_val_get_ctx(v), v->d);
}
/* Return an approximation of "v" as a double.
*/
double isl_val_get_d(__isl_keep isl_val *v)

View File

@ -70,7 +70,7 @@
# compiler: $LTCC
# compiler flags: $LTCFLAGS
# linker: $LD (gnu? $with_gnu_ld)
# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.11
# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.10ubuntu1
# automake: $automake_version
# autoconf: $autoconf_version
#
@ -80,7 +80,7 @@
PROGRAM=libtool
PACKAGE=libtool
VERSION="2.4.2 Debian-2.4.2-1.11"
VERSION="2.4.2 Debian-2.4.2-1.10ubuntu1"
TIMESTAMP=""
package_revision=1.3337

0
polly/lib/External/isl/missing vendored Normal file → Executable file
View File

View File

@ -9,7 +9,6 @@
#include <assert.h>
#include <string.h>
#include <strings.h>
#include <isl_map_private.h>
#include <isl/aff.h>
#include <isl/set.h>
@ -22,6 +21,7 @@
#include <isl_point_private.h>
#include <isl_vec_private.h>
#include <isl/options.h>
#include <isl_config.h>
/* The input of this program is the same as that of the "example" program
* from the PipLib distribution, except that the "big parameter column"

0
polly/lib/External/isl/test-driver vendored Normal file → Executable file
View File

View File

@ -86,13 +86,13 @@
S1(c0, c1, c2);
}
if (c0 >= 79 && c0 % 14 >= 9) {
for (int c2 = max((c0 - 70) / 14 + 24, (c0 - 70) / 14 - (3 * c0 + 14) / 14 + 49); c2 <= (c0 - 70) / 14 - (3 * c0 + 17) / 14 + 56; c2 += 1)
for (int c2 = max(c0 / 14 + 19, -((3 * c0 + 14) / 14) + c0 / 14 + 44); c2 <= -((3 * c0 + 17) / 14) + c0 / 14 + 51; c2 += 1)
S1(c0, c0 / 14 - 5, c2);
} else if (c0 <= 69 && c0 % 14 >= 9) {
if (c0 <= 41)
S7(c0, -3, 6);
S6(c0, c0 / 14 - 5, 8);
for (int c2 = -((-c0 + 83) / 14) - (3 * c0 + 14) / 14 + 49; c2 <= -((-c0 + 83) / 14) - (3 * c0 + 17) / 14 + 56; c2 += 1)
for (int c2 = -((3 * c0 + 14) / 14) + c0 / 14 + 44; c2 <= -((3 * c0 + 17) / 14) + c0 / 14 + 51; c2 += 1)
S1(c0, c0 / 14 - 5, c2);
}
for (int c1 = (c0 + 5) / 14 - 5; c1 < 0; c1 += 1) {

View File

@ -0,0 +1,34 @@
{
for (int c0 = 0; c0 < n - 31; c0 += 32)
for (int c1 = 0; c1 <= n; c1 += 32) {
if (n >= c1 + 32) {
for (int c2 = 0; c2 <= 31; c2 += 1)
for (int c3 = 0; c3 <= 31; c3 += 1)
S_1(c0 + c2, c1 + c3);
} else
for (int c2 = 0; c2 <= 31; c2 += 1) {
for (int c3 = 0; c3 < n - c1; c3 += 1)
S_1(c0 + c2, c1 + c3);
S_2(c0 + c2);
}
}
if (n >= 32) {
for (int c1 = 0; c1 < n; c1 += 32) {
if (n >= c1 + 32) {
for (int c2 = 0; c2 < n % 32; c2 += 1)
for (int c3 = 0; c3 <= 31; c3 += 1)
S_1(-((n - 1) % 32) + n + c2 - 1, c1 + c3);
} else
for (int c2 = 0; c2 < n - c1; c2 += 1) {
for (int c3 = 0; c3 < n - c1; c3 += 1)
S_1(c1 + c2, c1 + c3);
S_2(c1 + c2);
}
}
} else
for (int c2 = 0; c2 < n; c2 += 1) {
for (int c3 = 0; c3 < n; c3 += 1)
S_1(c2, c3);
S_2(c2);
}
}

View File

@ -0,0 +1,16 @@
# Check that no expressions of the form ((-n + 2147483648) % 32) are produced.
domain: "[n] -> { S_2[i] : i >= 0 and i <= -1 + n; S_1[i, j] : j >= 0 and j <= -1 + n and i >= 0 and i <= -1 + n }"
child:
context: "[n] -> { [] : n <= 2147483647 and n >= 0 }"
child:
schedule: "[n] -> [{ S_1[i, j] -> [(32*floor((i)/32))]; S_2[i] -> [(32*floor((i)/32))] }, { S_1[i, j] -> [(32*floor((j)/32))]; S_2[i] -> [(32*floor((n)/32))] }]"
permutable: 1
options: "[n] -> { atomic[i0] : i0 >= 0 and i0 <= 1; isolate[[] -> [i0, i1]] : (exists (e0 = floor((i0)/32), e1 = floor((i1)/32): 32e0 = i0 and 32e1 = i1 and i0 >= 0 and i0 <= -32 + n and i1 >= 0 and i1 <= n)) or (exists (e0 = floor((i0)/32), e1 = floor((i1)/32): 32e0 = i0 and 32e1 = i1 and i0 >= 0 and i0 <= -32 + n and i1 >= -31 + n and i1 <= -31 + 2n)) }"
child:
schedule: "[n] -> [{ S_1[i, j] -> [(i - 32*floor((i)/32))]; S_2[i] -> [(i - 32*floor((i)/32))] }, { S_1[i, j] -> [(j - 32*floor((j)/32))]; S_2[i] -> [(n - 32*floor((n)/32))] }]"
permutable: 1
options: "{ separate[i0] : i0 >= 0 and i0 <= 1 }"
child:
sequence:
- filter: "[n] -> { S_1[i, j] }"
- filter: "[n] -> { S_2[i] }"

View File

@ -6,6 +6,6 @@ for (int c0 = 1; c0 <= 15; c0 += 1) {
s2(c0);
s1(c0);
}
if (((-exprVar1 + 15) % 8) + c0 <= 15 || (c0 >= exprVar1 + 1 && (exprVar1 - c0 + 1) % 8 == 0))
if (((-exprVar1 + 15) % 8) + c0 <= 15 || (c0 >= 9 && (exprVar1 - c0 + 1) % 8 == 0))
s5(c0);
}

View File

@ -4,7 +4,7 @@
write_shared_A(3, (-t1 / 3) + 4, t2 + 32);
{
int c3 = t2 >= 2 && ((t1 + 3) % 4) + 1 >= t2 ? t2 + 32 : ((t2 + 30) % 32) + 2;
if (c3 == t2 + 32 || (c3 == t2 && t2 >= ((t1 + 3) % 4) + ((t2 - 1) % 2) + 2))
if (c3 == t2 + 32 || t2 >= ((t1 + 3) % 4) + ((t2 + 1) % 2) + 2)
write_shared_A(3, ((t1 + 3) % 4) + 5, c3);
}
if (t1 >= 1 && t2 >= t1 + 1 && t2 <= 4)
@ -14,7 +14,7 @@
write_shared_A(4, (-t1 / 3) + 4, t2 + 32);
{
int c3 = t2 >= 2 && ((t1 + 3) % 4) + 1 >= t2 ? t2 + 32 : ((t2 + 30) % 32) + 2;
if (c3 == t2 + 32 || (c3 == t2 && t2 >= ((t1 + 3) % 4) + ((t2 - 1) % 2) + 2))
if (c3 == t2 + 32 || t2 >= ((t1 + 3) % 4) + ((t2 + 1) % 2) + 2)
write_shared_A(4, ((t1 + 3) % 4) + 5, c3);
}
if (t1 >= 1 && t2 >= t1 + 1 && t2 <= 4)