From efbbef81c5a9b3e1305eceaeeb3262bc32a3d6aa Mon Sep 17 00:00:00 2001 From: Tobias Grosser Date: Thu, 22 Dec 2016 23:08:57 +0000 Subject: [PATCH] Update isl to isl-0.18-9-gd4734f3 git-svn-id: https://llvm.org/svn/llvm-project/polly/trunk@290389 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/External/isl/AUTHORS | 3 +- lib/External/isl/ChangeLog | 10 ++ lib/External/isl/GIT_HEAD_ID | 2 +- lib/External/isl/config.guess | 111 ++++++++------- lib/External/isl/config.sub | 20 +-- lib/External/isl/configure | 23 ++-- lib/External/isl/configure.ac | 4 +- lib/External/isl/doc/manual.pdf | Bin 475429 -> 475433 bytes lib/External/isl/include/isl/ast_build.h | 12 +- lib/External/isl/isl_affine_hull.c | 2 +- lib/External/isl/isl_coalesce.c | 5 +- lib/External/isl/isl_convex_hull.c | 13 +- lib/External/isl/isl_equalities.c | 3 +- lib/External/isl/isl_map.c | 3 + lib/External/isl/isl_output.c | 225 ++++++++++++++++--------------- lib/External/isl/isl_schedule_tree.c | 3 + lib/External/isl/isl_scheduler.c | 3 + lib/External/isl/isl_tab.c | 61 ++++++++- lib/External/isl/isl_tab.h | 1 + lib/External/isl/isl_test.c | 61 +++++++++ lib/External/isl/ltmain.sh | 6 +- lib/External/isl/m4/libtool.m4 | 1 - 22 files changed, 370 insertions(+), 202 deletions(-) diff --git a/lib/External/isl/AUTHORS b/lib/External/isl/AUTHORS index 671a2413..975d5b63 100644 --- a/lib/External/isl/AUTHORS +++ b/lib/External/isl/AUTHORS @@ -23,7 +23,7 @@ isl was written by Domaine de Voluceau - Rocquencourt, B.P. 105 78153 Le Chesnay France -2015 Polly Labs +2015-2016 Polly Labs Contributions by @@ -38,6 +38,7 @@ Andreas Kloeckner Michael Kruse Sebastian Pop Louis-Noel Pouchet +Benoit Pradelle Uday Kumar Reddy Andreas Simbuerger Sven van Haastregt diff --git a/lib/External/isl/ChangeLog b/lib/External/isl/ChangeLog index 14ff1b49..249acdf3 100644 --- a/lib/External/isl/ChangeLog +++ b/lib/External/isl/ChangeLog @@ -1,3 +1,13 @@ +version: 0.18 +date: Sun Dec 18 11:01:58 CET 2016 +changes: + - improve elimination of redundant existentially quantified variables + - improve coalescing + - improve parametric integer programming + - preserve isolate option in isl_schedule_node_band_split + - print AST nodes in YAML format + - minor improvements to Python bindings +--- version: 0.17.1 date: Fri May 6 12:02:48 CEST 2016 changes: diff --git a/lib/External/isl/GIT_HEAD_ID b/lib/External/isl/GIT_HEAD_ID index 7ec49141..1c16ff73 100644 --- a/lib/External/isl/GIT_HEAD_ID +++ b/lib/External/isl/GIT_HEAD_ID @@ -1 +1 @@ -isl-0.17.1-314-g3106e8d +isl-0.18-9-gd4734f3 diff --git a/lib/External/isl/config.guess b/lib/External/isl/config.guess index 16592509..0967f2af 100755 --- a/lib/External/isl/config.guess +++ b/lib/External/isl/config.guess @@ -1,8 +1,8 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2015 Free Software Foundation, Inc. +# Copyright 1992-2016 Free Software Foundation, Inc. -timestamp='2015-08-20' +timestamp='2016-04-02' # 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='2015-08-20' # 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;hb=HEAD +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . @@ -50,7 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2015 Free Software Foundation, Inc. +Copyright 1992-2016 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,6 +237,10 @@ 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 ;; @@ -268,42 +272,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 @@ -376,16 +380,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/[^.]*//'` @@ -410,7 +414,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} @@ -635,13 +639,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 @@ -680,11 +684,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 @@ -697,12 +701,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} @@ -807,14 +811,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:*:*) @@ -896,7 +900,7 @@ EOF exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix @@ -919,7 +923,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:*:*) @@ -965,6 +969,9 @@ 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 ;; @@ -1120,7 +1127,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 configury will decide that + # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; @@ -1269,6 +1276,9 @@ 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 ;; @@ -1282,9 +1292,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 @@ -1306,7 +1316,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 @@ -1337,7 +1347,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" @@ -1379,7 +1389,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 @@ -1390,6 +1400,9 @@ EOF x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; esac cat >&2 <. # @@ -590,8 +590,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='isl' PACKAGE_TARNAME='isl' -PACKAGE_VERSION='0.17.1' -PACKAGE_STRING='isl 0.17.1' +PACKAGE_VERSION='0.18' +PACKAGE_STRING='isl 0.18' PACKAGE_BUGREPORT='isl-development@googlegroups.com' PACKAGE_URL='' @@ -1375,7 +1375,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures isl 0.17.1 to adapt to many kinds of systems. +\`configure' configures isl 0.18 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1446,7 +1446,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of isl 0.17.1:";; + short | recursive ) echo "Configuration of isl 0.18:";; esac cat <<\_ACEOF @@ -1576,7 +1576,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -isl configure 0.17.1 +isl configure 0.18 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2471,7 +2471,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by isl $as_me 0.17.1, which was +It was created by isl $as_me 0.18, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3335,7 +3335,7 @@ fi # Define the identity of the package. PACKAGE='isl' - VERSION='0.17.1' + VERSION='0.18' cat >>confdefs.h <<_ACEOF @@ -3468,7 +3468,7 @@ fi AM_BACKSLASH='\' -versioninfo=17:1:2 +versioninfo=18:0:3 if test "x$prefix" != "xNONE"; then prefix_wd=`cd $prefix && pwd` @@ -19855,7 +19855,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by isl $as_me 0.17.1, which was +This file was extended by isl $as_me 0.18, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -19921,7 +19921,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -isl config.status 0.17.1 +isl config.status 0.18 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -21186,7 +21186,6 @@ $as_echo X"$file" | 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/lib/External/isl/configure.ac b/lib/External/isl/configure.ac index b6da64dd..fabcf061 100644 --- a/lib/External/isl/configure.ac +++ b/lib/External/isl/configure.ac @@ -1,10 +1,10 @@ -AC_INIT([isl], [0.17.1], [isl-development@googlegroups.com]) +AC_INIT([isl], [0.18], [isl-development@googlegroups.com]) AC_CONFIG_AUX_DIR([.]) AC_CONFIG_MACRO_DIR([m4]) AM_INIT_AUTOMAKE([foreign]) m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) AC_SUBST(versioninfo) -versioninfo=17:1:2 +versioninfo=18:0:3 if test "x$prefix" != "xNONE"; then prefix_wd=`cd $prefix && pwd` diff --git a/lib/External/isl/doc/manual.pdf b/lib/External/isl/doc/manual.pdf index fb5e04309033a168e912847962d603f047be6c07..026db436006e7452baec47e4f87e7d894c59f665 100644 GIT binary patch delta 14252 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 m{I`%?BHtl~ZpOs9=x5i^? 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 @@ -2364,6 +2366,7 @@ static enum isl_change coalesce_with_expanded_divs( init_status(info_i); bmap = isl_basic_map_copy(bmap); bmap = isl_basic_map_expand_divs(bmap, isl_mat_copy(div), exp); + bmap = isl_basic_map_mark_final(bmap); if (!bmap) goto error; diff --git a/lib/External/isl/isl_convex_hull.c b/lib/External/isl/isl_convex_hull.c index e61139f2..2be7187b 100644 --- a/lib/External/isl/isl_convex_hull.c +++ b/lib/External/isl/isl_convex_hull.c @@ -86,7 +86,12 @@ int isl_basic_set_constraint_is_redundant(struct isl_basic_set **bset, * Since some constraints may be mutually redundant, sort the constraints * first such that constraints that involve existentially quantified * variables are considered for removal before those that do not. - * The sorting is also need for the use in map_simple_hull. + * The sorting is also needed for the use in map_simple_hull. + * + * Note that isl_tab_detect_implicit_equalities may also end up + * marking some constraints as redundant. Make sure the constraints + * are preserved and undo those marking such that isl_tab_detect_redundant + * can consider the constraints in the sorted order. * * Alternatively, we could have intersected the basic map with the * corresponding equality and then checked if the dimension was that @@ -110,8 +115,14 @@ __isl_give isl_basic_map *isl_basic_map_remove_redundancies( bmap = isl_basic_map_sort_constraints(bmap); tab = isl_tab_from_basic_map(bmap, 0); + if (!tab) + goto error; + tab->preserve = 1; if (isl_tab_detect_implicit_equalities(tab) < 0) goto error; + if (isl_tab_restore_redundant(tab) < 0) + goto error; + tab->preserve = 0; if (isl_tab_detect_redundant(tab) < 0) goto error; bmap = isl_basic_map_update_from_tab(bmap, tab); diff --git a/lib/External/isl/isl_equalities.c b/lib/External/isl/isl_equalities.c index caefd527..07b053e9 100644 --- a/lib/External/isl/isl_equalities.c +++ b/lib/External/isl/isl_equalities.c @@ -689,7 +689,8 @@ static struct isl_basic_set *compress_variables( isl_mat_free(*T2); *T2 = NULL; } - return isl_basic_set_set_to_empty(bset); + bset = isl_basic_set_set_to_empty(bset); + return return_with_identity(bset, T, T2); } bset = isl_basic_set_preimage(bset, T ? isl_mat_copy(TC) : TC); diff --git a/lib/External/isl/isl_map.c b/lib/External/isl/isl_map.c index 27eff8e7..5d22aa2d 100644 --- a/lib/External/isl/isl_map.c +++ b/lib/External/isl/isl_map.c @@ -3,6 +3,7 @@ * Copyright 2010 INRIA Saclay * Copyright 2012-2014 Ecole Normale Superieure * Copyright 2014 INRIA Rocquencourt + * Copyright 2016 INRIA Paris * Copyright 2016 Sven Verdoolaege * * Use of this software is governed by the MIT license @@ -14,6 +15,8 @@ * and Ecole Normale Superieure, 45 rue d’Ulm, 75230 Paris, France * and Inria Paris - Rocquencourt, Domaine de Voluceau - Rocquencourt, * B.P. 105 - 78153 Le Chesnay, France + * and Centre de Recherche Inria de Paris, 2 rue Simone Iff - Voie DQ12, + * CS 42112, 75589 Paris Cedex 12, France */ #include diff --git a/lib/External/isl/isl_output.c b/lib/External/isl/isl_output.c index c9c0265c..a5fb4599 100644 --- a/lib/External/isl/isl_output.c +++ b/lib/External/isl/isl_output.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -729,24 +730,52 @@ static __isl_give isl_printer *print_div_list(__isl_take isl_printer *p, return p; } -/* Does printing "bmap" require an "exists" clause? +/* Does printing an object with local variables described by "div" + * require an "exists" clause? * That is, are there any local variables without an explicit representation? + * An exists clause is also needed in "dump" mode because + * explicit div representations are not printed inline in that case. */ -static isl_bool need_exists(__isl_keep isl_printer *p, - __isl_keep isl_basic_map *bmap, __isl_keep isl_mat *div) +static isl_bool need_exists(__isl_keep isl_printer *p, __isl_keep isl_mat *div) { - int i; + int i, n; - if (!p || !bmap) + if (!p || !div) return isl_bool_error; - if (bmap->n_div == 0) + n = isl_mat_rows(div); + if (n == 0) return isl_bool_false; - for (i = 0; i < bmap->n_div; ++i) + if (p->dump) + return isl_bool_true; + for (i = 0; i < n; ++i) if (!can_print_div_expr(p, div, i)) return isl_bool_true; return isl_bool_false; } +/* Print the start of an exists clause, i.e., + * + * (exists variables: + * + * In dump mode, local variables with an explicit definition are printed + * as well because they will not be printed inline. + */ +static __isl_give isl_printer *open_exists(__isl_take isl_printer *p, + __isl_keep isl_space *space, __isl_keep isl_mat *div, int latex) +{ + int dump; + + if (!p) + return NULL; + + dump = p->dump; + p = isl_printer_print_str(p, s_open_exists[latex]); + p = print_div_list(p, space, div, latex, dump); + p = isl_printer_print_str(p, ": "); + + return p; +} + /* Print the constraints of "bmap" to "p". * The names of the variables are taken from "space". * "latex" is set if the constraints should be printed in LaTeX format. @@ -763,15 +792,9 @@ static __isl_give isl_printer *print_disjunct(__isl_keep isl_basic_map *bmap, return NULL; dump = p->dump; div = isl_basic_map_get_divs(bmap); - if (dump) - exists = bmap->n_div > 0; - else - exists = need_exists(p, bmap, div); - if (exists >= 0 && exists) { - p = isl_printer_print_str(p, s_open_exists[latex]); - p = print_div_list(p, space, div, latex, dump); - p = isl_printer_print_str(p, ": "); - } + exists = need_exists(p, div); + if (exists >= 0 && exists) + p = open_exists(p, space, div, latex); if (dump) div = isl_mat_free(div); @@ -851,6 +874,23 @@ static __isl_give isl_printer *isl_set_print_omega(__isl_keep isl_set *set, return p; } +/* Print the list of parameters in "space", followed by an arrow, to "p", + * if there are any parameters. + */ +static __isl_give isl_printer *print_param_tuple(__isl_take isl_printer *p, + __isl_keep isl_space *space, struct isl_print_space_data *data) +{ + if (!p || !space) + return isl_printer_free(p); + if (isl_space_dim(space, isl_dim_param) == 0) + return p; + + p = print_tuple(space, p, isl_dim_param, data); + p = isl_printer_print_str(p, s_to[data->latex]); + + return p; +} + static __isl_give isl_printer *isl_basic_map_print_isl( __isl_keep isl_basic_map *bmap, __isl_take isl_printer *p, int latex) @@ -858,10 +898,7 @@ static __isl_give isl_printer *isl_basic_map_print_isl( struct isl_print_space_data data = { .latex = latex }; int rational = ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL); - if (isl_basic_map_dim(bmap, isl_dim_param) > 0) { - p = print_tuple(bmap->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, bmap->dim, &data); p = isl_printer_print_str(p, "{ "); p = isl_print_space(bmap->dim, p, rational, &data); p = isl_printer_print_str(p, " : "); @@ -1224,10 +1261,7 @@ static __isl_give isl_printer *isl_map_print_isl(__isl_keep isl_map *map, { struct isl_print_space_data data = { 0 }; - if (isl_map_dim(map, isl_dim_param) > 0) { - p = print_tuple(map->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, s_to[0]); - } + p = print_param_tuple(p, map->dim, &data); p = isl_printer_print_str(p, s_open_set[0]); p = isl_map_print_isl_body(map, p); p = isl_printer_print_str(p, s_close_set[0]); @@ -1240,10 +1274,7 @@ static __isl_give isl_printer *print_latex_map(__isl_keep isl_map *map, struct isl_print_space_data data = { 0 }; data.latex = 1; - if (isl_map_dim(map, isl_dim_param) > 0) { - p = print_tuple(map->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, s_to[1]); - } + p = print_param_tuple(p, map->dim, &data); p = isl_printer_print_str(p, s_open_set[1]); data.print_dim = &print_dim_eq; data.user = aff; @@ -1383,14 +1414,11 @@ static __isl_give isl_printer *isl_union_map_print_isl( { struct isl_union_print_data data; struct isl_print_space_data space_data = { 0 }; - isl_space *dim; + isl_space *space; - dim = isl_union_map_get_space(umap); - if (isl_space_dim(dim, isl_dim_param) > 0) { - p = print_tuple(dim, p, isl_dim_param, &space_data); - p = isl_printer_print_str(p, s_to[0]); - } - isl_space_free(dim); + space = isl_union_map_get_space(umap); + p = print_param_tuple(p, space, &space_data); + isl_space_free(space); p = isl_printer_print_str(p, s_open_set[0]); data.p = p; data.first = 1; @@ -1612,10 +1640,7 @@ static __isl_give isl_printer *print_qpolynomial_isl(__isl_take isl_printer *p, if (!p || !qp) goto error; - if (isl_space_dim(qp->dim, isl_dim_param) > 0) { - p = print_tuple(qp->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, qp->dim, &data); p = isl_printer_print_str(p, "{ "); if (!isl_space_is_params(qp->dim)) { p = isl_print_space(qp->dim, p, 0, &data); @@ -1757,10 +1782,7 @@ static __isl_give isl_printer *print_pw_qpolynomial_isl( if (!p || !pwqp) goto error; - if (isl_space_dim(pwqp->dim, isl_dim_param) > 0) { - p = print_tuple(pwqp->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, pwqp->dim, &data); p = isl_printer_print_str(p, "{ "); if (pwqp->n == 0) { if (!isl_space_is_set(pwqp->dim)) { @@ -1821,10 +1843,7 @@ static __isl_give isl_printer *print_pw_qpolynomial_fold_isl( { struct isl_print_space_data data = { 0 }; - if (isl_space_dim(pwf->dim, isl_dim_param) > 0) { - p = print_tuple(pwf->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, pwf->dim, &data); p = isl_printer_print_str(p, "{ "); if (pwf->n == 0) { if (!isl_space_is_set(pwf->dim)) { @@ -2063,14 +2082,11 @@ static __isl_give isl_printer *print_union_pw_qpolynomial_isl( { struct isl_union_print_data data; struct isl_print_space_data space_data = { 0 }; - isl_space *dim; + isl_space *space; - dim = isl_union_pw_qpolynomial_get_space(upwqp); - if (isl_space_dim(dim, isl_dim_param) > 0) { - p = print_tuple(dim, p, isl_dim_param, &space_data); - p = isl_printer_print_str(p, " -> "); - } - isl_space_free(dim); + space = isl_union_pw_qpolynomial_get_space(upwqp); + p = print_param_tuple(p, space, &space_data); + isl_space_free(space); p = isl_printer_print_str(p, "{ "); data.p = p; data.first = 1; @@ -2208,14 +2224,11 @@ static __isl_give isl_printer *print_union_pw_qpolynomial_fold_isl( { struct isl_union_print_data data; struct isl_print_space_data space_data = { 0 }; - isl_space *dim; + isl_space *space; - dim = isl_union_pw_qpolynomial_fold_get_space(upwf); - if (isl_space_dim(dim, isl_dim_param) > 0) { - p = print_tuple(dim, p, isl_dim_param, &space_data); - p = isl_printer_print_str(p, " -> "); - } - isl_space_free(dim); + space = isl_union_pw_qpolynomial_fold_get_space(upwf); + p = print_param_tuple(p, space, &space_data); + isl_space_free(space); p = isl_printer_print_str(p, "{ "); data.p = p; data.first = 1; @@ -2243,17 +2256,43 @@ error: return NULL; } +/* Print the isl_constraint "c" to "p". + */ __isl_give isl_printer *isl_printer_print_constraint(__isl_take isl_printer *p, __isl_keep isl_constraint *c) { - isl_basic_map *bmap; + struct isl_print_space_data data = { 0 }; + isl_local_space *ls; + isl_space *space; + isl_bool exists; if (!p || !c) goto error; - bmap = isl_basic_map_from_constraint(isl_constraint_copy(c)); - p = isl_printer_print_basic_map(p, bmap); - isl_basic_map_free(bmap); + ls = isl_constraint_get_local_space(c); + if (!ls) + return isl_printer_free(p); + space = isl_local_space_get_space(ls); + p = print_param_tuple(p, space, &data); + p = isl_printer_print_str(p, "{ "); + p = isl_print_space(space, p, 0, &data); + p = isl_printer_print_str(p, " : "); + exists = need_exists(p, ls->div); + if (exists < 0) + p = isl_printer_free(p); + if (exists >= 0 && exists) + p = open_exists(p, space, ls->div, 0); + p = print_affine_of_len(space, ls->div, p, c->v->el, c->v->size); + if (isl_constraint_is_equality(c)) + p = isl_printer_print_str(p, " = 0"); + else + p = isl_printer_print_str(p, " >= 0"); + if (exists >= 0 && exists) + p = isl_printer_print_str(p, s_close_exists[0]); + p = isl_printer_print_str(p, " }"); + isl_space_free(space); + isl_local_space_free(ls); + return p; error: isl_printer_free(p); @@ -2268,10 +2307,7 @@ static __isl_give isl_printer *isl_printer_print_space_isl( if (!space) goto error; - if (isl_space_dim(space, isl_dim_param) > 0) { - p = print_tuple(space, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, space, &data); p = isl_printer_print_str(p, "{ "); if (isl_space_is_params(space)) @@ -2310,10 +2346,7 @@ __isl_give isl_printer *isl_printer_print_local_space(__isl_take isl_printer *p, if (!ls) goto error; - if (isl_local_space_dim(ls, isl_dim_param) > 0) { - p = print_tuple(ls->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, ls->dim, &data); p = isl_printer_print_str(p, "{ "); p = isl_print_space(ls->dim, p, 0, &data); n_div = isl_local_space_dim(ls, isl_dim_div); @@ -2379,10 +2412,7 @@ static __isl_give isl_printer *print_aff_isl(__isl_take isl_printer *p, if (!aff) goto error; - if (isl_local_space_dim(aff->ls, isl_dim_param) > 0) { - p = print_tuple(aff->ls->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, aff->ls->dim, &data); p = isl_printer_print_str(p, "{ "); p = print_aff(p, aff); p = isl_printer_print_str(p, " }"); @@ -2425,10 +2455,7 @@ static __isl_give isl_printer *print_pw_aff_isl(__isl_take isl_printer *p, if (!pwaff) goto error; - if (isl_space_dim(pwaff->dim, isl_dim_param) > 0) { - p = print_tuple(pwaff->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, pwaff->dim, &data); p = isl_printer_print_str(p, "{ "); p = print_pw_aff_body(p, pwaff); p = isl_printer_print_str(p, " }"); @@ -2648,10 +2675,7 @@ static __isl_give isl_printer *print_union_pw_aff_isl( isl_space *space; space = isl_union_pw_aff_get_space(upa); - if (isl_space_dim(space, isl_dim_param) > 0) { - p = print_tuple(space, p, isl_dim_param, &data); - p = isl_printer_print_str(p, s_to[0]); - } + p = print_param_tuple(p, space, &data); isl_space_free(space); p = print_union_pw_aff_body(p, upa); return p; @@ -2711,10 +2735,7 @@ static __isl_give isl_printer *print_multi_aff_isl(__isl_take isl_printer *p, if (!maff) goto error; - if (isl_space_dim(maff->space, isl_dim_param) > 0) { - p = print_tuple(maff->space, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, maff->space, &data); p = isl_printer_print_str(p, "{ "); p = print_multi_aff(p, maff); p = isl_printer_print_str(p, " }"); @@ -2771,10 +2792,7 @@ static __isl_give isl_printer *print_pw_multi_aff_isl(__isl_take isl_printer *p, if (!pma) goto error; - if (isl_space_dim(pma->dim, isl_dim_param) > 0) { - p = print_tuple(pma->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, pma->dim, &data); p = isl_printer_print_str(p, "{ "); p = print_pw_multi_aff_body(p, pma); p = isl_printer_print_str(p, " }"); @@ -2873,10 +2891,7 @@ static __isl_give isl_printer *print_union_pw_multi_aff_isl( isl_space *space; space = isl_union_pw_multi_aff_get_space(upma); - if (isl_space_dim(space, isl_dim_param) > 0) { - p = print_tuple(space, p, isl_dim_param, &space_data); - p = isl_printer_print_str(p, s_to[0]); - } + p = print_param_tuple(p, space, &space_data); isl_space_free(space); p = isl_printer_print_str(p, s_open_set[0]); data.p = p; @@ -2955,10 +2970,7 @@ static __isl_give isl_printer *print_multi_pw_aff_isl(__isl_take isl_printer *p, if (!mpa) return isl_printer_free(p); - if (isl_space_dim(mpa->space, isl_dim_param) > 0) { - p = print_tuple(mpa->space, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, mpa->space, &data); p = isl_printer_print_str(p, "{ "); data.print_dim = &print_dim_mpa; data.user = mpa; @@ -3007,10 +3019,7 @@ static __isl_give isl_printer *print_multi_val_isl(__isl_take isl_printer *p, if (!mv) return isl_printer_free(p); - if (isl_space_dim(mv->space, isl_dim_param) > 0) { - p = print_tuple(mv->space, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, mv->space, &data); p = isl_printer_print_str(p, "{ "); data.print_dim = &print_dim_mv; data.user = mv; @@ -3065,11 +3074,7 @@ static __isl_give isl_printer *print_multi_union_pw_aff_isl( isl_space *space; space = isl_multi_union_pw_aff_get_space(mupa); - if (isl_space_dim(space, isl_dim_param) > 0) { - struct isl_print_space_data space_data = { 0 }; - p = print_tuple(space, p, isl_dim_param, &space_data); - p = isl_printer_print_str(p, s_to[0]); - } + p = print_param_tuple(p, space, &data); data.print_dim = &print_union_pw_aff_dim; data.user = mupa; diff --git a/lib/External/isl/isl_schedule_tree.c b/lib/External/isl/isl_schedule_tree.c index b764edd8..1bf08453 100644 --- a/lib/External/isl/isl_schedule_tree.c +++ b/lib/External/isl/isl_schedule_tree.c @@ -1,6 +1,7 @@ /* * Copyright 2013-2014 Ecole Normale Superieure * Copyright 2014 INRIA Rocquencourt + * Copyright 2016 INRIA Paris * * Use of this software is governed by the MIT license * @@ -8,6 +9,8 @@ * Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France * and Inria Paris - Rocquencourt, Domaine de Voluceau - Rocquencourt, * B.P. 105 - 78153 Le Chesnay, France + * and Centre de Recherche Inria de Paris, 2 rue Simone Iff - Voie DQ12, + * CS 42112, 75589 Paris Cedex 12, France */ #include diff --git a/lib/External/isl/isl_scheduler.c b/lib/External/isl/isl_scheduler.c index 709e1ab8..cc4794ca 100644 --- a/lib/External/isl/isl_scheduler.c +++ b/lib/External/isl/isl_scheduler.c @@ -2,6 +2,7 @@ * Copyright 2011 INRIA Saclay * Copyright 2012-2014 Ecole Normale Superieure * Copyright 2015-2016 Sven Verdoolaege + * Copyright 2016 INRIA Paris * * Use of this software is governed by the MIT license * @@ -9,6 +10,8 @@ * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod, * 91893 Orsay, France * and Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France + * and Centre de Recherche Inria de Paris, 2 rue Simone Iff - Voie DQ12, + * CS 42112, 75589 Paris Cedex 12, France */ #include diff --git a/lib/External/isl/isl_tab.c b/lib/External/isl/isl_tab.c index ceaaeff7..e38c7fef 100644 --- a/lib/External/isl/isl_tab.c +++ b/lib/External/isl/isl_tab.c @@ -3378,6 +3378,29 @@ static int ununrestrict(struct isl_tab *tab, struct isl_tab_var *var) return 0; } +/* Unmark the last redundant row in "tab" as being redundant. + * This undoes part of the modifications performed by isl_tab_mark_redundant. + * In particular, remove the redundant mark and make + * sure the sample value respects the constraint again. + * A variable that is marked non-negative by isl_tab_mark_redundant + * is covered by a separate undo record. + */ +static isl_stat restore_last_redundant(struct isl_tab *tab) +{ + struct isl_tab_var *var; + + if (tab->n_redundant < 1) + isl_die(isl_tab_get_ctx(tab), isl_error_internal, + "no redundant rows", return isl_stat_error); + + var = isl_tab_var_from_row(tab, tab->n_redundant - 1); + var->is_redundant = 0; + tab->n_redundant--; + restore_row(tab, var); + + return isl_stat_ok; +} + static int perform_undo_var(struct isl_tab *tab, struct isl_tab_undo *undo) WARN_UNUSED; static int perform_undo_var(struct isl_tab *tab, struct isl_tab_undo *undo) { @@ -3387,10 +3410,10 @@ static int perform_undo_var(struct isl_tab *tab, struct isl_tab_undo *undo) var->is_nonneg = 0; break; case isl_tab_undo_redundant: - var->is_redundant = 0; - tab->n_redundant--; - restore_row(tab, isl_tab_var_from_row(tab, tab->n_redundant)); - break; + if (!var->is_row || var->index != tab->n_redundant - 1) + isl_die(isl_tab_get_ctx(tab), isl_error_internal, + "not undoing last redundant row", return -1); + return restore_last_redundant(tab); case isl_tab_undo_freeze: var->frozen = 0; break; @@ -3429,6 +3452,36 @@ static int perform_undo_var(struct isl_tab *tab, struct isl_tab_undo *undo) return 0; } +/* Restore all rows that have been marked redundant by isl_tab_mark_redundant + * and that have been preserved in the tableau. + * Note that isl_tab_mark_redundant may also have marked some variables + * as being non-negative before marking them redundant. These need + * to be removed as well as otherwise some constraints could end up + * getting marked redundant with respect to the variable. + */ +isl_stat isl_tab_restore_redundant(struct isl_tab *tab) +{ + if (!tab) + return isl_stat_error; + + if (tab->need_undo) + isl_die(isl_tab_get_ctx(tab), isl_error_invalid, + "manually restoring redundant constraints " + "interferes with undo history", + return isl_stat_error); + + while (tab->n_redundant > 0) { + if (tab->row_var[tab->n_redundant - 1] >= 0) { + struct isl_tab_var *var; + + var = isl_tab_var_from_row(tab, tab->n_redundant - 1); + var->is_nonneg = 0; + } + restore_last_redundant(tab); + } + return isl_stat_ok; +} + /* Undo the addition of an integer division to the basic map representation * of "tab" in position "pos". */ diff --git a/lib/External/isl/isl_tab.h b/lib/External/isl/isl_tab.h index afb50a6b..df5642ee 100644 --- a/lib/External/isl/isl_tab.h +++ b/lib/External/isl/isl_tab.h @@ -201,6 +201,7 @@ int isl_tab_detect_implicit_equalities(struct isl_tab *tab) WARN_UNUSED; __isl_give isl_basic_map *isl_tab_make_equalities_explicit(struct isl_tab *tab, __isl_take isl_basic_map *bmap); int isl_tab_detect_redundant(struct isl_tab *tab) WARN_UNUSED; +isl_stat isl_tab_restore_redundant(struct isl_tab *tab); #define ISL_TAB_SAVE_DUAL (1 << 0) enum isl_lp_result isl_tab_min(struct isl_tab *tab, isl_int *f, isl_int denom, isl_int *opt, isl_int *opt_denom, diff --git a/lib/External/isl/isl_test.c b/lib/External/isl/isl_test.c index 3353c3de..1ebfef35 100644 --- a/lib/External/isl/isl_test.c +++ b/lib/External/isl/isl_test.c @@ -2430,6 +2430,33 @@ static int test_min_special(isl_ctx *ctx) return 0; } +/* A specialized isl_set_min_val test case that would return an error + * in earlier versions of isl. + */ +static int test_min_special2(isl_ctx *ctx) +{ + const char *str; + isl_basic_set *bset; + isl_aff *obj; + isl_val *res; + + str = "{ [i, j, k] : 2j = i and 2k = i + 1 and i >= 2 }"; + bset = isl_basic_set_read_from_str(ctx, str); + + obj = isl_aff_read_from_str(ctx, "{ [i, j, k] -> [i] }"); + + res = isl_basic_set_max_val(bset, obj); + + isl_basic_set_free(bset); + isl_aff_free(obj); + isl_val_free(res); + + if (!res) + return -1; + + return 0; +} + struct { const char *set; const char *obj; @@ -2476,6 +2503,8 @@ static int test_min(struct isl_ctx *ctx) if (test_min_special(ctx) < 0) return -1; + if (test_min_special2(ctx) < 0) + return -1; return 0; } @@ -4550,6 +4579,35 @@ int test_aff(isl_ctx *ctx) return 0; } +/* Check that the computation below results in a single expression. + * One or two expressions may result depending on which constraint + * ends up being considered as redundant with respect to the other + * constraints after the projection that is performed internally + * by isl_set_dim_min. + */ +static int test_dim_max_1(isl_ctx *ctx) +{ + const char *str; + isl_set *set; + isl_pw_aff *pa; + int n; + + str = "[n] -> { [a, b] : n >= 0 and 4a >= -4 + n and b >= 0 and " + "-4a <= b <= 3 and b < n - 4a }"; + set = isl_set_read_from_str(ctx, str); + pa = isl_set_dim_min(set, 0); + n = isl_pw_aff_n_piece(pa); + isl_pw_aff_free(pa); + + if (!pa) + return -1; + if (n != 1) + isl_die(ctx, isl_error_unknown, "expecting single expression", + return -1); + + return 0; +} + int test_dim_max(isl_ctx *ctx) { int equal; @@ -4559,6 +4617,9 @@ int test_dim_max(isl_ctx *ctx) isl_map *map; isl_pw_aff *pwaff; + if (test_dim_max_1(ctx) < 0) + return -1; + str = "[N] -> { [i] : 0 <= i <= min(N,10) }"; set = isl_set_read_from_str(ctx, str); pwaff = isl_set_dim_max(set, 0); diff --git a/lib/External/isl/ltmain.sh b/lib/External/isl/ltmain.sh index 147d758a..2ad8be84 100644 --- a/lib/External/isl/ltmain.sh +++ b/lib/External/isl/ltmain.sh @@ -31,7 +31,7 @@ PROGRAM=libtool PACKAGE=libtool -VERSION="2.4.6 Debian-2.4.6-0.1" +VERSION="2.4.6 Debian-2.4.6-1" package_revision=2.4.6 @@ -1977,7 +1977,7 @@ func_version () # End: # Set a version string. -scriptversion='(GNU libtool) 2.4.6' +scriptversion='(GNU libtool) 2.4.6 Debian-2.4.6-1' # func_echo ARG... @@ -2068,7 +2068,7 @@ include the following information: compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) - version: $progname (GNU libtool) 2.4.6 + version: $progname $scriptversion automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` diff --git a/lib/External/isl/m4/libtool.m4 b/lib/External/isl/m4/libtool.m4 index 10ab2844..ee80844b 100644 --- a/lib/External/isl/m4/libtool.m4 +++ b/lib/External/isl/m4/libtool.m4 @@ -728,7 +728,6 @@ _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. -- 2.11.4.GIT