From 1b8eb4104b6198785c164be4a451fc04e03bd371 Mon Sep 17 00:00:00 2001 From: Michael Kruse Date: Tue, 6 Dec 2016 14:37:39 +0000 Subject: [PATCH] Update to isl-0.17.1-314-g3106e8d This version includes an update for imath (isl-0.17.1-49-g2f1c129). It fixes the compilation under windows, which does not know ssize_t. In addition, isl-0.17.1-288-g0500299 changed the way isl_test finds the source directory. It now generates a file isl_srcdir.c at configure-time, containing the source path, to not require setting the environment variable "srcdir" at test-time. The cmake build system had to be modified to also generate that file. llvm-svn: 288811 --- polly/lib/External/CMakeLists.txt | 1 + polly/lib/External/isl/GIT_HEAD_ID | 2 +- polly/lib/External/isl/Makefile.in | 11 +- polly/lib/External/isl/bound_test.sh.in | 1 + polly/lib/External/isl/config.guess | 111 +++++++++---------- polly/lib/External/isl/config.sub | 20 ++-- polly/lib/External/isl/configure | 4 + polly/lib/External/isl/configure.ac | 1 + polly/lib/External/isl/doc/manual.pdf | Bin 475438 -> 475429 bytes polly/lib/External/isl/imath/gmp_compat.c | 5 + polly/lib/External/isl/include/isl/aff_type.h | 6 +- polly/lib/External/isl/include/isl/map.h | 1 + polly/lib/External/isl/isl_map.c | 66 +++++++++++ polly/lib/External/isl/isl_map_private.h | 3 + polly/lib/External/isl/isl_mat.c | 92 ++++++++++++++-- polly/lib/External/isl/isl_mat_private.h | 4 + polly/lib/External/isl/isl_polynomial.c | 134 ++++++++++++++++++----- polly/lib/External/isl/isl_polynomial_private.h | 3 + polly/lib/External/isl/isl_srcdir.c.in | 1 + polly/lib/External/isl/isl_test.c | 139 ++++++++++++++++++++++-- polly/lib/External/isl/isl_vertices.c | 24 ++-- polly/lib/External/isl/ltmain.sh | 6 +- polly/lib/External/isl/m4/libtool.m4 | 1 + polly/lib/External/isl/pip_test.sh.in | 1 + polly/lib/External/isl_srcdir.c.cmake | 1 + 25 files changed, 488 insertions(+), 150 deletions(-) create mode 100644 polly/lib/External/isl/isl_srcdir.c.in create mode 100644 polly/lib/External/isl_srcdir.c.cmake diff --git a/polly/lib/External/CMakeLists.txt b/polly/lib/External/CMakeLists.txt index 4309929..a89c7ad 100644 --- a/polly/lib/External/CMakeLists.txt +++ b/polly/lib/External/CMakeLists.txt @@ -165,6 +165,7 @@ configure_file("${ISL_BINARY_DIR}/include/isl/stdint.h.tmp" "${ISL_BINARY_DIR}/include/isl/stdint.h" COPYONLY) configure_file("isl_config.h.cmake" "${ISL_BINARY_DIR}/isl_config.h") +configure_file("isl_srcdir.c.cmake" "${ISL_BINARY_DIR}/isl_srcdir.c") include_directories(BEFORE ${ISL_BINARY_DIR} diff --git a/polly/lib/External/isl/GIT_HEAD_ID b/polly/lib/External/isl/GIT_HEAD_ID index bfe2020..7ec4914 100644 --- a/polly/lib/External/isl/GIT_HEAD_ID +++ b/polly/lib/External/isl/GIT_HEAD_ID @@ -1 +1 @@ -isl-0.17.1-284-gbb38638 +isl-0.17.1-314-g3106e8d diff --git a/polly/lib/External/isl/Makefile.in b/polly/lib/External/isl/Makefile.in index 7172201..342203d 100644 --- a/polly/lib/External/isl/Makefile.in +++ b/polly/lib/External/isl/Makefile.in @@ -134,7 +134,8 @@ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = isl_config.h -CONFIG_CLEAN_FILES = bound_test.sh codegen_test.sh pip_test.sh +CONFIG_CLEAN_FILES = isl_srcdir.c bound_test.sh codegen_test.sh \ + pip_test.sh CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ @@ -622,9 +623,9 @@ TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/bound_test.sh.in \ $(srcdir)/codegen_test.sh.in $(srcdir)/isl_config.h.in \ - $(srcdir)/pip_test.sh.in AUTHORS ChangeLog README compile \ - config.guess config.sub depcomp install-sh ltmain.sh missing \ - test-driver + $(srcdir)/isl_srcdir.c.in $(srcdir)/pip_test.sh.in AUTHORS \ + ChangeLog README compile config.guess config.sub depcomp \ + install-sh ltmain.sh missing test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -1215,6 +1216,8 @@ $(srcdir)/isl_config.h.in: $(am__configure_deps) distclean-hdr: -rm -f isl_config.h stamp-h1 +isl_srcdir.c: $(top_builddir)/config.status $(srcdir)/isl_srcdir.c.in + cd $(top_builddir) && $(SHELL) ./config.status $@ bound_test.sh: $(top_builddir)/config.status $(srcdir)/bound_test.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ codegen_test.sh: $(top_builddir)/config.status $(srcdir)/codegen_test.sh.in diff --git a/polly/lib/External/isl/bound_test.sh.in b/polly/lib/External/isl/bound_test.sh.in index e3fc037..8f2f1ff 100755 --- a/polly/lib/External/isl/bound_test.sh.in +++ b/polly/lib/External/isl/bound_test.sh.in @@ -1,6 +1,7 @@ #!/bin/sh EXEEXT=@EXEEXT@ +srcdir=@srcdir@ BOUND_TESTS="\ basicLinear2.pwqp \ diff --git a/polly/lib/External/isl/config.guess b/polly/lib/External/isl/config.guess index 0967f2a..1659250 100755 --- a/polly/lib/External/isl/config.guess +++ b/polly/lib/External/isl/config.guess @@ -1,8 +1,8 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2016 Free Software Foundation, Inc. +# Copyright 1992-2015 Free Software Foundation, Inc. -timestamp='2016-04-02' +timestamp='2015-08-20' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -27,7 +27,7 @@ timestamp='2016-04-02' # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches to . @@ -50,7 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2016 Free Software Foundation, Inc. +Copyright 1992-2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -237,10 +237,6 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; - *:LibertyBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE} - exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; @@ -272,42 +268,42 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") - UNAME_MACHINE=alpha ;; + UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") - UNAME_MACHINE=alpha ;; + UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") - UNAME_MACHINE=alpha ;; + UNAME_MACHINE="alpha" ;; "EV5 (21164)") - UNAME_MACHINE=alphaev5 ;; + UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") - UNAME_MACHINE=alphaev56 ;; + UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") - UNAME_MACHINE=alphapca56 ;; + UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") - UNAME_MACHINE=alphapca57 ;; + UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") - UNAME_MACHINE=alphaev6 ;; + UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") - UNAME_MACHINE=alphaev67 ;; + UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") - UNAME_MACHINE=alphaev68 ;; + UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") - UNAME_MACHINE=alphaev68 ;; + UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") - UNAME_MACHINE=alphaev68 ;; + UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") - UNAME_MACHINE=alphaev69 ;; + UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") - UNAME_MACHINE=alphaev7 ;; + UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") - UNAME_MACHINE=alphaev79 ;; + UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 @@ -380,16 +376,16 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build - SUN_ARCH=i386 + SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then - SUN_ARCH=x86_64 + SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` @@ -414,7 +410,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3 + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} @@ -639,13 +635,13 @@ EOF sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in - 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 - 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in - 32) HP_ARCH=hppa2.0n ;; - 64) HP_ARCH=hppa2.0w ;; - '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi @@ -684,11 +680,11 @@ EOF exit (0); } EOF - (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ ${HP_ARCH} = hppa2.0w ] + if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build @@ -701,12 +697,12 @@ EOF # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 - if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then - HP_ARCH=hppa2.0w + HP_ARCH="hppa2.0w" else - HP_ARCH=hppa64 + HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} @@ -811,14 +807,14 @@ EOF echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` - FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) @@ -900,7 +896,7 @@ EOF exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix @@ -923,7 +919,7 @@ EOF EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) @@ -969,9 +965,6 @@ EOF ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; - k1om:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; @@ -1127,7 +1120,7 @@ EOF # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configure will decide that + # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; @@ -1276,9 +1269,6 @@ EOF SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; - SX-ACE:SUPER-UX:*:*) - echo sxace-nec-superux${UNAME_RELEASE} - exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; @@ -1292,9 +1282,9 @@ EOF UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then - if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in @@ -1316,7 +1306,7 @@ EOF exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = x86; then + if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi @@ -1347,7 +1337,7 @@ EOF # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - if test "$cputype" = 386; then + if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" @@ -1389,7 +1379,7 @@ EOF echo i386-pc-xenix exit ;; i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'` + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos @@ -1400,9 +1390,6 @@ EOF x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; - amd64:Isilon\ OneFS:*:*) - echo x86_64-unknown-onefs - exit ;; esac cat >&2 <> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. diff --git a/polly/lib/External/isl/configure.ac b/polly/lib/External/isl/configure.ac index d948790..b6da64d 100644 --- a/polly/lib/External/isl/configure.ac +++ b/polly/lib/External/isl/configure.ac @@ -274,6 +274,7 @@ AX_DETECT_GIT_HEAD AH_BOTTOM([#include ]) AC_CONFIG_HEADERS(isl_config.h) +AC_CONFIG_FILES(isl_srcdir.c) AC_CONFIG_FILES(Makefile) AC_CONFIG_FILES(doc/Makefile) if test $with_clang = system; then diff --git a/polly/lib/External/isl/doc/manual.pdf b/polly/lib/External/isl/doc/manual.pdf index eb6e0771736c103906a80bfcad5688605a151243..fb5e04309033a168e912847962d603f047be6c07 100644 GIT binary patch delta 14292 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 #include +#if defined(_MSC_VER) +#include +typedef SSIZE_T ssize_t; +#endif + #ifdef NDEBUG #define CHECK(res) (res) #else diff --git a/polly/lib/External/isl/include/isl/aff_type.h b/polly/lib/External/isl/include/isl/aff_type.h index 9a618d6..6cffa18 100644 --- a/polly/lib/External/isl/include/isl/aff_type.h +++ b/polly/lib/External/isl/include/isl/aff_type.h @@ -12,7 +12,7 @@ typedef struct isl_aff isl_aff; ISL_DECLARE_LIST(aff) -struct __isl_subclass(isl_pw_multi_aff) __isl_subclass(isl_multi_pw_aff) +struct __isl_subclass(isl_multi_pw_aff) __isl_subclass(isl_pw_multi_aff) __isl_subclass(isl_union_pw_aff) isl_pw_aff; typedef struct isl_pw_aff isl_pw_aff; @@ -24,11 +24,11 @@ typedef struct isl_union_pw_aff isl_union_pw_aff; ISL_DECLARE_LIST_TYPE(union_pw_aff) -struct __isl_subclass(isl_pw_multi_aff) __isl_subclass(isl_multi_pw_aff) +struct __isl_subclass(isl_multi_pw_aff) __isl_subclass(isl_pw_multi_aff) isl_multi_aff; typedef struct isl_multi_aff isl_multi_aff; -struct __isl_subclass(isl_union_pw_multi_aff) __isl_subclass(isl_multi_pw_aff) +struct __isl_subclass(isl_multi_pw_aff) __isl_subclass(isl_union_pw_multi_aff) isl_pw_multi_aff; typedef struct isl_pw_multi_aff isl_pw_multi_aff; diff --git a/polly/lib/External/isl/include/isl/map.h b/polly/lib/External/isl/include/isl/map.h index 1598a14..9082a37 100644 --- a/polly/lib/External/isl/include/isl/map.h +++ b/polly/lib/External/isl/include/isl/map.h @@ -629,6 +629,7 @@ __isl_export isl_stat isl_map_foreach_basic_map(__isl_keep isl_map *map, isl_stat (*fn)(__isl_take isl_basic_map *bmap, void *user), void *user); +ISL_DEPRECATED __isl_give isl_map *isl_set_lifting(__isl_take isl_set *set); __isl_give isl_map *isl_map_fixed_power_val(__isl_take isl_map *map, diff --git a/polly/lib/External/isl/isl_map.c b/polly/lib/External/isl/isl_map.c index afc6fcd..27eff8e 100644 --- a/polly/lib/External/isl/isl_map.c +++ b/polly/lib/External/isl/isl_map.c @@ -13174,3 +13174,69 @@ __isl_give isl_set *isl_set_preimage_multi_pw_aff(__isl_take isl_set *set, { return isl_map_preimage_multi_pw_aff(set, isl_dim_set, mpa); } + +/* Is the point "inner" internal to inequality constraint "ineq" + * of "bset"? + * The point is considered to be internal to the inequality constraint, + * if it strictly lies on the positive side of the inequality constraint, + * or if it lies on the constraint and the constraint is lexico-positive. + */ +static isl_bool is_internal(__isl_keep isl_vec *inner, + __isl_keep isl_basic_set *bset, int ineq) +{ + isl_ctx *ctx; + int pos; + unsigned total; + + if (!inner || !bset) + return isl_bool_error; + + ctx = isl_basic_set_get_ctx(bset); + isl_seq_inner_product(inner->el, bset->ineq[ineq], inner->size, + &ctx->normalize_gcd); + if (!isl_int_is_zero(ctx->normalize_gcd)) + return isl_int_is_nonneg(ctx->normalize_gcd); + + total = isl_basic_set_dim(bset, isl_dim_all); + pos = isl_seq_first_non_zero(bset->ineq[ineq] + 1, total); + return isl_int_is_pos(bset->ineq[ineq][1 + pos]); +} + +/* Tighten the inequality constraints of "bset" that are outward with respect + * to the point "vec". + * That is, tighten the constraints that are not satisfied by "vec". + * + * "vec" is a point internal to some superset S of "bset" that is used + * to make the subsets of S disjoint, by tightening one half of the constraints + * that separate two subsets. In particular, the constraints of S + * are all satisfied by "vec" and should not be tightened. + * Of the internal constraints, those that have "vec" on the outside + * are tightened. The shared facet is included in the adjacent subset + * with the opposite constraint. + * For constraints that saturate "vec", this criterion cannot be used + * to determine which of the two sides should be tightened. + * Instead, the sign of the first non-zero coefficient is used + * to make this choice. Note that this second criterion is never used + * on the constraints of S since "vec" is interior to "S". + */ +__isl_give isl_basic_set *isl_basic_set_tighten_outward( + __isl_take isl_basic_set *bset, __isl_keep isl_vec *vec) +{ + int j; + + bset = isl_basic_set_cow(bset); + if (!bset) + return NULL; + for (j = 0; j < bset->n_ineq; ++j) { + isl_bool internal; + + internal = is_internal(vec, bset, j); + if (internal < 0) + return isl_basic_set_free(bset); + if (internal) + continue; + isl_int_sub_ui(bset->ineq[j][0], bset->ineq[j][0], 1); + } + + return bset; +} diff --git a/polly/lib/External/isl/isl_map_private.h b/polly/lib/External/isl/isl_map_private.h index 5b6b8d6..882faa4 100644 --- a/polly/lib/External/isl/isl_map_private.h +++ b/polly/lib/External/isl/isl_map_private.h @@ -253,6 +253,9 @@ __isl_give isl_basic_set *isl_basic_set_add_ineq(__isl_take isl_basic_set *bset, __isl_give isl_basic_map *isl_basic_map_add_ineq(__isl_take isl_basic_map *bmap, isl_int *ineq); +__isl_give isl_basic_set *isl_basic_set_tighten_outward( + __isl_take isl_basic_set *bset, __isl_keep isl_vec *vec); + int isl_inequality_negate(struct isl_basic_map *bmap, unsigned pos); struct isl_basic_set *isl_basic_set_cow(struct isl_basic_set *bset); diff --git a/polly/lib/External/isl/isl_mat.c b/polly/lib/External/isl/isl_mat.c index 1182ab0..f8bbe17 100644 --- a/polly/lib/External/isl/isl_mat.c +++ b/polly/lib/External/isl/isl_mat.c @@ -259,6 +259,18 @@ int isl_mat_cols(__isl_keep isl_mat *mat) return mat ? mat->n_col : -1; } +/* Check that "col" is a valid column position for "mat". + */ +static isl_stat check_col(__isl_keep isl_mat *mat, int col) +{ + if (!mat) + return isl_stat_error; + if (col < 0 || col >= mat->n_col) + isl_die(isl_mat_get_ctx(mat), isl_error_invalid, + "column out of range", return isl_stat_error); + return isl_stat_ok; +} + int isl_mat_get_element(__isl_keep isl_mat *mat, int row, int col, isl_int *v) { if (!mat) @@ -266,9 +278,8 @@ int isl_mat_get_element(__isl_keep isl_mat *mat, int row, int col, isl_int *v) if (row < 0 || row >= mat->n_row) isl_die(mat->ctx, isl_error_invalid, "row out of range", return -1); - if (col < 0 || col >= mat->n_col) - isl_die(mat->ctx, isl_error_invalid, "column out of range", - return -1); + if (check_col(mat, col) < 0) + return -1; isl_int_set(*v, mat->row[row][col]); return 0; } @@ -286,9 +297,8 @@ __isl_give isl_val *isl_mat_get_element_val(__isl_keep isl_mat *mat, if (row < 0 || row >= mat->n_row) isl_die(ctx, isl_error_invalid, "row out of range", return NULL); - if (col < 0 || col >= mat->n_col) - isl_die(ctx, isl_error_invalid, "column out of range", - return NULL); + if (check_col(mat, col) < 0) + return NULL; return isl_val_int_from_isl_int(ctx, mat->row[row][col]); } @@ -301,9 +311,8 @@ __isl_give isl_mat *isl_mat_set_element(__isl_take isl_mat *mat, if (row < 0 || row >= mat->n_row) isl_die(mat->ctx, isl_error_invalid, "row out of range", goto error); - if (col < 0 || col >= mat->n_col) - isl_die(mat->ctx, isl_error_invalid, "column out of range", - goto error); + if (check_col(mat, col) < 0) + return isl_mat_free(mat); isl_int_set(mat->row[row][col], v); return mat; error: @@ -320,9 +329,8 @@ __isl_give isl_mat *isl_mat_set_element_si(__isl_take isl_mat *mat, if (row < 0 || row >= mat->n_row) isl_die(mat->ctx, isl_error_invalid, "row out of range", goto error); - if (col < 0 || col >= mat->n_col) - isl_die(mat->ctx, isl_error_invalid, "column out of range", - goto error); + if (check_col(mat, col) < 0) + return isl_mat_free(mat); isl_int_set_si(mat->row[row][col], v); return mat; error: @@ -365,6 +373,22 @@ __isl_give isl_mat *isl_mat_diag(isl_ctx *ctx, unsigned n_row, isl_int d) return mat; } +/* Create an "n_row" by "n_col" matrix with zero elements. + */ +__isl_give isl_mat *isl_mat_zero(isl_ctx *ctx, unsigned n_row, unsigned n_col) +{ + int i; + isl_mat *mat; + + mat = isl_mat_alloc(ctx, n_row, n_col); + if (!mat) + return NULL; + for (i = 0; i < n_row; ++i) + isl_seq_clr(mat->row[i], n_col); + + return mat; +} + __isl_give isl_mat *isl_mat_identity(isl_ctx *ctx, unsigned n_row) { if (!ctx) @@ -1522,6 +1546,50 @@ void isl_mat_col_mul(struct isl_mat *mat, int dst_col, isl_int f, int src_col) isl_int_mul(mat->row[i][dst_col], f, mat->row[i][src_col]); } +/* Add "f" times column "src_col" to column "dst_col" of "mat" and + * return the result. + */ +__isl_give isl_mat *isl_mat_col_addmul(__isl_take isl_mat *mat, int dst_col, + isl_int f, int src_col) +{ + int i; + + if (check_col(mat, dst_col) < 0 || check_col(mat, src_col) < 0) + return isl_mat_free(mat); + + for (i = 0; i < mat->n_row; ++i) { + if (isl_int_is_zero(mat->row[i][src_col])) + continue; + mat = isl_mat_cow(mat); + if (!mat) + return NULL; + isl_int_addmul(mat->row[i][dst_col], f, mat->row[i][src_col]); + } + + return mat; +} + +/* Negate column "col" of "mat" and return the result. + */ +__isl_give isl_mat *isl_mat_col_neg(__isl_take isl_mat *mat, int col) +{ + int i; + + if (check_col(mat, col) < 0) + return isl_mat_free(mat); + + for (i = 0; i < mat->n_row; ++i) { + if (isl_int_is_zero(mat->row[i][col])) + continue; + mat = isl_mat_cow(mat); + if (!mat) + return NULL; + isl_int_neg(mat->row[i][col], mat->row[i][col]); + } + + return mat; +} + struct isl_mat *isl_mat_unimodular_complete(struct isl_mat *M, int row) { int r; diff --git a/polly/lib/External/isl/isl_mat_private.h b/polly/lib/External/isl/isl_mat_private.h index 197106f..d2dcc9e 100644 --- a/polly/lib/External/isl/isl_mat_private.h +++ b/polly/lib/External/isl/isl_mat_private.h @@ -22,6 +22,7 @@ struct isl_mat { uint32_t isl_mat_get_hash(__isl_keep isl_mat *mat); +__isl_give isl_mat *isl_mat_zero(isl_ctx *ctx, unsigned n_row, unsigned n_col); __isl_give isl_mat *isl_mat_sub_alloc(__isl_keep isl_mat *mat, unsigned first_row, unsigned n_row, unsigned first_col, unsigned n_col); __isl_give isl_mat *isl_mat_sub_alloc6(isl_ctx *ctx, isl_int **row, @@ -45,6 +46,9 @@ isl_stat isl_mat_row_gcd(__isl_keep isl_mat *mat, int row, isl_int *gcd); void isl_mat_col_mul(struct isl_mat *mat, int dst_col, isl_int f, int src_col); void isl_mat_col_submul(struct isl_mat *mat, int dst_col, isl_int f, int src_col); +__isl_give isl_mat *isl_mat_col_addmul(__isl_take isl_mat *mat, int dst_col, + isl_int f, int src_col); +__isl_give isl_mat *isl_mat_col_neg(__isl_take isl_mat *mat, int col); int isl_mat_get_element(__isl_keep isl_mat *mat, int row, int col, isl_int *v); __isl_give isl_mat *isl_mat_set_element(__isl_take isl_mat *mat, diff --git a/polly/lib/External/isl/isl_polynomial.c b/polly/lib/External/isl/isl_polynomial.c index 3772abf..6bf19b5 100644 --- a/polly/lib/External/isl/isl_polynomial.c +++ b/polly/lib/External/isl/isl_polynomial.c @@ -449,6 +449,21 @@ __isl_give isl_space *isl_qpolynomial_get_space(__isl_keep isl_qpolynomial *qp) return space; } +/* Return the number of variables of the given type in the domain of "qp". + */ +unsigned isl_qpolynomial_domain_dim(__isl_keep isl_qpolynomial *qp, + enum isl_dim_type type) +{ + if (!qp) + return 0; + if (type == isl_dim_div) + return qp->div->n_row; + if (type == isl_dim_all) + return isl_space_dim(qp->dim, isl_dim_all) + + isl_qpolynomial_domain_dim(qp, isl_dim_div); + return isl_space_dim(qp->dim, type); +} + /* Externally, an isl_qpolynomial has a map space, but internally, the * ls field corresponds to the domain of that space. */ @@ -461,7 +476,28 @@ unsigned isl_qpolynomial_dim(__isl_keep isl_qpolynomial *qp, return 1; if (type == isl_dim_in) type = isl_dim_set; - return isl_space_dim(qp->dim, type); + return isl_qpolynomial_domain_dim(qp, type); +} + +/* Return the offset of the first coefficient of type "type" in + * the domain of "qp". + */ +unsigned isl_qpolynomial_domain_offset(__isl_keep isl_qpolynomial *qp, + enum isl_dim_type type) +{ + if (!qp) + return 0; + switch (type) { + case isl_dim_cst: + return 0; + case isl_dim_param: + case isl_dim_set: + return 1 + isl_space_offset(qp->dim, type); + case isl_dim_div: + return 1 + isl_space_dim(qp->dim, isl_dim_all); + default: + return 0; + } } isl_bool isl_qpolynomial_is_zero(__isl_keep isl_qpolynomial *qp) @@ -2238,11 +2274,11 @@ static __isl_give isl_qpolynomial *substitute_non_divs( * inside the division, so we need to add floor(e/d) * x outside. * That is, we replace q by q' + floor(e/d) * x and we therefore need * to adjust the coefficient of x in each later div that depends on the - * current div "div" and also in the affine expression "aff" - * (if it too depends on "div"). + * current div "div" and also in the affine expressions in the rows of "mat" + * (if they too depend on "div"). */ static void reduce_div(__isl_keep isl_qpolynomial *qp, int div, - __isl_keep isl_vec *aff) + __isl_keep isl_mat **mat) { int i, j; isl_int v; @@ -2256,8 +2292,7 @@ static void reduce_div(__isl_keep isl_qpolynomial *qp, int div, isl_int_fdiv_q(v, qp->div->row[div][1 + i], qp->div->row[div][0]); isl_int_fdiv_r(qp->div->row[div][1 + i], qp->div->row[div][1 + i], qp->div->row[div][0]); - if (!isl_int_is_zero(aff->el[1 + total + div])) - isl_int_addmul(aff->el[i], v, aff->el[1 + total + div]); + *mat = isl_mat_col_addmul(*mat, i, v, 1 + total + div); for (j = div + 1; j < qp->div->n_row; ++j) { if (isl_int_is_zero(qp->div->row[j][2 + total + div])) continue; @@ -2297,11 +2332,11 @@ static int needs_invert(__isl_keep isl_mat *div, int row) /* Replace div "div" q = [e/d] by -[(-e+(d-1))/d]. * We only invert the coefficients of e (and the coefficient of q in - * later divs and in "aff"). After calling this function, the + * later divs and in the rows of "mat"). After calling this function, the * coefficients of e should be reduced again. */ static void invert_div(__isl_keep isl_qpolynomial *qp, int div, - __isl_keep isl_vec *aff) + __isl_keep isl_mat **mat) { unsigned total = qp->div->n_col - qp->div->n_row - 2; @@ -2310,15 +2345,18 @@ static void invert_div(__isl_keep isl_qpolynomial *qp, int div, isl_int_sub_ui(qp->div->row[div][1], qp->div->row[div][1], 1); isl_int_add(qp->div->row[div][1], qp->div->row[div][1], qp->div->row[div][0]); - if (!isl_int_is_zero(aff->el[1 + total + div])) - isl_int_neg(aff->el[1 + total + div], aff->el[1 + total + div]); + *mat = isl_mat_col_neg(*mat, 1 + total + div); isl_mat_col_mul(qp->div, 2 + total + div, qp->div->ctx->negone, 2 + total + div); } -/* Assuming "qp" is a monomial, reduce all its divs to have coefficients +/* Reduce all divs of "qp" to have coefficients * in the interval [0, d-1], with d the denominator and such that the * last non-zero coefficient that is not equal to d/2 is smaller than d/2. + * The modifications to the integer divisions need to be reflected + * in the factors of the polynomial that refer to the original + * integer divisions. To this end, the modifications are collected + * as a set of affine expressions and then plugged into the polynomial. * * After the reduction, some divs may have become redundant or identical, * so we call substitute_non_divs and sort_divs. If these functions @@ -2329,48 +2367,58 @@ static void invert_div(__isl_keep isl_qpolynomial *qp, int div, static __isl_give isl_qpolynomial *reduce_divs(__isl_take isl_qpolynomial *qp) { int i; - isl_vec *aff = NULL; - struct isl_upoly *s; - unsigned n_div; + isl_ctx *ctx; + isl_mat *mat; + struct isl_upoly **s; + unsigned o_div, n_div, total; if (!qp) return NULL; - aff = isl_vec_alloc(qp->div->ctx, qp->div->n_col - 1); - aff = isl_vec_clr(aff); - if (!aff) - goto error; + total = isl_qpolynomial_domain_dim(qp, isl_dim_all); + n_div = isl_qpolynomial_domain_dim(qp, isl_dim_div); + o_div = isl_qpolynomial_domain_offset(qp, isl_dim_div); + ctx = isl_qpolynomial_get_ctx(qp); + mat = isl_mat_zero(ctx, n_div, 1 + total); - isl_int_set_si(aff->el[1 + qp->upoly->var], 1); + for (i = 0; i < n_div; ++i) + mat = isl_mat_set_element_si(mat, i, o_div + i, 1); for (i = 0; i < qp->div->n_row; ++i) { normalize_div(qp, i); - reduce_div(qp, i, aff); + reduce_div(qp, i, &mat); if (needs_invert(qp->div, i)) { - invert_div(qp, i, aff); - reduce_div(qp, i, aff); + invert_div(qp, i, &mat); + reduce_div(qp, i, &mat); } } + if (!mat) + goto error; - s = isl_upoly_from_affine(qp->div->ctx, aff->el, - qp->div->ctx->one, aff->size); - qp->upoly = isl_upoly_subs(qp->upoly, qp->upoly->var, 1, &s); - isl_upoly_free(s); + s = isl_alloc_array(ctx, struct isl_upoly *, n_div); + if (n_div && !s) + goto error; + for (i = 0; i < n_div; ++i) + s[i] = isl_upoly_from_affine(ctx, mat->row[i], ctx->one, + 1 + total); + qp->upoly = isl_upoly_subs(qp->upoly, o_div - 1, n_div, s); + for (i = 0; i < n_div; ++i) + isl_upoly_free(s[i]); + free(s); if (!qp->upoly) goto error; - isl_vec_free(aff); + isl_mat_free(mat); - n_div = qp->div->n_row; qp = substitute_non_divs(qp); qp = sort_divs(qp); - if (qp && qp->div->n_row < n_div) + if (qp && isl_qpolynomial_domain_dim(qp, isl_dim_div) < n_div) return reduce_divs(qp); return qp; error: isl_qpolynomial_free(qp); - isl_vec_free(aff); + isl_mat_free(mat); return NULL; } @@ -2628,6 +2676,12 @@ __isl_give isl_qpolynomial *isl_qpolynomial_set_dim_name( qp = isl_qpolynomial_cow(qp); if (!qp) return NULL; + if (type == isl_dim_out) + isl_die(isl_qpolynomial_get_ctx(qp), isl_error_invalid, + "cannot set name of output/set dimension", + return isl_qpolynomial_free(qp)); + if (type == isl_dim_in) + type = isl_dim_set; qp->dim = isl_space_set_dim_name(qp->dim, type, pos, s); if (!qp->dim) goto error; @@ -3031,15 +3085,35 @@ error: return NULL; } +/* Evaluate "qp" in the void point "pnt". + * In particular, return the value NaN. + */ +static __isl_give isl_val *eval_void(__isl_take isl_qpolynomial *qp, + __isl_take isl_point *pnt) +{ + isl_ctx *ctx; + + ctx = isl_point_get_ctx(pnt); + isl_qpolynomial_free(qp); + isl_point_free(pnt); + return isl_val_nan(ctx); +} + __isl_give isl_val *isl_qpolynomial_eval(__isl_take isl_qpolynomial *qp, __isl_take isl_point *pnt) { + isl_bool is_void; isl_vec *ext; isl_val *v; if (!qp || !pnt) goto error; isl_assert(pnt->dim->ctx, isl_space_is_equal(pnt->dim, qp->dim), goto error); + is_void = isl_point_is_void(pnt); + if (is_void < 0) + goto error; + if (is_void) + return eval_void(qp, pnt); if (qp->div->n_row == 0) ext = isl_vec_copy(pnt->vec); diff --git a/polly/lib/External/isl/isl_polynomial_private.h b/polly/lib/External/isl/isl_polynomial_private.h index 17b1a2d..24ef7bd 100644 --- a/polly/lib/External/isl/isl_polynomial_private.h +++ b/polly/lib/External/isl/isl_polynomial_private.h @@ -134,6 +134,9 @@ int isl_qpolynomial_is_affine(__isl_keep isl_qpolynomial *qp); int isl_qpolynomial_is_cst(__isl_keep isl_qpolynomial *qp, isl_int *n, isl_int *d); +unsigned isl_qpolynomial_domain_offset(__isl_keep isl_qpolynomial *qp, + enum isl_dim_type type); + __isl_give isl_qpolynomial *isl_qpolynomial_add_on_domain( __isl_keep isl_set *dom, __isl_take isl_qpolynomial *qp1, diff --git a/polly/lib/External/isl/isl_srcdir.c.in b/polly/lib/External/isl/isl_srcdir.c.in new file mode 100644 index 0000000..38e30c5 --- /dev/null +++ b/polly/lib/External/isl/isl_srcdir.c.in @@ -0,0 +1 @@ +static const char *srcdir = "@srcdir@"; diff --git a/polly/lib/External/isl/isl_test.c b/polly/lib/External/isl/isl_test.c index d02452e..3353c3d 100644 --- a/polly/lib/External/isl/isl_test.c +++ b/polly/lib/External/isl/isl_test.c @@ -32,16 +32,16 @@ #include #include #include -#include +#include #include #include #include #include #include -#define ARRAY_SIZE(array) (sizeof(array)/sizeof(*array)) +#include "isl_srcdir.c" -static char *srcdir; +#define ARRAY_SIZE(array) (sizeof(array)/sizeof(*array)) static char *get_filename(isl_ctx *ctx, const char *name, const char *suffix) { char *filename; @@ -4970,7 +4970,7 @@ int test_union_pw(isl_ctx *ctx) /* Test that isl_union_pw_qpolynomial_eval picks up the function * defined over the correct domain space. */ -static int test_eval(isl_ctx *ctx) +static int test_eval_1(isl_ctx *ctx) { const char *str; isl_point *pnt; @@ -4996,6 +4996,45 @@ static int test_eval(isl_ctx *ctx) return 0; } +/* Check that isl_qpolynomial_eval handles getting called on a void point. + */ +static int test_eval_2(isl_ctx *ctx) +{ + const char *str; + isl_point *pnt; + isl_set *set; + isl_qpolynomial *qp; + isl_val *v; + isl_bool ok; + + str = "{ A[x] -> [x] }"; + qp = isl_qpolynomial_from_aff(isl_aff_read_from_str(ctx, str)); + str = "{ A[x] : false }"; + set = isl_set_read_from_str(ctx, str); + pnt = isl_set_sample_point(set); + v = isl_qpolynomial_eval(qp, pnt); + ok = isl_val_is_nan(v); + isl_val_free(v); + + if (ok < 0) + return -1; + if (!ok) + isl_die(ctx, isl_error_unknown, "expecting NaN", return -1); + + return 0; +} + +/* Perform basic polynomial evaluation tests. + */ +static int test_eval(isl_ctx *ctx) +{ + if (test_eval_1(ctx) < 0) + return -1; + if (test_eval_2(ctx) < 0) + return -1; + return 0; +} + /* Descriptions of sets that are tested for reparsing after printing. */ const char *output_tests[] = { @@ -6675,6 +6714,94 @@ static int test_universe(isl_ctx *ctx) return 0; } +/* Sets for which chambers are computed and checked. + */ +const char *chambers_tests[] = { + "[A, B, C] -> { [x, y, z] : x >= 0 and y >= 0 and y <= A - x and " + "z >= 0 and z <= C - y and z <= B - x - y }", +}; + +/* Add the domain of "cell" to "cells". + */ +static int add_cell(__isl_take isl_cell *cell, void *user) +{ + isl_basic_set_list **cells = user; + isl_basic_set *dom; + + dom = isl_cell_get_domain(cell); + isl_cell_free(cell); + *cells = isl_basic_set_list_add(*cells, dom); + + return *cells ? 0 : -1; +} + +/* Check that the elements of "list" are pairwise disjoint. + */ +static isl_stat check_pairwise_disjoint(__isl_keep isl_basic_set_list *list) +{ + int i, j, n; + + if (!list) + return isl_stat_error; + + n = isl_basic_set_list_n_basic_set(list); + for (i = 0; i < n; ++i) { + isl_basic_set *bset_i; + + bset_i = isl_basic_set_list_get_basic_set(list, i); + for (j = i + 1; j < n; ++j) { + isl_basic_set *bset_j; + isl_bool disjoint; + + bset_j = isl_basic_set_list_get_basic_set(list, j); + disjoint = isl_basic_set_is_disjoint(bset_i, bset_j); + isl_basic_set_free(bset_j); + if (!disjoint) + isl_die(isl_basic_set_list_get_ctx(list), + isl_error_unknown, "not disjoint", + break); + if (disjoint < 0 || !disjoint) + break; + } + isl_basic_set_free(bset_i); + if (j < n) + return isl_stat_error; + } + + return isl_stat_ok; +} + +/* Check that the chambers computed by isl_vertices_foreach_disjoint_cell + * are pairwise disjoint. + */ +static int test_chambers(isl_ctx *ctx) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(chambers_tests); ++i) { + isl_basic_set *bset; + isl_vertices *vertices; + isl_basic_set_list *cells; + isl_stat ok; + + bset = isl_basic_set_read_from_str(ctx, chambers_tests[i]); + vertices = isl_basic_set_compute_vertices(bset); + cells = isl_basic_set_list_alloc(ctx, 0); + if (isl_vertices_foreach_disjoint_cell(vertices, &add_cell, + &cells) < 0) + cells = isl_basic_set_list_free(cells); + ok = check_pairwise_disjoint(cells); + isl_basic_set_list_free(cells); + isl_vertices_free(vertices); + isl_basic_set_free(bset); + + if (ok < 0) + return -1; + } + + return 0; +} + struct { const char *name; int (*fn)(isl_ctx *ctx); @@ -6706,6 +6833,7 @@ struct { { "sample", &test_sample }, { "output", &test_output }, { "vertices", &test_vertices }, + { "chambers", &test_chambers }, { "fixed", &test_fixed }, { "equal", &test_equal }, { "disjoint", &test_disjoint }, @@ -6754,9 +6882,6 @@ int main(int argc, char **argv) struct isl_ctx *ctx; struct isl_options *options; - srcdir = getenv("srcdir"); - assert(srcdir); - options = isl_options_new_with_defaults(); assert(options); argc = isl_options_parse(options, argc, argv, ISL_ARG_ALL); diff --git a/polly/lib/External/isl/isl_vertices.c b/polly/lib/External/isl/isl_vertices.c index baf9e28..011cda1 100644 --- a/polly/lib/External/isl/isl_vertices.c +++ b/polly/lib/External/isl/isl_vertices.c @@ -1145,7 +1145,7 @@ static struct isl_tab *tab_for_shifted_cone(__isl_keep isl_basic_set *bset) if (!bset) return NULL; - tab = isl_tab_alloc(bset->ctx, bset->n_ineq + 1, + tab = isl_tab_alloc(bset->ctx, bset->n_eq + bset->n_ineq + 1, 1 + isl_basic_set_total_dim(bset), 0); if (!tab) return NULL; @@ -1217,13 +1217,15 @@ static __isl_give isl_vec *isl_basic_set_interior_point( * * We pick an interior point from one of the chambers and then make * all constraints that do not satisfy this point strict. + * For constraints that saturate the interior point, the sign + * of the first non-zero coefficient is used to determine which + * of the two (internal) constraints should be tightened. */ int isl_vertices_foreach_disjoint_cell(__isl_keep isl_vertices *vertices, int (*fn)(__isl_take isl_cell *cell, void *user), void *user) { - int i, j; + int i; isl_vec *vec; - isl_int v; isl_cell *cell; if (!vertices) @@ -1245,21 +1247,11 @@ int isl_vertices_foreach_disjoint_cell(__isl_keep isl_vertices *vertices, if (!vec) return -1; - isl_int_init(v); - for (i = 0; i < vertices->n_chambers; ++i) { int r; isl_basic_set *dom = isl_basic_set_copy(vertices->c[i].dom); - dom = isl_basic_set_cow(dom); - if (!dom) - goto error; - for (j = 0; i && j < dom->n_ineq; ++j) { - isl_seq_inner_product(vec->el, dom->ineq[j], vec->size, - &v); - if (!isl_int_is_neg(v)) - continue; - isl_int_sub_ui(dom->ineq[j][0], dom->ineq[j][0], 1); - } + if (i) + dom = isl_basic_set_tighten_outward(dom, vec); dom = isl_basic_set_set_integral(dom); cell = isl_cell_alloc(isl_vertices_copy(vertices), dom, i); if (!cell) @@ -1269,12 +1261,10 @@ int isl_vertices_foreach_disjoint_cell(__isl_keep isl_vertices *vertices, goto error; } - isl_int_clear(v); isl_vec_free(vec); return 0; error: - isl_int_clear(v); isl_vec_free(vec); return -1; } diff --git a/polly/lib/External/isl/ltmain.sh b/polly/lib/External/isl/ltmain.sh index 2ad8be8..147d758 100644 --- a/polly/lib/External/isl/ltmain.sh +++ b/polly/lib/External/isl/ltmain.sh @@ -31,7 +31,7 @@ PROGRAM=libtool PACKAGE=libtool -VERSION="2.4.6 Debian-2.4.6-1" +VERSION="2.4.6 Debian-2.4.6-0.1" package_revision=2.4.6 @@ -1977,7 +1977,7 @@ func_version () # End: # Set a version string. -scriptversion='(GNU libtool) 2.4.6 Debian-2.4.6-1' +scriptversion='(GNU libtool) 2.4.6' # func_echo ARG... @@ -2068,7 +2068,7 @@ include the following information: compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) - version: $progname $scriptversion + version: $progname (GNU libtool) 2.4.6 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` diff --git a/polly/lib/External/isl/m4/libtool.m4 b/polly/lib/External/isl/m4/libtool.m4 index ee80844..10ab2844 100644 --- a/polly/lib/External/isl/m4/libtool.m4 +++ b/polly/lib/External/isl/m4/libtool.m4 @@ -728,6 +728,7 @@ _LT_CONFIG_SAVE_COMMANDS([ cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. diff --git a/polly/lib/External/isl/pip_test.sh.in b/polly/lib/External/isl/pip_test.sh.in index 549a80f..5f36b77 100755 --- a/polly/lib/External/isl/pip_test.sh.in +++ b/polly/lib/External/isl/pip_test.sh.in @@ -1,6 +1,7 @@ #!/bin/sh EXEEXT=@EXEEXT@ +srcdir=@srcdir@ PIP_TESTS="\ boulet.pip \ diff --git a/polly/lib/External/isl_srcdir.c.cmake b/polly/lib/External/isl_srcdir.c.cmake new file mode 100644 index 0000000..34ef890 --- /dev/null +++ b/polly/lib/External/isl_srcdir.c.cmake @@ -0,0 +1 @@ +static const char *srcdir = "@ISL_SOURCE_DIR@"; -- 2.7.4